From f9d23ad26702f8f4e7646649755c369ff7d0e9de Mon Sep 17 00:00:00 2001 From: Logan Cusano Date: Sun, 4 Oct 2026 18:53:37 -0400 Subject: [PATCH] CI: build node images for amd64 as well as arm64 (node-26#28) amd64 nodes (radio-box) got 'no matching manifest for linux/amd64' on pull and had to build locally. Every image workflow now builds linux/amd64,linux/arm64. Release images treats an existing src- tag as present only if it carries both platforms, so the arm64-only src- tags pushed before this get rebuilt on the next v1 push. Co-Authored-By: Claude Opus 5.5 --- .gitea/workflows/build-edge-node.yml | 2 +- .gitea/workflows/build-icecast.yml | 2 +- .gitea/workflows/build-op25.yml | 2 +- .gitea/workflows/build-secondary-sdr.yml | 2 +- .gitea/workflows/publish-public.yml | 2 +- .gitea/workflows/release-images.yml | 14 +++++++++----- install.sh | 6 +++--- 7 files changed, 17 insertions(+), 13 deletions(-) diff --git a/.gitea/workflows/build-edge-node.yml b/.gitea/workflows/build-edge-node.yml index fc89622..411c1df 100644 --- a/.gitea/workflows/build-edge-node.yml +++ b/.gitea/workflows/build-edge-node.yml @@ -47,7 +47,7 @@ jobs: with: context: ./drb-edge-node file: ./drb-edge-node/Dockerfile - platforms: linux/arm64 + platforms: linux/amd64,linux/arm64 push: true tags: | git.vpn.cusano.net/${{ vars.DOCKER_ORG }}/${{ steps.meta.outputs.REPO_NAME }}/${{ env.CONTAINER_NAME }}:${{ steps.meta.outputs.VERSION }} diff --git a/.gitea/workflows/build-icecast.yml b/.gitea/workflows/build-icecast.yml index 3d39ac3..b4dbac9 100644 --- a/.gitea/workflows/build-icecast.yml +++ b/.gitea/workflows/build-icecast.yml @@ -47,7 +47,7 @@ jobs: with: context: ./icecast file: ./icecast/Dockerfile - platforms: linux/arm64 + platforms: linux/amd64,linux/arm64 push: true tags: | git.vpn.cusano.net/${{ vars.DOCKER_ORG }}/${{ steps.meta.outputs.REPO_NAME }}/${{ env.CONTAINER_NAME }}:${{ steps.meta.outputs.VERSION }} diff --git a/.gitea/workflows/build-op25.yml b/.gitea/workflows/build-op25.yml index 626b659..771ab19 100644 --- a/.gitea/workflows/build-op25.yml +++ b/.gitea/workflows/build-op25.yml @@ -47,7 +47,7 @@ jobs: with: context: ./op25-container file: ./op25-container/Dockerfile - platforms: linux/arm64 + platforms: linux/amd64,linux/arm64 push: true tags: | git.vpn.cusano.net/${{ vars.DOCKER_ORG }}/${{ steps.meta.outputs.REPO_NAME }}/${{ env.CONTAINER_NAME }}:${{ steps.meta.outputs.VERSION }} diff --git a/.gitea/workflows/build-secondary-sdr.yml b/.gitea/workflows/build-secondary-sdr.yml index 1391074..8096795 100644 --- a/.gitea/workflows/build-secondary-sdr.yml +++ b/.gitea/workflows/build-secondary-sdr.yml @@ -47,7 +47,7 @@ jobs: with: context: ./secondary-sdr-container file: ./secondary-sdr-container/Dockerfile - platforms: linux/arm64 + platforms: linux/amd64,linux/arm64 push: true tags: | git.vpn.cusano.net/${{ vars.DOCKER_ORG }}/${{ steps.meta.outputs.REPO_NAME }}/${{ env.CONTAINER_NAME }}:${{ steps.meta.outputs.VERSION }} diff --git a/.gitea/workflows/publish-public.yml b/.gitea/workflows/publish-public.yml index 3f0e842..29108ce 100644 --- a/.gitea/workflows/publish-public.yml +++ b/.gitea/workflows/publish-public.yml @@ -95,7 +95,7 @@ jobs: with: context: ${{ matrix.context }} file: ${{ matrix.file }} - platforms: linux/arm64 + platforms: linux/amd64,linux/arm64 push: true tags: | ${{ vars.PUBLIC_REGISTRY }}/${{ vars.PUBLIC_NAMESPACE }}/drb-${{ matrix.name }}:${{ steps.meta.outputs.VERSION }} diff --git a/.gitea/workflows/release-images.yml b/.gitea/workflows/release-images.yml index 755496c..2e25607 100644 --- a/.gitea/workflows/release-images.yml +++ b/.gitea/workflows/release-images.yml @@ -67,12 +67,16 @@ jobs: TAG="src-$(git rev-parse HEAD:${{ matrix.context }})" echo "IMAGE=$IMAGE" >> $GITHUB_OUTPUT echo "TAG=$TAG" >> $GITHUB_OUTPUT - if docker buildx imagetools inspect "$IMAGE:$TAG" >/dev/null 2>&1; then + # Present only counts if BOTH platforms are in it: src- tags pushed + # before node-26#28 are arm64-only, and an amd64 node can't pull them. + RAW="$(docker buildx imagetools inspect --raw "$IMAGE:$TAG" 2>/dev/null | tr -d ' \n' || true)" + if printf '%s' "$RAW" | grep -q '"architecture":"amd64"' \ + && printf '%s' "$RAW" | grep -q '"architecture":"arm64"'; then echo "EXISTS=true" >> $GITHUB_OUTPUT - echo "$IMAGE:$TAG already published — nothing to do" + echo "$IMAGE:$TAG already published for amd64 + arm64 — nothing to do" else echo "EXISTS=false" >> $GITHUB_OUTPUT - echo "$IMAGE:$TAG missing — building it" + echo "$IMAGE:$TAG missing or not multi-arch — building it" fi - if: steps.meta.outputs.EXISTS != 'true' @@ -80,8 +84,8 @@ jobs: with: context: ./${{ matrix.context }} file: ./${{ matrix.context }}/Dockerfile - # arm64 only, same as the build-*.yml workflows (node-26#28). - platforms: linux/arm64 + # amd64 + arm64, same as the build-*.yml workflows (node-26#28). + platforms: linux/amd64,linux/arm64 push: true tags: ${{ steps.meta.outputs.IMAGE }}:${{ steps.meta.outputs.TAG }} cache-from: type=registry,ref=${{ steps.meta.outputs.IMAGE }}:buildcache diff --git a/install.sh b/install.sh index 7ec6896..2a8aa3b 100644 --- a/install.sh +++ b/install.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # -# DRB edge node — one-shot bootstrap for a clean Raspberry Pi OS (arm64). +# DRB edge node — one-shot bootstrap for a clean Raspberry Pi OS (arm64) or Debian (amd64). # # curl -fsSL https://git.vpn.cusano.net/logan/node-26/raw/tag/v1/install.sh \ # | sudo bash -s -- --node-id node-003 \ @@ -228,8 +228,8 @@ command -v apt-get >/dev/null || die "apt-get not found — this script targets ARCH="$(dpkg --print-architecture)" case "$ARCH" in - arm64|aarch64) ok "arch $ARCH" ;; - *) warn "arch is $ARCH — CI only builds linux/arm64 images. Prebuilt pull will fail; use --build." ;; + arm64|aarch64|amd64|x86_64) ok "arch $ARCH" ;; + *) warn "arch is $ARCH — CI only builds linux/amd64 + linux/arm64 images. Prebuilt pull will fail; use --build." ;; esac ok "running as root" -- 2.54.0