Updated September 5, 2026

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

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.

Try it on your own workflow. One Standard runner is free for 14 days or 300 build minutes, no card. Change runs-on to manzanita-standard and keep everything else. Start free · Read the docs

Related