diff options
-rw-r--r-- | .gitlab-ci.yml | 127 | ||||
-rw-r--r-- | Dockerfile.in | 2 | ||||
-rw-r--r-- | README.md | 12 | ||||
-rwxr-xr-x | dabuild.in | 5 | ||||
-rwxr-xr-x | make_images.sh | 78 |
5 files changed, 214 insertions, 10 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..a6099d3 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,127 @@ +image: alpinelinux/docker-cli + +stages: + - build + - push + - manifest + - cleanup + +# Build jobs + +.build: + stage: build + only: + changes: + - Dockerfile.in + - make_images.sh + - entrypoint.sh + +build-v3.8: + extends: .build + script: + - ./make_images.sh build v3.8 + +build-v3.9: + extends: .build + script: + - ./make_images.sh build v3.9 + +build-v3.10: + extends: .build + script: + - ./make_images.sh build v3.10 + +build-v.3.11: + extends: .build + script: + - ./make_images.sh build v3.11 + +build-edge: + extends: .build + script: + - ./make_images.sh build edge + +# Push jobs + +.push: + stage: push + only: + changes: + - Dockerfile.in + - make_images.sh + - entrypoint.sh + +push-v3.8: + extends: .push + script: + - ./make_images.sh push v3.8 + +push-v3.9: + extends: .push + script: + - ./make_images.sh push v3.9 + +push-v3.10: + extends: .push + script: + - ./make_images.sh push v3.10 + +push-v.3.11: + extends: .push + script: + - ./make_images.sh push v3.11 + +push-edge: + extends: .push + script: + - ./make_images.sh push edge + +# Manifest jobs + +.manifest: + stage: manifest + variables: + DOCKER_CLI_EXPERIMENTAL: enabled + only: + changes: + - Dockerfile.in + - make_images.sh + - entrypoint.sh + +manifest-v3.8: + extends: .manifest + script: + - ./make_images.sh manifest v3.8 + +manifest-v3.9: + extends: .manifest + script: + - ./make_images.sh manifest v3.9 + +manifest-v3.10: + extends: .manifest + script: + - ./make_images.sh manifest v3.10 + +manifest-v3.11: + extends: .manifest + script: + - ./make_images.sh manifest v3.11 + +manifest-edge: + extends: .manifest + script: + - ./make_images.sh manifest edge + +# cleanup images/layers + +cleanup: + stage: cleanup + script: + - docker system prune --force + only: + changes: + - Dockerfile.in + - make_images.sh + - entrypoint.sh + diff --git a/Dockerfile.in b/Dockerfile.in index 4da02eb..1b0424f 100644 --- a/Dockerfile.in +++ b/Dockerfile.in @@ -1,4 +1,4 @@ -FROM alpine:%%ALPINE_TAG%% +FROM %%ALPINE_IMG%%/alpine:%%ALPINE_TAG%% MAINTAINER Richard Mortier <mort@cantab.net> RUN rm /etc/apk/repositories && \ @@ -20,15 +20,9 @@ When invoked, `dabuild` simply passes any flags through to `abuild` running in a ## Supported architectures -Currently supported architectures are (as reported by `uname -m`): - - * `x86` - * `x86_64` - * `aarch64` - * `armv6` - * `armv7` - * `armv7l` - * `armv8` +Currently supported architectures are: + +`aarch64`, `armhf`, `armv7`, `ppc64le`, `s390x`, `x86`, `x86_64` ## Configuration @@ -86,6 +86,11 @@ if [ -w "/var/cache/distfiles" ]; then ABUILD_VOLUMES="$ABUILD_VOLUMES -v /var/cache/distfiles:/var/cache/distfiles" fi +# pass over gitconfig for abuild-keygen +if [ -f "$HOME/.gitconfig" ]; then + ABUILD_VOLUMES="$ABUILD_VOLUMES -v $HOME/.gitconfig:/home/builder/.gitconfig" +fi + if [ "$DABUILD_CACHE" = "true" ]; then for v in %%ABUILD_VOLUMES%% ; do vol=abuild-$ABUILD_VERSION-$DABUILD_ARCH-${v//\//_} diff --git a/make_images.sh b/make_images.sh new file mode 100755 index 0000000..4fe9212 --- /dev/null +++ b/make_images.sh @@ -0,0 +1,78 @@ +#!/bin/sh + +set -eu + +readonly NAMESPACE="${NAMESPACE:=alpinelinux}" +readonly PROJECT="${PROJECT:=docker-abuild}" +readonly ARCHES="${ARCHES:=x86 x86_64 armhf armv7 aarch64 ppc64le s390x}" +readonly TEMPLATE="Dockerfile.in" + +readonly OPERATION="$1" +readonly RELEASE="$2" + +die() { + echo "$1" >&2 + exit 1 +} + +arch_to_image() { + case $1 in + armv7) echo arm32v7 ;; + aarch64) echo arm64v8 ;; + x86_64) echo amd64 ;; + armhf) echo arm32v6 ;; + x86) echo i386 ;; + ppc64le) echo ppc64le ;; + s390x) echo s390x ;; + *) die "Unknown arch detected: \"$1\"" + esac +} + +build() { + for arch in $ARCHES; do + [ "$RELEASE" = "v3.8" ] && [ "$arch" = "armv7" ] && continue + sed -e "s/%%ALPINE_IMG%%/$(arch_to_image $arch)/" \ + -e "s/%%ALPINE_TAG%%/${RELEASE/v/}/" \ + -e "s/%%ALPINE_REL%%/$RELEASE/" "$TEMPLATE" > Dockerfile + docker build --no-cache -t "$NAMESPACE/$PROJECT:${RELEASE/v/}-$arch" . || \ + die "Failed to build docker-abuild:${RELEASE/v/}-$arch" + done +} + +push() { + printf "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" \ + --password-stdin || die "Failed to login to docker hub" + + for arch in $ARCHES; do + [ "$RELEASE" = "v3.8" ] && [ "$arch" = "armv7" ] && continue + docker push "$NAMESPACE/$PROJECT:${RELEASE/v/}-$arch" || \ + die "Failed to push docker-abuild:${RELEASE/v/}-$arch" + done +} + +manifest() { + local images= arch= + + printf "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" \ + --password-stdin || die "Failed to login to docker hub" + + for arch in $ARCHES; do + [ "$RELEASE" = "v3.8" ] && [ "$arch" = "armv7" ] && continue + images="$images $NAMESPACE/$PROJECT:${RELEASE/v/}-$arch" + done + + docker manifest create --amend "$NAMESPACE/$PROJECT" $images || \ + die "Failed to create manifest" + docker manifest push --purge "$NAMESPACE/$PROJECT" || \ + die "Failed to push manifest" +} + +[ "$RELEASE" ] || die "Second argument needs to be a alpine release" + +case $OPERATION in + build) build ;; + push) push ;; + manifest) manifest ;; + *) die "First argument needs to be build|push|manifest" ;; +esac + |