Running Xcode 26 on GitHub Actions
Moving CI to a new major Xcode is mostly about controlling when it happens. This is the order that has caused the least breakage across the open-source projects we have run on Manzanita.
1. Get a lane on Xcode 26 without touching the default
jobs:
xcode26:
runs-on: manzanita-standard # macOS 26.6.2 · Xcode 26.6 · Swift 6.3.3
continue-on-error: true
steps:
- uses: actions/checkout@v5
- run: xcodebuild -version
- run: xcodebuild build -scheme App -destination 'generic/platform=iOS'
On GitHub-hosted runners the equivalent is runs-on: macos-26 plus an explicit xcode-select. Keep continue-on-error until the lane is green, so it reports without blocking merges.
2. Read the first failing build in this order
- Swift 6 language mode diagnostics. Strict concurrency errors are the most common first failure. Set
SWIFT_STRICT_CONCURRENCYor the package'sswiftLanguageModesdeliberately rather than letting the toolchain default decide. - Simulator destinations. Device names change between runtimes. Prefer
-destination 'platform=iOS Simulator,OS=latest,name=iPhone 17 Pro'and read the simulator guide for what is prewarmed. - Pinned tools.
xcprettyis not part of the Manzanita contract; usexcbeautifyor pipe raw output. CocoaPods and Fastlane are installed; pin versions with Bundler if a workflow depends on a specific one. - Paths. Xcode is at
/Applications/Xcode.app;pythonandpython3both resolve; Homebrew arm64 paths are onPATH.
3. Keep an Xcode 16 lane until you delete it on purpose
xcode16:
runs-on: manzanita-xcode16 # macOS 15.7.7 · Xcode 16.4
Both labels are immutable images. When you are done, remove the job; the label will not disappear from under you.
4. Then flip the default
Swap the two labels, drop continue-on-error, and update required checks in branch protection. The whole migration is two label edits and one branch-protection change.
Exact versions
The Standard image is macOS Tahoe 26.6.2 (25G83), Xcode 26.6 (17F113), Swift 6.3.3, iOS 26.5 simulator runtime, plus Python 3.14, Node 24, Ruby 4.0, Java 17, CocoaPods and Fastlane. The full list, the digest, and the manifest URL are in the image contract.
runs-on to manzanita-standard and keep everything else. Start free · Read the docs