diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 779b1d2..d76c636 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,19 +23,19 @@ env: GHCR_SLUG: ghcr.io/crazy-max/osxcross jobs: - build: + prepare: runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - variant: - - ubuntu - - debian - - alpine + outputs: + matrix: ${{ steps.platforms.outputs.matrix }} steps: - name: Checkout uses: actions/checkout@v4 + - + name: Create matrix + id: platforms + run: | + echo "matrix=$(docker buildx bake image-all --print | jq -cr '.target."image-all".platforms')" >>${GITHUB_OUTPUT} - name: Docker meta id: meta @@ -59,12 +59,51 @@ jobs: labels: | org.opencontainers.image.title=MacOSX cross toolchain (${{ matrix.variant }}) org.opencontainers.image.vendor=CrazyMax + - + name: Rename meta bake definition file + run: | + mv "${{ steps.meta.outputs.bake-file }}" "/tmp/bake-meta.json" + - + name: Upload meta bake definition + uses: actions/upload-artifact@v4 + with: + name: bake-meta + path: /tmp/bake-meta.json + if-no-files-found: error + retention-days: 1 + + build: + runs-on: ubuntu-latest + needs: + - prepare + strategy: + fail-fast: false + matrix: + variant: + - ubuntu + - debian + - alpine + platform: ${{ fromJson(needs.prepare.outputs.matrix) }} + steps: + - + name: Prepare + run: | + platform=${{ matrix.platform }} + echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV + - + name: Download meta bake definition + uses: actions/download-artifact@v4 + with: + name: bake-meta + path: /tmp - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 + with: + buildkitd-flags: --debug - name: Login to DockerHub if: github.event_name != 'pull_request' @@ -82,15 +121,90 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} - name: Build ${{ matrix.variant }} + id: bake uses: docker/bake-action@v5 with: + source: "{{defaultContext}}" files: | ./docker-bake.hcl - ${{ steps.meta.outputs.bake-file }} - targets: image-all + cwd:///tmp/bake-meta.json + targets: image set: | - *.cache-from=type=gha,scope=${{ matrix.variant }} - *.cache-to=type=gha,scope=${{ matrix.variant }},mode=max - push: ${{ github.event_name != 'pull_request' }} + *.tags= + *.platform=${{ matrix.platform }} + *.cache-from=type=gha,scope=${{ matrix.variant }}-${{ env.PLATFORM_PAIR }} + *.cache-to=type=gha,scope=${{ matrix.variant }}-${{ env.PLATFORM_PAIR }},mode=max,repository=${{ github.repository }},ghtoken=${{ secrets.GITHUB_TOKEN }} + *.output=type=image,"name=${{ env.DOCKERHUB_SLUG }},${{ env.GHCR_SLUG }}",push-by-digest=true,name-canonical=true,push=${{ github.event_name != 'pull_request' }} env: BASE_VARIANT: ${{ matrix.variant }} + - + name: Export digest + run: | + mkdir -p /tmp/digests + digest="${{ fromJSON(steps.bake.outputs.metadata).image['containerimage.digest'] }}" + touch "/tmp/digests/${digest#sha256:}" + - + name: Upload digest + uses: actions/upload-artifact@v4 + with: + name: digests-${{ matrix.variant }}-${{ env.PLATFORM_PAIR }} + path: /tmp/digests/* + if-no-files-found: error + retention-days: 1 + + merge: + runs-on: ubuntu-latest + if: github.event_name != 'pull_request' + needs: + - build + strategy: + fail-fast: false + matrix: + variant: + - ubuntu + - debian + - alpine + steps: + - + name: Download meta bake definition + uses: actions/download-artifact@v4 + with: + name: bake-meta + path: /tmp + - + name: Download digests + uses: actions/download-artifact@v4 + with: + path: /tmp/digests + pattern: digests-${{ matrix.variant }}-* + merge-multiple: true + - + name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - + name: Login to DockerHub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + - + name: Login to GHCR + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + - + name: Create manifest list and push + working-directory: /tmp/digests + run: | + docker buildx imagetools create $(jq -cr '.target."docker-metadata-action".tags | map(select(startswith("${{ env.DOCKERHUB_SLUG }}")) | "-t " + .) | join(" ")' /tmp/bake-meta.json) \ + $(printf '${{ env.DOCKERHUB_SLUG }}@sha256:%s ' *) + docker buildx imagetools create $(jq -cr '.target."docker-metadata-action".tags | map(select(startswith("${{ env.GHCR_SLUG }}")) | "-t " + .) | join(" ")' /tmp/bake-meta.json) \ + $(printf '${{ env.GHCR_SLUG }}@sha256:%s ' *) + - + name: Inspect image + run: | + tag=$(jq -r '.target."docker-metadata-action".args.DOCKER_META_VERSION' /tmp/bake-meta.json) + docker buildx imagetools inspect ${{ env.DOCKERHUB_SLUG }}:${tag} + docker buildx imagetools inspect ${{ env.GHCR_SLUG }}:${tag}