feat(docker-release): split mode — one native-arch leg per platform, no QEMU - #55
Merged
Conversation
…no QEMU docker-release-split.yml is the multi-arch variant of docker-release.yml, built on stevedore v0.0.10's split/merge (blairham/stevedore#15): - plan pins the release set and per-image ECR versions once, so both legs and the merge decide identically. - One leg per platform on a runner of that architecture; each leg builds ALL planned images on one BuildKit — the #39 build-once property survives per platform — and pushes per-arch images untagged, by digest, into a shared artifact. - merge stitches the digests into tagged manifest lists, runs the release tail, advances marker refs, and notifies Dispatch. It refuses to publish while any platform lacks a digest, so a failed leg can never ship a partial image. Layer cache is per platform: cache=gha scopes as stevedore-<plat>; cache=registry writes <REGISTRY>/<repo>/buildcache:<plat> (no 10GB cap, suited to trading's .NET build stage). Private repos must pass arm64-runner (org larger runners or the EKS/ARC labels) — the default ubuntu-24.04-arm is free for public repos only. A separate file rather than an edit in place: callers pin @main, and split changes job topology; repos opt in by switching uses:.
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.
Why
Multi-arch images on the single-job workflow would emulate arm64 with QEMU — 5–10× on compile-heavy stages (trading's .NET solution being the worst case). GitHub/EKS give us native arm64 runners, so the build should fan out per platform, not per image.
What
docker-release-split.yml— a new reusable workflow (separate file: callers pin@main, and this changes job topology), built on stevedore v0.0.10 split/merge (blairham/stevedore#15):Design points:
docker-releaseconcurrency group serializes with the single-job workflow.cache: gha→ one scope per platform (a shared scope would thrash under the 10GB cap now that build stages differ by TARGETARCH);cache: registry→<REGISTRY>/<repo>/buildcache:<plat>in ECR for repos whose build stage outgrows GHA cache (trading). Buildcache ECR repos must be created in platform-gitops before enabling.amd64-runner/arm64-runnerlabels, so switching the legs to the EKS/ARC self-hosted runners is caller config, not a workflow change. Note theubuntu-24.04-armdefault is public-repo-only free.no-pushinput — a split leg is a push (by digest); validation builds stay ondocker-release.yml, as do single-platform repos.Validation
uses:at this branch — suggestk5sfirst (two platforms, cross-compile Dockerfile already on itsfeat/dockerfile-cross-compilebranch), thentradingwithcache: registryonce its buildcache repo exists.