Skip to content

fix(release): publish multi-arch app/ui/docs/launcher images - #3401

Closed
alesr wants to merge 1 commit into
integry:mainfrom
alesr:fix/multi-arch-release-core-images
Closed

alesr wants to merge 1 commit into
integry:mainfrom
alesr:fix/multi-arch-release-core-images

Conversation

@alesr

@alesr alesr commented Oct 31, 2026

Copy link
Copy Markdown

Problem

propr setup from the npm package fails on Apple Silicon (arm64 Docker engine) when downloading core images:

· Cannot prepare image propr/app:0.9.0: Image does not declare the required linux/arm64 platform
· Cannot prepare image propr/ui:0.9.0:  Image does not declare the required linux/arm64 platform
✗ failed to pull core image(s): propr/app:0.9.0, propr/ui:0.9.0

Root cause: the 0.9.0 release published amd64-only single-platform manifests for propr/app, propr/ui, propr/docs, propr/launcher (verified via docker manifest inspect --verbose: Descriptor.platform = linux/amd64, mediaType manifest.v2, no index). The release workflow runs ./scripts/build-images.sh --dockerhub on an x64 self-hosted runner without --platform, and the script defaults to the native platform. On macOS, setup's platform gate (packages/cli/src/commands/setup/imagePlatform.ts) requires core images to declare the engine's native platform (linux/arm64 on Apple Silicon), so the pull is refused before it starts. The agent image is unaffected because the gate deliberately pins the agent to linux/amd64 under Docker Desktop emulation.

Fix

In build-smoke-and-push, after the existing local build + smoke tests and Docker Hub login:

  1. Best-effort QEMU binfmt registration for arm64 on the runner.
  2. ./scripts/build-images.sh --push --dockerhub --platform linux/amd64,linux/arm64 --only app,ui,docs,launcher — builds multi-arch manifest lists, stages them as reconcile-<sha> candidates, and publishes the immutable :version/:sha tags from the index digest via the existing reconcile flow (all base images are multi-arch Node alpine/slim images).
  3. ./scripts/build-images.sh --push-only --dockerhub --only agent — the agent stays pinned to linux/amd64 (Debian binNMU pins) and is published from the local smoke-tested build as before.

promote-latest copies the version-tag digest to :latest, so latest becomes multi-arch unchanged.

Also adds a regression test in test/releaseImageFixtures.test.ts asserting the release publishes multi-arch service images while the agent stays amd64-pinned. Workflow YAML validated; test/releaseImageFixtures.test.ts passes (13/13, incl. the new test) and the workflow regex tests in test/agentTankImageVerification.test.ts pass (that file has 18 pre-existing failures on clean main, unrelated to this change).

Notes

  • Already-published 0.9.0 tags are immutable: the reconcile flow refuses to overwrite them with a different digest, so this takes effect from the next release unless the 0.9.0 tags are replaced registry-side.
  • Assumes the self-hosted propr runner can run arm64 builds via QEMU binfmt (the added step registers it best-effort; the multi-arch build fails loudly without it).

The 0.9.0 release published amd64-only single-platform manifests for
propr/app, propr/ui, propr/docs and propr/launcher because the release
workflow invokes build-images.sh without --platform, so it builds for the
x64 runner's native platform. On Apple Silicon, propr setup's platform
gate requires a declared native linux/arm64 core image, so setup fails
with 'Image does not declare the required linux/arm64 platform' and
aborts with 'failed to pull core image(s)'.

Publish app/ui/docs/launcher as linux/amd64,linux/arm64 manifest lists via
buildx (staged as reconcile-<sha> candidates, then published to the
immutable version/sha tags by the existing reconcile flow). The agent
image stays pinned to linux/amd64 (Debian binNMU pins) and is still
published from the local smoke-tested build. promote-latest propagates
the multi-arch index digest unchanged.

Note: already-published 0.9.0 tags are immutable and reconcile refuses to
overwrite them with a different digest, so this takes effect from the
next release unless the 0.9.0 tags are replaced registry-side.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
@alesr alesr closed this Oct 31, 2026
@alesr
alesr deleted the fix/multi-arch-release-core-images branch October 31, 2026 11:36
@alesr
alesr restored the fix/multi-arch-release-core-images branch October 31, 2026 11:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant