Skip to content
OnARM.Net

CI/CD for Windows on Arm: GitHub Actions windows-11-arm and Alternatives

Updated Jun 5, 2026

As of 2026 you can build and test Windows on Arm in CI without owning Arm hardware. GitHub ships a hosted Arm64 Windows runner, and for the cases it doesn’t cover there are clean fallbacks.

The state of Arm CI in 2026

GitHub’s windows-11-arm hosted runner — a Windows 11 desktop Arm64 image with preinstalled tooling, 4 vCPU standard — went generally available for public repositories on August 7, 2025, free for public repos. That makes native Arm64 build-and-test a first-class CI target, not a self-hosted side project.

The gotcha that will bite you

windows-11-arm only works in public repositories. In a private repo the job fails outright. For private projects you need larger/paid Arm runners or a self-hosted Arm agent. Check this before you wire it into a private pipeline.

A minimal working workflow

name: build-arm64
on: [push, pull_request]
jobs:
  arm64:
    runs-on: windows-11-arm   # public repos only
    steps:
      - uses: actions/checkout@v4
      - uses: microsoft/setup-msbuild@v2
      - name: Build ARM64
        run: msbuild MyApp.sln /p:Platform=ARM64 /p:Configuration=Release
      - name: Test on-target
        run: ctest --output-on-failure

The win here is that build and test run on real Arm64 — your test suite exercises native code paths, not emulated ones.

Cross-compile vs native: pick per stage

  • Cross-compile on x64 (windows-latest + /p:Platform=ARM64) is faster and cheaper, but you can’t run the resulting Arm64 binaries on the x64 runner — no native test execution.
  • Native on windows-11-arm builds and runs tests on-target.

The pragmatic matrix: cross-compile the build on x64 for speed, then a separate windows-11-arm job that builds and runs the test suite. For driver or anti-cheat code, on-target testing isn’t optional — emulation can’t exercise kernel components (why).

Private repos and other platforms

For private repositories: GitHub’s larger Arm runners (paid), or a self-hosted Arm agent on a retail Snapdragon X laptop or a cloud Arm Windows VM. Azure DevOps can use Arm-based VMs (Ampere/Cobalt) as self-hosted agents.

Close the loop

Once your pipeline publishes the Arm64 build to winget, the Microsoft Store, or GitHub Releases, compatibility trackers detect it — ours re-scans winget and GitHub release metadata and flips your entry to native automatically. Pair this guide with the porting roadmap (what to build) and watch the native-share trend you’re contributing to.

← All guides