diff --git a/.github/workflows/ci-docker.yml b/.github/workflows/ci-docker.yml index 317204b5..e0198ef5 100644 --- a/.github/workflows/ci-docker.yml +++ b/.github/workflows/ci-docker.yml @@ -13,13 +13,17 @@ permissions: jobs: docker: - runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-latest + arch: amd64 + runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 https://github.com/actions/checkout/releases/tag/v4.2.2 with: fetch-depth: '0' - - name: qemu - uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0 https://github.com/docker/setup-qemu-action/releases/tag/v3.6.0 - uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1 https://github.com/docker/setup-buildx-action/releases/tag/v3.11.1 - id: meta uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5.7.0 https://github.com/docker/metadata-action/releases/tag/v5.7.0 @@ -30,7 +34,6 @@ jobs: with: context: . push: false - ### TODO: test multiple platforms - # platforms: linux/amd64,linux/arm64 + platforms: linux/${{ matrix.arch }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 4e5af45d..a12346a4 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -101,7 +101,15 @@ jobs: subject-path: '${{ env.APPLICATION_NAME }}' build-images: - runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-latest + arch: amd64 + - os: ubuntu-24.04-arm + arch: arm64 + runs-on: ${{ matrix.os }} needs: [create-draft-release] permissions: actions: write @@ -117,8 +125,6 @@ jobs: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 https://github.com/actions/checkout/releases/tag/v4.2.2 with: fetch-depth: 0 - - name: Set up QEMU - uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0 https://github.com/docker/setup-qemu-action/releases/tag/v3.6.0 - name: Set up Docker Buildx uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1 https://github.com/docker/setup-buildx-action/releases/tag/v3.11.1 - name: Login to Docker Hub @@ -138,6 +144,9 @@ jobs: images: | blinklabs/dingo ghcr.io/${{ github.repository }} + flavor: | + latest=false + suffix=-${{ matrix.arch }} tags: | # Only version, no revision type=match,pattern=v(.*)-(.*),group=1 @@ -150,7 +159,7 @@ jobs: uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 https://github.com/docker/build-push-action/releases/tag/v6.18.0 with: outputs: "type=registry,push=true" - platforms: linux/amd64,linux/arm64 + platforms: linux/${{ matrix.arch }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} - name: Attest Docker Hub image @@ -165,6 +174,52 @@ jobs: subject-name: ghcr.io/${{ github.repository }} subject-digest: ${{ steps.push.outputs.digest }} push-to-registry: true + + build-image-manifest: + needs: [build-images] + permissions: + contents: read + packages: write + runs-on: ubuntu-latest + steps: + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: blinklabs + password: ${{ secrets.DOCKER_PASSWORD }} # uses token + - name: Login to GHCR + uses: docker/login-action@v3 + with: + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + registry: ghcr.io + - id: meta + uses: docker/metadata-action@v5 + with: + images: | + blinklabs/dingo + ghcr.io/${{ github.repository }} + flavor: | + latest=false + tags: | + # Only version, no revision + type=match,pattern=v(.*)-(.*),group=1 + # branch + type=ref,event=branch + # semver + type=semver,pattern={{version}} + - name: manifest-create + shell: bash + run: | + for t in `echo '${{ steps.meta.outputs.tags }}'`; do + # Extract the underlying manifests from each manifests list and create a new single manifest list + docker manifest create ${t} \ + $(docker manifest inspect ${t}-amd64 | jq -r '.manifests[] | .digest' | sed -e "s|^|${t%:*}@|") \ + $(docker manifest inspect ${t}-arm64 | jq -r '.manifests[] | .digest' | sed -e "s|^|${t%:*}@|") + docker manifest push ${t} + done + # Checkout repo so README.md is available for next step + - uses: actions/checkout@v4 # Update Docker Hub from README - name: Docker Hub Description uses: peter-evans/dockerhub-description@432a30c9e07499fd01da9f8a49f0faf9e0ca5b77 # v4.0.2 https://github.com/peter-evans/dockerhub-description/releases/tag/v4.0.2 @@ -179,7 +234,7 @@ jobs: runs-on: ubuntu-latest permissions: contents: write - needs: [create-draft-release, build-binaries, build-images] + needs: [create-draft-release, build-binaries, build-images, build-image-manifest] steps: - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 https://github.com/actions/github-script/releases/tag/v7.0.1 if: startsWith(github.ref, 'refs/tags/')