Skip to content

Make the multi-arch image build tolerate transient failures - #185

Merged
hsbt merged 6 commits into
masterfrom
claude/multi-arch-build-failures-48c9b2
Sep 15, 2026
Merged

hsbt merged 6 commits into
masterfrom
claude/multi-arch-build-failures-48c9b2

Conversation

@hsbt

@hsbt hsbt commented Sep 15, 2026

Copy link
Copy Markdown
Member

The scheduled multi-arch build failed in 18 of 88 runs over the last month. All 22 failed jobs hit transient errors, mostly connection resets in docker manifest create, unknown blob on ghcr.io pushes, and Ubuntu mirrors in the middle of a sync. Since deploy_multiarch needed every build job, one flake also skipped all manifests in that run.

The master revision is now resolved once, and each job builds ruby and development together and pushes them by digest to both registries. deploy_multiarch merges the digests with docker buildx imagetools create, which reads each image once for all tags. Builds and manifest pushes are retried, and a failed build blocks only its own variant.

Published manifest lists keep the same tags and Docker v2 media types. I checked the tags against the old Rakefile for 144 combinations and ran the push and merge against local registries. Per-arch -<arch>-<run_id> tags are no longer pushed.

Generated with Claude Code

hsbt and others added 6 commits September 15, 2026 09:24
Connection resets to raw.githubusercontent.com occasionally fail the
scheduled multi-arch build even though a second attempt would succeed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Every build and deploy job looked up the master HEAD on its own, and the
deploy jobs pulled a whole image only to read RUBY_REVISION back.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
docker manifest create fetched both per-arch manifests and configs again
for every tag, and was the most frequent cause of failed runs. The
per-arch tags it needed were never deleted and have piled up to about
12,000 per architecture on Docker Hub.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The development stage starts from the ruby stage, so building both
targets with one builder compiles Ruby once instead of twice. The dev
images now also share the Ruby layers of their base images.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Ubuntu mirrors in the middle of a sync, and registries resetting
connections or rejecting pushes with "unknown blob", fail builds that
pass when retried. The builder keeps its cache, so a retry resumes from
the step that failed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
One failed build used to skip every deploy job in the run. A variant
missing a digest still fails on its own, so no single-arch manifest is
published.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@hsbt
hsbt merged commit 5df279f into master Sep 15, 2026
60 checks passed
@hsbt
hsbt deleted the claude/multi-arch-build-failures-48c9b2 branch September 15, 2026 03:53
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