How to Choose Between ARM and x86 CI Runners
Choose the runner architecture that matches where your code runs in production; ARM runners often cost less per minute and build ARM images natively without emulation.
If you deploy to ARM (Graviton, Ampere, Apple silicon), an ARM runner builds and tests natively instead of under slow QEMU emulation. If you ship x86, stay on x86. When you ship both, test both.
Selecting an ARM runner
.github/workflows/ci.yml
jobs:
build-arm:
runs-on: ubuntu-24.04-arm # native ARM64 runner
steps:
- uses: actions/checkout@v4
- run: uname -m # aarch64
- run: docker build -t myapp:arm64 .Testing both architectures
.github/workflows/ci.yml
jobs:
test:
strategy:
matrix:
runner: [ubuntu-latest, ubuntu-24.04-arm]
runs-on: ${{ matrix.runner }}
steps:
- uses: actions/checkout@v4
- run: npm ci && npm testTradeoffs
Native ARM builds avoid the large slowdown of cross-building ARM images on x86 via emulation. The catch is toolchain and dependency coverage: some prebuilt binaries and actions still assume x86, so verify your stack has ARM builds before switching.
Related guides
How to Pick a Runner for Docker Image BuildsChoose a runner for Docker builds by matching architecture to your image, ensuring enough disk and privileges…
How to Build a Matrix Across Different Runner TypesDrive runs-on from a matrix dimension to run one job across multiple runner types, mixing OS, architecture, a…