Skip to content

ci: run on github-hosted runners instead of blacksmith - #240

Merged
dzianisv merged 1 commit into
devfrom
ci-runner-capacity
Jul 27, 2026
Merged

ci: run on github-hosted runners instead of blacksmith#240
dzianisv merged 1 commit into
devfrom
ci-runner-capacity

Conversation

@dzianisv

Copy link
Copy Markdown
Owner

Decision

Repoint blacksmith-* jobs to GitHub-hosted runners. Not: buy/enable Blacksmith capacity.

Why

CI has been effectively dark on this fork. Every job targeting a blacksmith-* label queues forever because the fork has no Blacksmith runner capacity — those labels are inherited from upstream anomalyco/opencode, whose runner account we don't have.

Evidence, PR #238 (unrelated, earlier):

e2e (linux)        fail  24h0m1s
e2e (windows)      fail  24h0m1s
nix-eval           fail  24h0m1s
typecheck          fail  24h0m0s
unit (linux)       fail  24h0m1s
unit (windows)     fail  24h0m1s
check-duplicates   fail  24h0m0s
add-contributor-label  pass  4s     <- ubuntu-latest
check-compliance       pass  5s     <- ubuntu-latest
check-standards        pass  4s     <- ubuntu-latest

Every 24h entry is a queue timeout, not a real failure. Only the ubuntu-latest jobs ever ran. So for months no PR to this fork has had its unit tests, e2e, or typecheck actually execute.

The alternative — enabling Blacksmith — costs money, needs an account plus a GitHub App install, and adds a third-party dependency for a fork whose only job is validating its own patches against upstream. This repo is public, so GitHub-hosted runners are free with unlimited minutes, and that now includes arm64 (ubuntu-24.04-arm) and Windows. There is no upside left for Blacksmith here.

Change

34 references across 21 workflow files:

From To
blacksmith-4vcpu-ubuntu-2404 ubuntu-latest
blacksmith-4vcpu-ubuntu-2404-arm ubuntu-24.04-arm
blacksmith-4vcpu-windows-2025 windows-latest

publish.yml keeps its windows-2025 pin for the aarch64 MSVC cross-compilation toolchain — only the stale comment explaining that pin was reworded.

Verification

parsed 29 workflow files, 0 problems
static runs-on labels: ['ubuntu-latest', 'windows-latest']

Matrix-driven hosts (test.yml, publish.yml, nix-hashes.yml) checked separately — all resolve to github-hosted labels. grep -rn blacksmith .github/ → no matches.

This PR validates itself: pull_request events use the workflow definitions from the PR branch, so if the checks below actually execute rather than queueing, the fix is proven.

Known trade-off

Upstream syncs from anomalyco/opencode will reintroduce blacksmith-* labels whenever these workflow files change upstream. The upstream-rebase skill should re-apply this mapping as part of a sync. That is cheaper than paying for runner capacity the fork doesn't otherwise need.

This fork has no Blacksmith runner capacity, so every job targeting a
blacksmith-* label queues until it times out. On PR #238 the whole set
(unit, e2e, typecheck, nix-eval, check-duplicates) sat queued for
24h0m1s and was then reported as failed; only the ubuntu-latest jobs
ever executed. CI has effectively been dark on this fork.

Repoint every blacksmith label to its github-hosted equivalent:

  blacksmith-4vcpu-ubuntu-2404      -> ubuntu-latest
  blacksmith-4vcpu-ubuntu-2404-arm  -> ubuntu-24.04-arm
  blacksmith-4vcpu-windows-2025     -> windows-latest

The repo is public, so github-hosted runners are free and include arm64
and Windows. No Blacksmith account, billing, or app install is needed.

publish.yml keeps its windows-2025 pin for the aarch64 MSVC
cross-compilation toolchain; only the stale comment explaining the pin
was updated.
@github-actions

Copy link
Copy Markdown

Hey! Your PR title ci: run on github-hosted runners instead of blacksmith doesn't follow conventional commit format.

Please update it to start with one of:

  • feat: or feat(scope): new feature
  • fix: or fix(scope): bug fix
  • docs: or docs(scope): documentation changes
  • chore: or chore(scope): maintenance tasks
  • refactor: or refactor(scope): code refactoring
  • test: or test(scope): adding or updating tests

Where scope is the package name (e.g., app, desktop, opencode).

See CONTRIBUTING.md for details.

@github-actions

Copy link
Copy Markdown

This PR doesn't fully meet our contributing guidelines and PR template.

What needs to be fixed:

  • PR description is missing required template sections. Please use the PR template.

Please edit this PR description to address the above within 2 hours, or it will be automatically closed.

If you believe this was flagged incorrectly, please let a maintainer know.

@dzianisv

Copy link
Copy Markdown
Owner Author

It works — CI is no longer dark

Jobs that had never once executed on this fork now run and pass:

Check Before (PR #238) Now
typecheck fail — queued 24h0m0s pass 1m45s
e2e (linux) fail — queued 24h0m1s pass 2m31s
e2e (windows) fail — queued 24h0m1s pass 7m3s
nix-eval fail — queued 24h0m1s pass 52s
storybook build never ran pass 1m5s
Smoke test fail pass 1m4s
unit (linux) fail — queued 24h0m1s fail 2m16s — real result, see below
unit (windows) fail — queued 24h0m1s fail 10m40s

About the unit failures — they pre-date this PR and #239

unit is genuinely red, and has been all along; nobody could see it because the job never started. 5 of 1037 tests fail, all in @opencode-ai/core.

I verified this rather than assuming it. Branch ci-baseline-check (now closed, #241) took commit 763cecd — the commit immediately before #239 merged — and applied only the runner repoint from this PR:

Test baseline @763cecdb this PR
public native OpenCode API > rejects missing and Location-disabled models… fail (5s timeout) fail (5s timeout)
public native OpenCode API > rejects an unavailable variant… fail (7s timeout) fail (8s timeout)
LocationServiceMap > isolates location state… fail (5s timeout) fail (5s timeout)
LocationServiceMap > installs public plugins into a location fail (6s timeout) fail (5s timeout)
DatabaseMigration > declared schema has no ungenerated migrations fail fail
Git > clones a remote and reads checkout metadata fail (5s timeout) pass
totals 1025 pass / 6 fail 1026 pass / 5 fail

The failing set on this PR is a strict subset of the baseline. Neither this PR nor #239 introduced any of them.

Two distinct causes:

  1. Five 5s-timeout flakes (public native OpenCode API, LocationServiceMap, Git > clones a remote) — these do real I/O (plugin installs, git clone) against a 5000ms default. Git > clones a remote failed on baseline and passed here, which is the signature of a flake, not a regression.
  2. One real bugDatabaseMigration > declared schema has no ungenerated migrations: Current database schema is stale. Run bun script/migration.ts from packages/core. The committed schema no longer matches what drizzle generates. Deterministic, reproducible, and worth its own PR.

Merging this makes that breakage visible on every PR instead of invisible forever. I'd rather have an honestly-red unit than a job that silently never runs. Follow-up PR for the stale schema next.

@dzianisv
dzianisv merged commit 21f4df1 into dev Jul 27, 2026
9 of 12 checks passed
@dzianisv
dzianisv deleted the ci-runner-capacity branch July 27, 2026 15:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant