From 3d2de04dd1c9cb03bd01554b6019ea2695254638 Mon Sep 17 00:00:00 2001 From: Steven Rafferty Date: Tue, 24 Feb 2026 18:27:11 +0000 Subject: [PATCH] refactor(ci): restructure Docker workflow to support multi-platform builds and digest management --- .github/workflows/docker-publish.yml | 94 +++++++++++++++++++++++----- 1 file changed, 78 insertions(+), 16 deletions(-) diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index f9064c0e15..04291b1156 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -8,9 +8,65 @@ permissions: contents: read jobs: - docker: - name: Build & Push Docker Image + build: + name: Build (${{ matrix.platform }}) + runs-on: ${{ matrix.runner }} + strategy: + fail-fast: false + matrix: + include: + - platform: linux/amd64 + platform_pair: linux-amd64 + runner: ubuntu-latest + - platform: linux/arm64 + platform_pair: linux-arm64 + runner: ubuntu-24.04-arm + env: + IMAGE_NAME: diegosouzapw/omniroute + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and push by digest + id: build + uses: docker/build-push-action@v6 + with: + context: . + target: runner-base + platforms: ${{ matrix.platform }} + outputs: type=image,name=${{ env.IMAGE_NAME }},push-by-digest=true,name-canonical=true,push=true + cache-from: type=gha,scope=omniroute-runner-base-${{ matrix.platform_pair }} + cache-to: type=gha,mode=max,scope=omniroute-runner-base-${{ matrix.platform_pair }} + + - name: Export digest + run: | + mkdir -p "${{ runner.temp }}/digests" + digest="${{ steps.build.outputs.digest }}" + touch "${{ runner.temp }}/digests/${digest#sha256:}" + + - name: Upload digest + uses: actions/upload-artifact@v4 + with: + name: digests-${{ matrix.platform_pair }} + path: ${{ runner.temp }}/digests/* + if-no-files-found: error + retention-days: 1 + + merge: + name: Merge manifest and publish tags runs-on: ubuntu-latest + needs: build + env: + IMAGE_NAME: diegosouzapw/omniroute steps: - name: Checkout uses: actions/checkout@v6 @@ -23,8 +79,12 @@ jobs: echo "version=$VERSION" >> "$GITHUB_OUTPUT" echo "Publishing Docker image version: $VERSION" - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 + - name: Download digests + uses: actions/download-artifact@v4 + with: + path: ${{ runner.temp }}/digests + pattern: digests-* + merge-multiple: true - name: Login to Docker Hub uses: docker/login-action@v3 @@ -32,18 +92,20 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Build and push - uses: docker/build-push-action@v6 - with: - context: . - target: runner-base - push: true - tags: | - diegosouzapw/omniroute:${{ steps.version.outputs.version }} - diegosouzapw/omniroute:latest - cache-from: type=gha - cache-to: type=gha,mode=max - platforms: linux/amd64 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Create manifest list and push + working-directory: ${{ runner.temp }}/digests + run: | + docker buildx imagetools create \ + -t "${{ env.IMAGE_NAME }}:${{ steps.version.outputs.version }}" \ + -t "${{ env.IMAGE_NAME }}:latest" \ + $(printf '${{ env.IMAGE_NAME }}@sha256:%s ' *) + + - name: Inspect image + run: | + docker buildx imagetools inspect "${{ env.IMAGE_NAME }}:${{ steps.version.outputs.version }}" - name: Update Docker Hub description uses: peter-evans/dockerhub-description@v5