
Migrate GitHub Actions to Node.js 24 Before the Deadline
On February 6, 2026, BuildJet announced it was shutting down. Runners stopped on March 31. Two months later, on April 7, Cirrus Labs announced it was joining OpenAI. Cirrus CI shuts down on June 1, 2026. Two managed CI platforms gone in the span of a few months, for completely different reasons, with the same outcome for every team that depended on them: forced migration under a deadline someone else set.
This isn't a coincidence. It's a pattern that's been building for years in the CI runner market, and it has real implications for how engineering leaders should evaluate their next platform.
BuildJet was a straightforward managed runner service for GitHub Actions. Change one line in your workflow file, get faster builds. Their shutdown announcement on February 6 was honest about the reason: GitHub had closed the performance gap that BuildJet was built to fill. Faster hardware, larger runner options, native ARM support. The product thesis eroded. BuildJet gave teams about eight weeks to migrate back to GitHub-hosted runners.
Cirrus CI was something different. Cirrus Labs built a full CI platform with its own configuration language, its own runner infrastructure, and a genuinely innovative approach to macOS CI through Tart, their open-source Apple Silicon virtualization tool. Projects like PostgreSQL, Bitcoin Core, and Podman ran on Cirrus CI. The team never raised outside capital. They built carefully, charged fairly, and earned real loyalty.
Then OpenAI came calling. Fedor Korotkov, Cirrus Labs' founder, framed the move around "the era of agentic engineering" and joining OpenAI's Agent Infrastructure team. It's a talent acquisition. The CI product isn't being absorbed into OpenAI. It's being discontinued. Teams get less than two months to rewrite their entire CI configuration.
Different causes. Same result. Your CI breaks on a date you didn't choose.
When a CI company gets acquired, the acquirer almost never cares about your CI workflows. They want the team. They want the infrastructure expertise, the systems knowledge, maybe the virtualization IP. The product you depend on is, at best, in maintenance mode. At worst, it gets a sunset date.
The Cirrus CI case is textbook. OpenAI hired a team with deep experience in virtualization, build environments, and developer tooling. That expertise is now pointed at agent infrastructure. The engineers who understood your macOS build quirks are working on something else entirely. No one at OpenAI is going to fix a caching bug in Cirrus CI.
BuildJet's case is the other failure mode: the product thesis didn't survive market evolution. GitHub kept investing in runners, narrowed the gap, and BuildJet's differentiation evaporated. The founders were candid about it. But candor doesn't extend your migration window.
Both outcomes share a root cause: the vendor's incentive structure changed. Either someone offered a better deal than running your CI, or the economics stopped working. In either case, you're the one rewriting YAML on a deadline.
The WarpBuild team published a migration guide for Cirrus CI users, and it's honest about the scope: "This migration is bigger than a runner label swap. You're moving from Cirrus CI's .cirrus.yml configuration format to GitHub Actions workflow files. For simple setups, expect a few hours. For complex multi-platform configurations, plan for a day or two."
A day or two sounds manageable. But that estimate only covers the YAML rewrite. The real migration cost is everything around it:
For a team with 20-30 repositories and non-trivial CI, this easily stretches into a multi-week project. And it's entirely unplanned work. Nobody's sprint had "rewrite CI because vendor got acquired" in the backlog.
Small CI runner companies are structurally vulnerable. The market dynamics work against long-term independence:
This means that for any CI runner vendor you evaluate, you should be asking: what happens if the founders get a nine-figure offer from an AI lab tomorrow? Is CI their entire business, or a stepping stone?
At Tenki, independence isn't a branding choice. It's a product architecture decision that shapes how we set our roadmap and price our runners.
CI runners and code review are the entire business. Not a side project. Not a product-market-fit experiment on the way to something else. No parent company is going to redirect Tenki's engineering team toward a different product category next quarter. The roadmap stays pointed at making GitHub Actions builds faster and code review deeper because that's the only thing the company does.
That matters in concrete ways. When Tenki's runners are 30-50% faster and 50% cheaper than GitHub's default runners (verified across real projects like Citrea and n8n on the benchmarks page), the investment behind those numbers is long-term. And when Tenki ships AI code review at $0.50 per review alongside those runners, it's because the products reinforce each other. Faster CI plus better review isn't two product bets hedging against each other. It's one thesis: ship better code, faster.
If you're choosing a managed runner provider right now, especially if you're migrating off one that just shut down, here's what to evaluate beyond the spec sheet:
Regardless of which platform you pick next, you can structure your CI configuration to minimize migration pain. Here's what to check right now:
Abstract your runner labels. Don't scatter vendor-specific runner labels across 40 workflow files. Define them as variables or in a reusable workflow, so swapping vendors means changing one file instead of forty.
# .github/workflows/runner-config.yml (reusable workflow)
on:
workflow_call:
outputs:
runner-label:
value: tenki-linux-x64-4
# Change this one value to migrate platforms
# .github/workflows/ci.yml
jobs:
setup:
uses: ./.github/workflows/runner-config.yml
build:
needs: setup
runs-on: ${{ needs.setup.outputs.runner-label }}Use the standard cache action. BuildJet had buildjet/cache@v4. Cirrus CI had its own cache directives. If you'd used actions/cache@v4 from the start, the cache step survives any runner swap.
Pin your base images. If your CI depends on specific tool versions, pin them in your workflow rather than relying on whatever the runner image ships. A setup-node@v4 with an explicit version works on any runner. Relying on the pre-installed Node on a specific vendor's image doesn't.
Keep secrets in GitHub, not the vendor. Store secrets in GitHub Actions' native secret management (or a dedicated vault like HashiCorp Vault). If your secrets live in the CI vendor's proprietary system, you're adding another dependency that breaks when the vendor disappears.
Audit your branch protection rules. Check which CI status checks are required for merge. If they reference vendor-specific check names, document what each one does so you can recreate the equivalent gates on a new platform quickly.
BuildJet and Cirrus CI won't be the last CI vendors to shut down. The structural dynamics that made them vulnerable haven't changed. AI labs are still hiring, VC-backed devtools companies are still getting acquired, and GitHub is still incrementally improving its own runners.
The lesson isn't "don't use managed runners." Managed runners are worth it. The performance and cost benefits are real. The lesson is to pick a vendor whose business model and ownership structure give you confidence they'll still be running your builds in two years, and to structure your CI so that if they're not, the migration is measured in days, not weeks.
Tags
Recommended for you
What's next in your stack.