From f54f0285bdf4c409af291188685d711d47bcfd10 Mon Sep 17 00:00:00 2001 From: Blossom Date: Tue, 19 May 2026 22:02:00 +0800 Subject: [PATCH] =?UTF-8?q?fix(ci):=20build=20multi-arch=20wifi-densepose?= =?UTF-8?q?=20image=20=E2=80=94=20linux/arm64=20was=20missing=20(closes=20?= =?UTF-8?q?#625)=20(#631)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR #547 refreshed the sensing-server docker publish and the README badge advertises 'Docker: multi-arch amd64 + arm64', but .github/workflows/sensing-server-docker.yml only sets 'platforms: linux/amd64'. The arm64 layer was never actually wired in. Consequence on Docker Hub today (ruvnet/wifi-densepose:latest, last pushed 2026-05-14 by #547): $ curl -s https://hub.docker.com/v2/repositories/ruvnet/wifi-densepose/tags/latest/ images: arch=amd64 os=linux arch=unknown os=unknown # the 1.5KB attestation layer, not arm64 So Apple Silicon Macs (the platform in #625) hit: docker pull ruvnet/wifi-densepose:latest Error: no matching manifest for linux/arm64/v8 in the manifest list This is the same crash class as the closed-unmerged #136 'Docker error on MacOS'; #625 is a fresh report (Mac M3 Pro, macOS Tahoe 26.4.1) of the same bug. Fix is the standard buildx multi-arch recipe: 1. Add docker/setup-qemu-action@v3 before setup-buildx so the amd64 runner can cross-build the arm64 layer (QEMU user-mode emulation). 2. Change 'platforms: linux/amd64' -> 'platforms: linux/amd64,linux/arm64'. docker/Dockerfile.rust is already arch-agnostic — no '--target' flag, no amd64-only Cargo deps, only 'cc = "1.0"' which is cross-aware — so no Dockerfile changes are needed. Buildx + QEMU does the rest. Smoke tests are unaffected: they 'docker pull' on ubuntu-latest (amd64), so the runner auto-selects the amd64 entry from the multi-arch manifest. Multi-arch manifests are transparent to single-arch consumers. Scope discipline: this PR only touches sensing-server-docker.yml (the file issue #625 is about). nvsim-server-docker.yml has the identical 'platforms: linux/amd64' bug but is out of scope here — happy to file a follow-up if useful. Note (not part of this fix): the last 5 runs of this workflow have failed at the 'Log in to Docker Hub' step (DOCKERHUB_TOKEN secret looks rotated/ expired). That's a separate, secret-side issue I can't touch from a PR. Once that's resolved, the next push to main will produce a proper amd64+arm64 manifest for the first time. Co-authored-by: Mack Ding --- .github/workflows/sensing-server-docker.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/sensing-server-docker.yml b/.github/workflows/sensing-server-docker.yml index 1766d24c..6c74a09d 100644 --- a/.github/workflows/sensing-server-docker.yml +++ b/.github/workflows/sensing-server-docker.yml @@ -50,6 +50,12 @@ jobs: with: submodules: recursive + # QEMU is required so the amd64 GitHub runner can cross-build the + # linux/arm64 layer below (Dockerfile.rust is arch-agnostic — no `--target` + # flag — so buildx + QEMU is all that's needed; arm64 builds are emulated + # by the runner, not built on a separate arm64 host). + - uses: docker/setup-qemu-action@v3 + - uses: docker/setup-buildx-action@v3 - name: Log in to Docker Hub @@ -90,7 +96,11 @@ jobs: labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha cache-to: type=gha,mode=max - platforms: linux/amd64 + # README badge advertises `amd64 + arm64`, and #547 promised multi-arch + # as part of the docker publish refresh; arm64 was never actually wired + # in, so Apple Silicon Macs hit `no matching manifest for linux/arm64/v8` + # on `docker pull ruvnet/wifi-densepose:latest` (#136, #625). Build both. + platforms: linux/amd64,linux/arm64 # --------------------------------------------------------------------- # Smoke-test the freshly-pushed image: