Move CI off Blacksmith runners - #830
Merged
Merged
Conversation
Free usage is exhausted and the next invoice is real money. Every job now
runs on GitHub-hosted runners, which are free for a public repository:
blacksmith-{2,4}vcpu-ubuntu-2404 -> ubuntu-latest, and
useblacksmith/setup-docker-builder -> docker/setup-buildx-action.
The image build could not follow that straight across. Blacksmith built
both architectures natively; ubuntu-latest would have to emulate arm64
through QEMU, which turns the Bun build from a minute into most of an
hour. So each architecture gets its own runner -- ubuntu-latest and
ubuntu-24.04-arm, both free here -- pushes an untagged blob, and reports
its digest. publish_images keeps its id and its name, and now assembles
the two digests into the manifest that claims the sha tag. It refuses to
publish unless both legs arrived: a one-arch manifest would strand
whichever node runs the other, and promote would copy it onward.
Layer caching moves with it. Blacksmith cached implicitly; type=gha does
not, and needs a scope per target and architecture, or the three targets
evict each other on every run.
Job-level timeouts fill in everywhere they were missing, 15 minutes
unless the work needs longer -- the same gap that let a hung unit-test
job hold the staging release queue for an afternoon.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
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.
Free usage is exhausted and the next invoice is real money.
Runners
All 15
runs-on:lines move to GitHub-hosted runners, free for a public repository:blacksmith-2vcpu-ubuntu-2404/blacksmith-4vcpu-ubuntu-2404→ubuntu-latestuseblacksmith/setup-docker-builder@v1→docker/setup-buildx-action@v3(4 sites).github/actions/bun-projectalready usedactions/cache, so it needed nothing.The image build
useblacksmith/build-push-action@v2builtlinux/amd64,linux/arm64in one job, natively. Onubuntu-latestthe arm64 leg would run under QEMU, which takes the Bun build from about a minute to most of an hour.So the build splits by architecture onto its own runner --
ubuntu-latestandubuntu-24.04-arm, both free here. Each leg pushes an untagged blob and uploads its digest;publish_imageskeeps its job id and its display name, and assembles the manifest that claims:${{ github.sha }}. It fails if both digests did not arrive: a one-arch manifest strands whichever node runs the other, andpromotewould copy it onward.Layer caching had to be made explicit -- Blacksmith cached implicitly,
type=ghadoes not -- with a scope per target and architecture, or the three targets evict each other every run.Timeouts
Job-level
timeout-minuteseverywhere it was missing, 15 unless the work needs longer (build_platform_imagesgets 35, outlasting its own 30-minute build step). This is the gap behind the stuck queue earlier: a hung unit-test job sat at GitHub's 6-hour default andawait_turnheld every later staging run behind it.Reusable-workflow callers (
quality,pr_smoke,release_smoke_push,release_smoke_dispatch) cannot taketimeout-minutes; the jobs inside those workflows carry their own.🤖 Generated with Claude Code