ci: pin newer QEMU to fix hung arm64 image build#6
Merged
Conversation
The multi-arch publish hung for hours on the linux/arm64 stage. The base image node:22-alpine was updated to a much newer userspace (gcc 15.2, musl 1.2.6, python 3.14), which invalidated the cached arm64 layer and forced QEMU to actually emulate it. The binfmt QEMU bundled by setup-qemu-action was too old for the new arm64 binaries and crashed with "qemu: uncaught target signal 4 (Illegal instruction) - core dumped" while running npm/prebuild-install — and the core dump left buildx hung rather than failing. Pin tonistiigi/binfmt:qemu-v10.2.3 so emulation handles the new userspace. Also add a concurrency group so a newer push cancels an in-flight build for the same ref instead of stacking up behind a stuck one.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
The multi-arch publish hung for ~2.5h on the
linux/arm64build stage. Logs showed:Root cause
node:22-alpinewas updated to a much newer userspace (gcc 15.2, musl 1.2.6, python 3.14). That invalidated the cached arm64 layer and forced QEMU to actually emulate it. The binfmt QEMU bundled bysetup-qemu-actionwas too old to emulate the new arm64 binaries — it crashed with an illegal-instruction signal while runningnpm/prebuild-install, and the core dump left buildx hung instead of failing. The previous successful build only worked because it reused a cached arm64 layer.Note: this is not a compilation problem —
better-sqlite311.10.0 now ships alinuxmusl-arm64prebuilt (verified HTTP 200), and the amd64 half used it fine. The crash is QEMU emulation itself.Fix
tonistiigi/binfmt:qemu-v10.2.3onsetup-qemu-actionso emulation handles the new userspace.concurrencygroup so a newer push cancels an in-flight build for the same ref instead of stacking up behind a stuck one.Test plan
linux/amd64andlinux/arm64:edgeupdated; user re-pulls and confirms the dashboard loads (combined with the SPA path fix in fix: serve client SPA from the correct path in the Docker image #5)Generated by Claude Code