diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 246e383..6993561 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,10 +8,6 @@ on: tags: - 'v*.*.*' -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true - env: REGISTRY_IMAGE: metacall/guix GUIX_VERSION: 1.4.0 @@ -21,30 +17,35 @@ jobs: build: name: Build the Docker image runs-on: ubuntu-latest + strategy: fail-fast: false matrix: platform: [ { docker: linux/amd64, guix: x86_64-linux }, - { docker: linux/386, guix: i686-linux }, - + { docker: linux/386, guix: i686-linux } # TODO: - - # guix error: cloning builder process: Invalid argument (https://lists.gnu.org/archive/html/help-guix/2017-12/msg00023.html) - # { docker: linux/arm/v7, guix: armhf-linux }, - - # ERROR: failed to solve: ResourceExhausted: process "/bin/sh -c sh -c '/entry-point.sh guix pull ..." did not complete successfully: cannot allocate memory - # { docker: linux/arm64/v8, guix: aarch64-linux }, + # { docker: linux/arm/v7, guix: armhf-linux }, # Issue: Invalid argument + # { docker: linux/arm64/v8, guix: aarch64-linux }, # Issue: Cannot allocate memory # { docker: linux/ppc64le, guix: powerpc64le-linux } ] - steps: + steps: + - name: Prepare + run: | + platform=${{ matrix.platform.docker }} + echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV + - name: Docker meta id: meta uses: docker/metadata-action@v5 with: images: ${{ env.REGISTRY_IMAGE }} - + tags: | + type=ref,event=branch + type=ref,event=tag + type=sha + - name: Set up QEMU uses: docker/setup-qemu-action@v3 @@ -55,7 +56,7 @@ jobs: - name: Verify Docker BuildX Version run: docker buildx version - + - name: Create a new builder instance run: docker buildx create --use --name insecure-builder --buildkitd-flags '--allow-insecure-entitlement security.insecure' @@ -70,26 +71,24 @@ jobs: id: build uses: docker/build-push-action@v6 with: - platforms: ${{ matrix.docker.platform }} + platforms: ${{ matrix.platform.docker }} labels: ${{ steps.meta.outputs.labels }} - outputs: type=image,name=docker.io/${{ env.REGISTRY_IMAGE }},push-by-digest=${{ github.event_name != 'pull_request' }},name-canonical=true,push=${{ github.event_name != 'pull_request' }} + outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true allow: security.insecure build-args: | METACALL_GUIX_VERSION=${{ env.GUIX_VERSION }} METACALL_GUIX_ARCH=${{ matrix.platform.guix }} - + - name: Export digest - if: github.event_name != 'pull_request' run: | mkdir -p /tmp/digests digest="${{ steps.build.outputs.digest }}" touch "/tmp/digests/${digest#sha256:}" - + - name: Upload digest - if: github.event_name != 'pull_request' uses: actions/upload-artifact@v4 with: - name: digests-${{ matrix.platform.guix }} + name: digests-${{ env.PLATFORM_PAIR }} path: /tmp/digests/* if-no-files-found: error retention-days: 1 @@ -100,6 +99,7 @@ jobs: if: github.event_name != 'pull_request' needs: - build + steps: - name: Download digests uses: actions/download-artifact@v4 @@ -107,12 +107,12 @@ jobs: path: /tmp/digests pattern: digests-* merge-multiple: true - + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 with: version: v${{ env.BUILDKIT_VERSION }} - + - name: Docker meta id: meta uses: docker/metadata-action@v5 @@ -124,14 +124,13 @@ jobs: with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - + - name: Create manifest list and push working-directory: /tmp/digests - shell: bash - run: | - set -exuo pipefail - 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 }} + echo 'Meta output JSON: ${{ toJson(steps.meta.outputs.json) }}' + TAGS=$(echo '${{ steps.meta.outputs.json }}' | jq -r '.tags[]') + TAG_ARGS=$(echo "$TAGS" | sed 's/^/--tag /') + docker buildx imagetools create \ + $TAG_ARGS \ + $(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *)