Skip to content

ci: build aarch64 and armv7l wheels on native ARM runners#774

Merged
bdraco merged 1 commit into
aio-libs:masterfrom
bdraco:ci/native-arm-wheels
May 19, 2026
Merged

ci: build aarch64 and armv7l wheels on native ARM runners#774
bdraco merged 1 commit into
aio-libs:masterfrom
bdraco:ci/native-arm-wheels

Conversation

@bdraco
Copy link
Copy Markdown
Member

@bdraco bdraco commented May 19, 2026

What do these changes do?

Move the aarch64 and armv7l legs of the odd-arch wheel matrix off the
x86_64 QEMU path and onto GitHub's public ubuntu-24.04-arm hosted
runner. aarch64 now builds natively with no emulation. armv7l still
gets docker/setup-qemu-action so binfmt registers a 32-bit ARM
handler whether or not the host kernel ships CONFIG_COMPAT; even
under emulation, running on an aarch64 host is far cheaper than the
previous aarch64-on-x86_64 layout.

ppc64le, s390x, and riscv64 keep the ubuntu-latest + QEMU setup
since there are no native GH-hosted runners for those.

The matrix gains an include: block that overrides runner-vm-os
and a native-arch flag per arch; the job-level qemu and
runner-vm-os expressions fall back to the previous behaviour for
the unmodified arches.

This is a port of aio-libs/yarl#1724 to frozenlist; the
reusable-cibuildwheel.yml already exposes a runner-vm-os input
so no change to the reusable workflow is needed.

Are there changes in behavior for the user?

No. Wheels are still built for the same architectures and tags; only
the host that builds them changes. CI time on the aarch64 leg should
drop significantly.

Related issue number

No tracking issue; mirrors aio-libs/yarl#1724.

Checklist

  • I think the code is well written
  • Unit tests for the changes exist — N/A (CI-only change, exercised by the next build run)
  • Documentation reflects the changes — N/A
  • If you provide code modification, please add yourself to CONTRIBUTORS.txt — already listed
  • Add a new news fragment into the CHANGES/ folder
Agent run details (optional, for reviewers)

Drafted with Claude Code (claude-opus-4-7); reviewed by @bdraco.

Local validation:

  • pre-commit run --files .github/workflows/ci-cd.yml CHANGES/774.contrib.rst docs/spelling_wordlist.txt — passed (yamllint, actionlint, GH workflow validation, codespell).
  • python -c "yaml.safe_load(open('.github/workflows/ci-cd.yml'))" confirms the matrix include: shape and the ${{ ! matrix.native-arch }} / ${{ matrix.runner-vm-os || 'ubuntu-latest' }} expressions parse cleanly.
  • make doc-spelling reports only the pre-existing unobvious misspelling in CHANGES/README.rst on master; the new fragment introduces aarch only, which is added to docs/spelling_wordlist.txt.

Not validated locally: actual native-ARM cibuildwheel run. The runner label and matrix wiring look correct, but the real proof is the first CI run on this branch.

GitHub now provides public hosted Linux ARM64 runners
(`ubuntu-24.04-arm`), so the aarch64 wheel build no longer needs to
run under QEMU emulation on x86_64. The armv7l build also moves to
the same aarch64 host; QEMU stays registered so binfmt picks up the
32-bit ARM userspace handler whether or not the host kernel has
CONFIG_COMPAT enabled, and even with emulation aarch64-on-aarch64
is far cheaper than the previous aarch64-on-x86_64 path.

The ppc64le, s390x, and riscv64 builds keep their ubuntu-latest +
QEMU setup since there are no native GH-hosted runners for those.

Each (qemu, tag) include combination is listed explicitly rather
than letting partial-key include merging fan out across both tag
values implicitly, and the qemu input is passed as a real boolean
expression (`! matrix.native-arch`) instead of string literals.
@bdraco bdraco marked this pull request as ready for review May 19, 2026 21:27
@bdraco bdraco merged commit f89218e into aio-libs:master May 19, 2026
58 of 59 checks passed
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