diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bdfbdd8..8db3bf9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -25,6 +25,10 @@ concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true +env: + REGISTRY: ghcr.io + REGISTRY_IMAGE: ghcr.io/${{ github.repository }} + permissions: contents: write packages: write @@ -96,6 +100,17 @@ jobs: name: Build Docker images runs-on: ubuntu-latest needs: test + strategy: + fail-fast: true + matrix: + platform: + - linux/386 + - linux/amd64 + - linux/amd64/v2 + - linux/amd64/v3 + - linux/arm/v6 + - linux/arm/v7 + - linux/arm64 steps: - name: Checkout uses: actions/checkout@v4 @@ -105,7 +120,7 @@ jobs: - name: Login to GitHub Container Registry uses: docker/login-action@v3 with: - registry: ghcr.io + registry: ${{ env.REGISTRY }} username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} @@ -113,7 +128,7 @@ jobs: id: meta uses: docker/metadata-action@v5 with: - images: ghcr.io/nuxencs/seasonpackarr + images: ${{ env.REGISTRY_IMAGE }} tags: | type=semver,pattern={{version}},prefix=v type=semver,pattern={{major}}.{{minor}},prefix=v @@ -128,15 +143,17 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 + - name: Supported Architectures + run: docker buildx ls + - name: Build and publish image id: docker_build uses: docker/build-push-action@v5 with: context: . file: ./ci.Dockerfile - platforms: linux/amd64,linux/arm/v7,linux/arm64/v8 - push: ${{ github.event.pull_request.head.repo.full_name == 'nuxencs/seasonpackarr' || github.event_name != 'pull_request' }} - tags: ${{ steps.meta.outputs.tags }} + platforms: ${{ matrix.platform }} + outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=${{ (github.event.pull_request.head.repo.full_name == github.repository || github.event_name != 'pull_request') && 'true' || 'false' }} labels: ${{ steps.meta.outputs.labels }} build-args: | BUILDTIME=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.created'] }} @@ -146,5 +163,64 @@ jobs: cache-to: type=gha,mode=max provenance: false - - name: Image digest - run: echo ${{ steps.docker_build.outputs.digest }} + - name: Export image digest + id: digest-prep + run: | + mkdir -p /tmp/digests + digest="${{ steps.docker_build.outputs.digest }}" + echo "manifest-hash=${digest#sha256:}" >> "$GITHUB_OUTPUT" + touch "/tmp/digests/${digest#sha256:}" + + - name: Upload image digest + uses: actions/upload-artifact@v4 + with: + name: docker-digests-${{ steps.digest-prep.outputs.manifest-hash }} + path: /tmp/digests/* + if-no-files-found: error + retention-days: 1 + + docker-merge: + name: Publish Docker multi-arch manifest + if: ${{ github.event.pull_request.head.repo.full_name == github.repository || github.event_name != 'pull_request' }} + runs-on: ubuntu-latest + needs: [docker, test] + steps: + - name: Download image digests + uses: actions/download-artifact@v4 + with: + path: /tmp/digests + pattern: docker-digests-* + merge-multiple: true + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY_IMAGE }} + tags: | + type=semver,pattern={{version}},prefix=v + type=semver,pattern={{major}}.{{minor}},prefix=v + type=ref,event=branch + type=ref,event=pr + flavor: | + latest=auto + + - name: Create manifest list and push + working-directory: /tmp/digests + run: | + docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + $(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *) + + - name: Inspect image + run: | + docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }} \ No newline at end of file diff --git a/ci.Dockerfile b/ci.Dockerfile index 89df7de..f3ce06a 100644 --- a/ci.Dockerfile +++ b/ci.Dockerfile @@ -6,7 +6,7 @@ WORKDIR /src ARG VERSION=dev \ REVISION=dev \ BUILDTIME \ - TARGETOS TARGETARCH + TARGETOS TARGETARCH TARGETVARIANT COPY go.mod go.sum ./ RUN go mod download @@ -14,9 +14,14 @@ COPY . ./ # build seasonpackarr FROM --platform=$BUILDPLATFORM app-base AS seasonpackarr - -RUN --mount=target=. \ - GOOS=$TARGETOS GOARCH=$TARGETARCH go build -ldflags "-s -w -X main.version=${VERSION} -X main.commit=${REVISION} -X main.date=${BUILDTIME}" -o /out/bin/seasonpackarr cmd/seasonpackarr/main.go +RUN --network=none --mount=target=. \ +export GOOS=$TARGETOS; \ +export GOARCH=$TARGETARCH; \ +[[ "$GOARCH" == "amd64" ]] && export GOAMD64=$TARGETVARIANT; \ +[[ "$GOARCH" == "arm" ]] && [[ "$TARGETVARIANT" == "v6" ]] && export GOARM=6; \ +[[ "$GOARCH" == "arm" ]] && [[ "$TARGETVARIANT" == "v7" ]] && export GOARM=7; \ +echo $GOARCH $GOOS $GOARM$GOAMD64; \ +go build -ldflags "-s -w -X main.version=${VERSION} -X main.commit=${REVISION} -X main.date=${BUILDTIME}" -o /out/bin/seasonpackarr cmd/seasonpackarr/main.go # build runner FROM alpine:latest as RUNNER