Migrate from Blacksmith to WarpBuild
Move GitHub Actions workflows from Blacksmith runners to WarpBuild: the runs-on label map, cache migration, a compatibility table, parallel runs, and rollback.
Last updated:
Moving GitHub Actions workflows from Blacksmith to WarpBuild is a runs-on label change plus a replacement for any useblacksmith/* action steps in the file. Nothing else in the workflow changes: the same steps run, the same secrets resolve, and the same GitHub events trigger the jobs.
This page carries the label map, a full workflow example, what happens to caches, a compatibility table with the unsupported rows stated plainly, guidance for running both platforms side by side, and the rollback steps. Every Blacksmith fact links to the page that states it, checked on 2026-08-13.
Still weighing the decision? WarpBuild vs Blacksmith covers the two platforms dimension by dimension, and Blacksmith alternatives covers the wider option set.
Prerequisites
- A GitHub organization. WarpBuild registers runners in the
Defaultrunner group (id1) of your GitHub organization, per the public repos doc. Blacksmith carries the same constraint from the other side: their docs state that Blacksmith is limited to GitHub organizations and is not available for personal repositories. - Organization owner access, to install the WarpBuild GitHub app and, for public repositories, to check
Allow public repositorieson runner group 1. - A WarpBuild account. Sign up at app.warpbuild.com, then install the GitHub app from the WarpBuild dashboard. The app cannot be installed from the GitHub marketplace directly, per the quick start.
- An inventory of vendor-specific steps. Search your workflows for
useblacksmith/and forblacksmith-labels before you start. The count of the first tells you how much work this is; the count of the second tells you how many lines change. - Your GitHub organization IP allowlist, if you use one. Their network allowlisting doc publishes the control-plane addresses their platform needs. Leave those entries in place until the parallel run ends.
- Any third-party allowlists pointing at a Blacksmith static IP, if you bought that add-on, need re-pointing before the last workflow moves.
Secrets and permissions need no migration. Workflow secrets stay in GitHub. The only new secret is WARPBUILD_API_KEY, and only if you drive WarpBuild Docker builders from runners that are not WarpBuild runners.
The Label Change
The most common Blacksmith label is blacksmith-2vcpu-ubuntu-2404, which is what their quickstart maps ubuntu-latest to and what their Migration Wizard produces by default. The diff for that job is two lines:
jobs:
test:
- runs-on: blacksmith-2vcpu-ubuntu-2404
+ runs-on: warp-ubuntu-latest-x64-2x
steps:
- uses: actions/checkout@v4The full label map, from their published runner list to the WarpBuild runner catalog. <n> is one of 2, 4, 8, 16, 32 unless a note says otherwise.
| Blacksmith label | WarpBuild label | Note |
|---|---|---|
blacksmith-<n>vcpu-ubuntu-2404 | warp-ubuntu-latest-x64-<n>x | Same vCPU and RAM at every size. WarpBuild ships 150 GB SSD on all Linux sizes. |
blacksmith-<n>vcpu-ubuntu-2204 | warp-ubuntu-2204-x64-<n>x | Ubuntu 22.04 x64 is published on both sides. |
blacksmith-<n>vcpu-ubuntu-2404-arm | warp-ubuntu-latest-arm64-<n>x | RAM differs at the small sizes. Ubuntu 24.04 ARM64 runners set the work dir to /runner/_work. |
blacksmith-<n>vcpu-ubuntu-2204-arm | warp-ubuntu-latest-arm64-<n>x | WarpBuild deprecated Ubuntu 22.04 ARM64 images on March 31, 2025, so ARM jobs land on 24.04. |
blacksmith-2vcpu-windows-2025 | warp-windows-2025-x64-4x | WarpBuild Windows starts at 4 vCPU; the 2 vCPU Windows shape was removed on June 8, 2026. |
blacksmith-<n>vcpu-windows-2025 | warp-windows-2025-x64-<n>x | For <n> of 4, 8, 16, 32. WarpBuild also publishes Windows Server 2022 labels and a vs2026 variant. |
blacksmith-6vcpu-macos-latest | warp-macos-26-arm64-6x | Their macos-latest currently resolves to macOS 26. The WarpBuild warp-macos-latest-arm64-6x alias points at macOS 15, so name the version explicitly during the move. |
blacksmith-12vcpu-macos-latest | warp-macos-26-arm64-12x | Same version caveat as above. |
blacksmith-6vcpu-macos-26 | warp-macos-26-arm64-6x | The WarpBuild macOS 26 image ships Xcode 27.0 with iOS, tvOS, watchOS, and visionOS simulator runtimes. |
blacksmith-12vcpu-macos-26 | warp-macos-26-arm64-12x | 12 vCPU, 44 GB RAM, 270 GB SSD. |
blacksmith-6vcpu-macos-15 | warp-macos-15-arm64-6x | WarpBuild also publishes a macOS 14 image at 6 vCPU. |
blacksmith-12vcpu-macos-15 | warp-macos-15-arm64-12x | Multiple sizes and configurations are available per chip. |
Sizes are matched on vCPU count. Check RAM and disk against the runner catalog for memory-bound jobs before you assume a like-for-like swap.
A Full Workflow Example
Before, on Blacksmith, with their Docker builder, their checkout action, and the transparent dependency cache their docs describe:
name: build
on:
push:
branches: [main]
jobs:
build:
runs-on: blacksmith-4vcpu-ubuntu-2404
steps:
- uses: useblacksmith/checkout@v1
- uses: actions/setup-node@v4
with:
node-version: 22
- uses: actions/cache@v4
with:
path: ~/.npm
key: npm-${{ hashFiles('**/package-lock.json') }}
restore-keys: npm-
- run: npm ci
- run: npm test
- uses: useblacksmith/setup-docker-builder@v2
with:
cache-key: web-app
- uses: useblacksmith/build-push-action@v2
with:
context: .
push: true
tags: ghcr.io/acme/web:${{ github.sha }}After, on WarpBuild:
name: build
on:
push:
branches: [main]
jobs:
build:
runs-on: warp-ubuntu-latest-x64-4x
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- uses: WarpBuilds/cache@v1
with:
path: ~/.npm
key: npm-${{ hashFiles('**/package-lock.json') }}
restore-keys: npm-
- run: npm ci
- run: npm test
- uses: Warpbuilds/build-push-action@v6
with:
context: .
push: true
tags: ghcr.io/acme/web:${{ github.sha }}
profile-name: web-app-builderFour changes: the label, the checkout action back to upstream, the cache action to the WarpBuild drop-in, and one Docker step instead of two. The profile-name value is a builder profile you create once on the Docker builders page.
Cache Migration
Blacksmith's caching surface is broad, and the migration work is proportional to how much of it a repository uses. Their features, what their docs say happens, and the WarpBuild path:
| Blacksmith feature | What their docs publish | WarpBuild path |
|---|---|---|
| Dependency cache | Transparent interception of actions/cache and setup-* actions, zero code changes, 25 GB per repository per week free, entries evicted after 7 days without access | Swap actions/cache@v4 for WarpBuilds/cache@v1, a drop-in with the same key, path, and restore-keys inputs. Cache is enabled by default on WarpBuild runners. |
| Sticky disks | Persistent ext4 volumes mounted by key, up to 5 per job, auto-evicted after 7 days of inactivity | No direct equivalent. Remove the useblacksmith/stickydisk and stickydisk-delete steps. For keyed paths use the cache action; for whole-VM state use snapshot runners. |
| Docker layer caching | setup-docker-builder plus their build-push-action with a required cache-key. Their docs instruct users to delete cache-from and cache-to because layer state lives on a persistent builder disk | Remote Docker builders hold the layer cache on a dedicated builder VM. Use Warpbuilds/build-push-action@v6 with profile-name. cache-from and cache-to stay unnecessary. |
| Docker container caching | Keeps pulled images warm across runs, one cache disk per organization per region and architecture, enabled by default | No published equivalent. There is no YAML to remove, and first-run image pull time returns. |
| Bazel build caching | Transparent, with no .bazelrc changes and no workflow configuration | No published equivalent. Teams relying on it need their own remote cache configured, or they accept cold Bazel builds. Weigh this before committing to the move. |
| Git checkout caching | useblacksmith/checkout backed by a sticky-disk git mirror, labelled beta, with extra dissociate and verbose inputs | Revert to actions/checkout@v4 and drop the two extra inputs, which have no upstream equivalent. |
What to expect on the first run. Every cache key starts cold on the new platform. Blacksmith's own Docker docs set the same expectation in the other direction, stating that the first Docker run after a cache-backend change is an uncached run. Judge the migration on runs three and later, once dependency caches, layer caches, and any snapshots have hydrated. A pilot that gets measured on run one measures cache warming rather than the platform.
Compatibility Table
| Blacksmith feature or label | WarpBuild equivalent | Status | Note |
|---|---|---|---|
blacksmith-* runner labels | warp-* runner labels | Supported | One line per job. See the label map above. |
Transparent actions/cache interception | WarpBuilds/cache@v1 | Partial | Same inputs and outputs, added as an explicit action swap rather than a transparent redirect. |
| Docker layer caching | Remote Docker builders with a builder profile | Supported | Different shape. Layer state lives on a dedicated builder VM shared by the jobs using that profile. |
| Sticky disks | None | Unsupported | Nearest paths are the cache action for keyed paths and snapshot runners for whole-VM state. |
| Docker container and service-image caching | None | Unsupported | First-run image pulls return. |
| Bazel build caching | None | Unsupported | Configure your own remote cache or accept cold Bazel builds. |
| Git checkout caching | actions/checkout@v4 | Partial | The dissociate and verbose inputs have no upstream equivalent and get dropped. |
| Nested virtualization on x64 Linux | nested-virtualization.enabled=true label | Supported | Linux x64 only on both sides. |
| SSH into a running job | Action Debugger | Supported | Different mechanism: a workflow step that pauses the job and opens an SSH session. |
| GitHub Actions analytics dashboard | CI observability plus Reports | Supported | Reports covers per-job cost, duration, and queue timings by runner label, with CSV export. |
| Slack monitors on job failure or duration | None | Unsupported | No published equivalent alerting product. |
| Static IP add-on | None | Partial | No static egress IP product is published. The networking addon joins runners to a Tailscale tailnet for private service access. |
| Scale Apps for GitHub API headroom | Not applicable | Not applicable | Specific to their app architecture. |
| Windows Server 2025 runners at 2 vCPU | warp-windows-2025-x64-4x and larger | Partial | WarpBuild Windows starts at 4 vCPU. Their Windows family is labelled public beta in their own docs. |
| macOS runners | warp-macos-26, warp-macos-15, and warp-macos-14 labels | Supported | WarpBuild publishes three macOS versions and Xcode contents per image. Name the macOS version explicitly. |
| Automatic free size upgrades | None | Unsupported | WarpBuild bills the size you request, at the rate on the pricing page. |
| Testboxes | None | Unsupported | No local-to-microVM sync product is published. |
| GitHub-only authentication | SAML 2.0 and OIDC single sign-on | Supported | a flat $250 per month, whatever the user count (pricing). GitHub login continues to work. |
Run Both Platforms Side by Side
A parallel run is the honest test, and both platforms support it because the routing decision lives in the workflow file.
- Pick a narrow, representative subset. One busy repository, or one job inside a matrix, gives a clean read. Leave everything else on its current labels.
- Keep the Blacksmith GitHub app installed on every repository that still carries a
blacksmith-*label. Their quickstart documents the failure mode: org-level runner registration can hand their runners jobs from repositories they never provisioned for, which causes queuing. This is the one parallel-run gotcha that bites teams. - Wait out the cold runs. Give each side at least three runs after the caches warm before you compare anything.
- Compare the same numbers on both sides. WarpBuild Reports publishes per-job duration, queue time by runner label, and cost per repository, with CSV export. Their GitHub Actions analytics dashboard publishes p99 job duration and cost by repository. Export both and compare the same workflows over the same week.
- Watch queue time separately from run time. A platform that runs a job quickly and queues it for minutes has not made your pipeline faster.
Billing During a Parallel Run
Running two platforms means paying two platforms for the overlap. Four things to plan for.
Per-minute charges accrue on both sides. Check current rates on the WarpBuild pricing page and on their pricing page. This page restates no vendor's rates as numbers, because both change.
Their free minute allowance keeps working while you test. Blacksmith publishes 3,000 free minutes per month per organization, denominated in x64 2vCPU minutes with published conversion ratios for other families, and those minutes reset monthly. Whatever stays on their labels draws from that pool first.
WarpBuild pricing is purely usage based. There is no base subscription fee, no platform fee, and no seat fee. Signup includes $10 free credits, which covers a meaningful slice of a pilot before any invoice appears.
Storage-shaped meters keep billing until the data goes away. Their sticky disks and Docker layer cache are priced per GB per month on their pricing page, and both auto-evict after a period of inactivity (7 days for sticky disks, 8 days for the layer cache). Deleting the workflow steps stops new writes; existing volumes age out on their own schedule.
One question for your own account: pay-as-you-go carries no published base subscription or seat fee, and committed-spend and annual contracts do exist on their side, since those are the qualifier for their Premium Support plan. Check whether your account has a term commitment before you plan a full cutover.
Rollback
Reverting is the same one-line change in the other direction, and it can be done the same day.
- Change
runs-onback to theblacksmith-*label on the affected jobs. - Restore any
useblacksmith/*steps you removed: the Docker builder pair, sticky disks, and the checkout action. - Confirm the Blacksmith GitHub app is still installed on those repositories. Leaving it installed for the whole parallel-run period is why this stays a one-line revert.
- Expect one cold run per cache key on the way back, with one exception: their sticky disks evict after 7 days of inactivity and their Docker layer cache after 8 days, so a rollback inside a week may still find warm state.
There is no data to export, no account to close, and no configuration living outside the workflow file. Reversibility is the reason to run a pilot rather than a big-bang cutover.
FAQ
How long does the migration take?
For a workflow with no vendor-specific action steps, the change is one line per job and the first green build lands in the same working session, once the WarpBuild GitHub app is installed on the repository. Workflows that use useblacksmith Docker builder, sticky disk, or checkout steps take longer, because those steps need replacing rather than relabelling.
What happens to my existing caches?
Nothing moves. Cache state is not portable between the platforms in either direction, and Blacksmith's own Docker caching docs state that the first Docker run after a cache-backend change is an uncached run (https://docs.blacksmith.sh/blacksmith-caching/docker-builds). Expect one cold run per cache key on WarpBuild, then hydrated runs. Their sticky disks auto-evict after 7 days of inactivity and their Docker layer cache after 8 days, so a rollback inside a week may still find warm state on their side.
Do I need to change my secrets or permissions?
No. Workflow secrets stay in GitHub and are read the same way on either platform. The one addition is a WARPBUILD_API_KEY secret, and only when you use WarpBuild Docker builders from runners that are not WarpBuild runners (https://www.warpbuild.com/docs/ci/docker-builders). WarpBuild registers as a self-hosted runner in the Default runner group of your GitHub organization, so an organization owner has to install the app and, for public repositories, allow public repositories on that runner group (https://www.warpbuild.com/docs/ci/public-repos).
Can I run both platforms at the same time?
Yes, and it is the recommended way to validate. Move a subset of workflows and leave the rest where they are. Keep the Blacksmith GitHub app installed on every repository that still carries a blacksmith label, because their docs warn that org-level runner registration can otherwise hand their runners jobs from repositories they never provisioned for, which causes queuing (https://docs.blacksmith.sh/introduction/quickstart).
How do I roll back?
Change the runs-on labels back to the blacksmith labels and restore any useblacksmith steps you removed. The workflow diff is the only change, so a rollback is a same-day operation with no data to migrate and no account to close.
Which Blacksmith features have no WarpBuild equivalent?
Sticky disks, Docker container and service-image caching, Bazel build caching, automatic free size upgrades, and Testboxes have no published WarpBuild equivalent as of 2026-08-13. The compatibility table on this page lists each one with its status and the nearest WarpBuild path.
Start with $10 in free credits
Change the runner label in your workflow and keep the rest of your GitHub Actions setup. Runner time is billed per minute.