From d582e142f4fbe79a993402f19a83468afaf5a8d8 Mon Sep 17 00:00:00 2001 From: Ahmed Allam Date: Sun, 2 Aug 2026 14:49:22 +0000 Subject: [PATCH] ci: publish the sandbox image with buildx for amd64 and arm64 --- .github/workflows/sandbox-image.yml | 112 ++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 .github/workflows/sandbox-image.yml diff --git a/.github/workflows/sandbox-image.yml b/.github/workflows/sandbox-image.yml new file mode 100644 index 00000000..338f73db --- /dev/null +++ b/.github/workflows/sandbox-image.yml @@ -0,0 +1,112 @@ +name: Sandbox Image + +on: + workflow_dispatch: + inputs: + tag: + description: 'Image tag to publish (e.g. 1.2.0)' + required: true + latest: + description: 'Also tag as latest' + type: boolean + default: true + +permissions: + contents: read + +env: + IMAGE: ghcr.io/${{ github.repository_owner }}/strix-sandbox + +jobs: + build: + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-22.04 + platform: linux/amd64 + - os: ubuntu-22.04-arm + platform: linux/arm64 + + runs-on: ${{ matrix.os }} + permissions: + contents: read + packages: write + + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + + - uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0 + + - uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push by digest + id: build + uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0 + with: + context: . + file: containers/Dockerfile + platforms: ${{ matrix.platform }} + provenance: mode=max + sbom: true + outputs: type=image,name=${{ env.IMAGE }},push-by-digest=true,name-canonical=true,push=true + + - name: Export digest + env: + DIGEST: ${{ steps.build.outputs.digest }} + run: | + set -euo pipefail + mkdir -p /tmp/digests + touch "/tmp/digests/${DIGEST#sha256:}" + + - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: digest-${{ runner.arch }} + path: /tmp/digests/* + if-no-files-found: error + retention-days: 1 + + publish: + needs: build + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + path: /tmp/digests + pattern: digest-* + merge-multiple: true + + - uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0 + + - uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Create manifest list + env: + TAG: ${{ inputs.tag }} + ALSO_LATEST: ${{ inputs.latest }} + run: | + set -euo pipefail + tags=(-t "${IMAGE}:${TAG}") + if [ "${ALSO_LATEST}" = "true" ]; then + tags+=(-t "${IMAGE}:latest") + fi + digests=() + for file in /tmp/digests/*; do + digests+=("${IMAGE}@sha256:$(basename "$file")") + done + docker buildx imagetools create "${tags[@]}" "${digests[@]}" + docker buildx imagetools inspect "${IMAGE}:${TAG}"