Skip to content

ci: split CPU builds per-arch on native runners (drop QEMU)#47

Merged
cboettig merged 5 commits into
masterfrom
ci/split-cpu-multiarch-native-runners
Jun 16, 2026
Merged

ci: split CPU builds per-arch on native runners (drop QEMU)#47
cboettig merged 5 commits into
masterfrom
ci/split-cpu-multiarch-native-runners

Conversation

@cboettig

Copy link
Copy Markdown
Member

Mirror of #46 for the CPU images. build-ml.yml and build-ml-spatial.yml built amd64+arm64 in one job under QEMU; arm64 emulation was the bulk of the ~1h ML-Spatial runtime. Split each arch onto its own native runner (amd64 → ubuntu-latest, arm64 → ubuntu-24.04-arm), push by digest, merge into one multi-arch manifest per tag on GHCR, mirror to Docker Hub. Keeps arm64 first-class (Apple Silicon, Spark). Needs a CI run to validate (arm64 runner enabled; imagetools mirror).

cboettig and others added 5 commits June 15, 2026 20:48
Mirror of the GPU split: build amd64 on ubuntu-latest and arm64 on the
native ubuntu-24.04-arm runner (no QEMU -- emulation was the bulk of the
ML-Spatial build's ~1h runtime), push by digest, then assemble one
multi-arch manifest per tag on GHCR and mirror to Docker Hub.

Applies to build-ml.yml and build-ml-spatial.yml.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
The cross-registry `imagetools create -t docker.io/... ghcr.io/...` copy
fails with 400 Bad Request on Docker Hub blob upload. Push each per-arch
image by digest to BOTH GHCR and Docker Hub during the build, then create
the multi-arch manifest natively in each registry (no blob copy).

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Multiple type=image outputs in one build broke the exported digest
(not found in GHCR). Use two single-output push-by-digest steps instead
(GHCR, then a cache-hot re-push to Docker Hub) so each exports a correct
digest and identical content yields the same digest in both registries.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
The GHCR and Docker Hub pushes produce different digests (provenance /
created-timestamp non-determinism), so reusing the GHCR digest against
Docker Hub failed (not found). Record each registry's own per-arch digest
and assemble each registry's manifest from its own digests.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Mirror of the now-green build-ml.yml: native per-arch builds pushed by
digest to both registries, per-registry digests recorded, manifests
assembled natively in each (no cross-registry copy).

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
@cboettig cboettig merged commit 63061f5 into master Jun 16, 2026
3 checks passed
@cboettig cboettig deleted the ci/split-cpu-multiarch-native-runners branch June 16, 2026 04:51
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