Skip to content

Move CI off Blacksmith runners - #830

Merged
zakius merged 2 commits into
stagingfrom
fix/drop-blacksmith-runners
Sep 12, 2026
Merged

zakius merged 2 commits into
stagingfrom
fix/drop-blacksmith-runners

Conversation

@zakius

@zakius zakius commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

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-2404ubuntu-latest
  • useblacksmith/setup-docker-builder@v1docker/setup-buildx-action@v3 (4 sites)

.github/actions/bun-project already used actions/cache, so it needed nothing.

The image build

useblacksmith/build-push-action@v2 built linux/amd64,linux/arm64 in one job, natively. On ubuntu-latest the 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-latest and ubuntu-24.04-arm, both free here. Each leg pushes an untagged blob and uploads its digest; publish_images keeps 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, and promote would copy it onward.

Layer caching had to be made explicit -- Blacksmith cached implicitly, type=gha does not -- with a scope per target and architecture, or the three targets evict each other every run.

Timeouts

Job-level timeout-minutes everywhere it was missing, 15 unless the work needs longer (build_platform_images gets 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 and await_turn held every later staging run behind it.

Reusable-workflow callers (quality, pr_smoke, release_smoke_push, release_smoke_dispatch) cannot take timeout-minutes; the jobs inside those workflows carry their own.

🤖 Generated with Claude Code

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>
@zakius
zakius merged commit ec044b1 into staging Sep 12, 2026
19 checks passed
@zakius
zakius deleted the fix/drop-blacksmith-runners branch September 12, 2026 21:43
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