Xcode 27 runner image on GitHub-hosted macOS moves to macOS 27
Maya Okonkwo
The Xcode 27 runner image for GitHub-hosted macOS now runs on macOS 27, per the September 10 changelog. The image previously ran on macOS 26. It stays in public preview and remains arm64-only. For any repo that pinned xcode-27 or xcode-27-xlarge in runs-on:, the OS under the build changes on the next scheduled job, with no config edit and no notice from your side.
What moved
Only the operating system layer under the image. The label names are unchanged; the changelog's guidance is to keep using the same labels. The Xcode major version is still 27, so the compiler surface a build sees is the one that shipped when this image first entered public preview in July.
The direction is consistent with the naming split GitHub introduced at that July preview: images are keyed to the Xcode major version, and the OS underneath is treated as a separate variable that can move on its own. This bump is the first time we get to see that mechanic in production on a live image.
Where it bites
An OS bump under a compiler you already trust is the quiet kind of change. It does not touch your runs-on: line and it will not fail a lint. It can, however, move system-framework behaviour, notarisation defaults, simulator runtimes, and any tool that shells out to a macOS binary. Anything a build implicitly assumes about the host OS is now a floating assumption unless the job asserts it.
Two habits worth revisiting on the next iOS CI PR:
- Snapshot the runner's OS and toolchain versions at the top of every job (
sw_vers,xcodebuild -version,xcrun simctl list runtimes) and archive that log alongside the build output. When the image floats again, a bisect starts with a diff instead of a guess. - Keep a canary job on the previous known-good combination if you own a macOS host or a self-hosted runner.
xcode-27on macOS 26 is now gone from the hosted fleet; if you need to compare, you need your own copy.
Continuity note
The release cadence itself does not change. The image is still in preview, the labels still stay, and the compiler is still the one teams have been testing since July. What moved is the OS the build boots on, which is exactly the axis GitHub's newer image-naming model was designed to let move on its own. Preview is preview: on this label, GitHub can do this again.
Source: GitHub Changelog (github.blog)