Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Metadata Handling and Manifest Creation for Multi-Architecture Docker Builds #7

Closed
Closed
63 changes: 31 additions & 32 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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

Expand All @@ -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'

Expand All @@ -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
Expand All @@ -100,19 +99,20 @@ jobs:
if: github.event_name != 'pull_request'
needs:
- build

steps:
- name: Download digests
uses: actions/download-artifact@v4
with:
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
Expand All @@ -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 ' *)
Loading