Skip to content

engineering

Migrating CI to arm64: what actually breaks

We moved 200 repositories to arm64 runners. Here is the complete list of what failed and why.

Priya Raghavan · Infrastructure · 2026-05-06 · 8 min read

arm64 is cheaper per minute and often faster. The migration is usually straightforward. When it is not, the cause is almost always the same category of thing.

What broke, in order of frequency

  1. Transitive native Node modules with no aarch64 prebuild, falling back to a slow source compile
  2. Python packages with no manylinux_aarch64 wheel, compiling from source
  3. Docker base images pinned to an amd64-only tag
  4. Service containers with no arm64 variant, silently falling back to emulation
  5. Cache keys without runner.arch, restoring x64 artefacts onto arm64 and producing linker errors

What did not break

Almost all pure application code. Go, Rust, Java, Ruby, PHP and modern Node all cross cleanly. The failures were concentrated in native dependency edges, not in the languages themselves.

Your next build could be twice as fast, at half the price

Start free. Migrating away is the same one line, and we publish that diff too.