Pin Xcode to 16.4 and default macOS runner to macos-15#488
Conversation
Reverts the `latest-stable` Xcode version introduced in OwnTube-tv#463 back to pinned 16.4, and changes the default runner-label from `macos-latest` to `macos-15` (which ships with Xcode 16.4). The `macos-latest` label now resolves to macOS 26 runners with Xcode 26.x, which is incompatible with Expo SDK 52 / React Native 0.76. Fixes OwnTube-tv#485
There was a problem hiding this comment.
Pull request overview
This PR fixes a critical CI/CD issue where iOS and tvOS builds were failing due to Xcode version incompatibility. The macos-15 runner now includes Xcode 26.3 RC alongside Xcode 16.x, and when latest-stable is used, it resolves to the incompatible 26.3 RC version. This PR reverts the Xcode version specification from latest-stable back to the pinned 16.4 version, and updates the default macOS runner from macos-latest to macos-15 for consistency.
Changes:
- Pin Xcode version to
16.4in all iOS/tvOS build workflows to ensure compatibility with Expo SDK 52 / React Native 0.76 - Update default macOS runner from
macos-latesttomacos-15in reusable workflow inputs and fallback configuration - Document the macOS runner and Xcode version constraints in CLAUDE.md to prevent future regressions
Reviewed changes
Copilot reviewed 5 out of 5 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
.github/workflows/testflight.yml |
Pin Xcode to 16.4 and change default runner to macos-15 for TestFlight builds |
.github/workflows/build_ios_simulator_app.yml |
Pin Xcode to 16.4 and change default runner to macos-15 for iOS simulator builds |
.github/workflows/build_tvos_simulator_app.yml |
Pin Xcode to 16.4 and change default runner to macos-15 for tvOS simulator builds |
.github/workflows/deploy-static-main.yml |
Update fallback runner from macos-latest to macos-15 |
CLAUDE.md |
Document macOS runner and Xcode version constraints for future reference |
| - **Xcode:** Pinned to `16.4` via `maxim-lobanov/setup-xcode@v1`. Do NOT use `latest-stable` — the `macos-15` runner now ships both Xcode 16.x and Xcode 26.3 RC, and `latest-stable` resolves to 26.x which is incompatible with React Native 0.76. Apple skipped versions 17–25 (jumped from 16 to 26). | ||
| - **Runner:** `macos-15` (default in reusable workflow inputs). Do NOT use `macos-latest` — it resolves to macOS 26. |
There was a problem hiding this comment.
The statement "it resolves to macOS 26" is incorrect. The macos-latest runner resolves to the latest stable macOS version (currently macOS 14 or 15), not "macOS 26".
The confusion appears to be between macOS versions and Xcode versions. While Xcode did skip from version 16 to 26, macOS versions follow a different sequential pattern (macOS 11, 12, 13, 14, 15, etc.).
The actual issue is that macos-latest currently points to a runner that may have different Xcode versions available than macos-15, which could cause build inconsistencies. The documentation should clarify this distinction.
| - **Xcode:** Pinned to `16.4` via `maxim-lobanov/setup-xcode@v1`. Do NOT use `latest-stable` — the `macos-15` runner now ships both Xcode 16.x and Xcode 26.3 RC, and `latest-stable` resolves to 26.x which is incompatible with React Native 0.76. Apple skipped versions 17–25 (jumped from 16 to 26). | |
| - **Runner:** `macos-15` (default in reusable workflow inputs). Do NOT use `macos-latest` — it resolves to macOS 26. | |
| - **Xcode:** Pinned to `16.4` via `maxim-lobanov/setup-xcode@v1`. Do NOT use `latest-stable` — the `macos-15` runner now ships both Xcode 16.x and Xcode 26.3 RC, and `latest-stable` resolves to Xcode 26.x which is incompatible with React Native 0.76. Apple skipped Xcode versions 17–25 (jumped from 16 to 26). | |
| - **Runner:** `macos-15` (default in reusable workflow inputs). Do NOT use `macos-latest` — it resolves to the latest stable macOS version (currently macOS 15), which may expose different Xcode versions than `macos-15` and can cause build inconsistencies. Do not confuse macOS versioning with Xcode’s jump from 16 to 26. |
|
|
||
| iOS/tvOS build workflows pin both the macOS runner image and Xcode version to ensure compatibility with Expo SDK 52 / React Native 0.76: | ||
|
|
||
| - **Xcode:** Pinned to `16.4` via `maxim-lobanov/setup-xcode@v1`. Do NOT use `latest-stable` — the `macos-15` runner now ships both Xcode 16.x and Xcode 26.3 RC, and `latest-stable` resolves to 26.x which is incompatible with React Native 0.76. Apple skipped versions 17–25 (jumped from 16 to 26). |
There was a problem hiding this comment.
The statement "latest-stable resolves to 26.x" should be more specific. According to the issue description and PR context, it resolves to "Xcode 26.3 RC" (Release Candidate), not a general "26.x" version. Using "26.x" might imply any 26.x version would be problematic, when the specific issue is with the RC version that's currently marked as latest-stable.
Consider revising to: "latest-stable resolves to Xcode 26.3 RC which is incompatible..." for accuracy.
| - **Xcode:** Pinned to `16.4` via `maxim-lobanov/setup-xcode@v1`. Do NOT use `latest-stable` — the `macos-15` runner now ships both Xcode 16.x and Xcode 26.3 RC, and `latest-stable` resolves to 26.x which is incompatible with React Native 0.76. Apple skipped versions 17–25 (jumped from 16 to 26). | |
| - **Xcode:** Pinned to `16.4` via `maxim-lobanov/setup-xcode@v1`. Do NOT use `latest-stable` — the `macos-15` runner now ships both Xcode 16.x and Xcode 26.3 RC, and `latest-stable` currently resolves to Xcode 26.3 RC, which is incompatible with React Native 0.76. Apple skipped versions 17–25 (jumped from 16 to 26). |
Summary
xcode-versionfromlatest-stableback to16.4in all iOS/tvOS build workflowsrunner-labelfrommacos-latesttomacos-15in reusable workflow inputs anddeploy-static-main.ymlfallbackContext
The
macos-15runner now ships Xcode 26.3 RC alongside 16.x, andlatest-stableresolves to 26.3 RC — which is incompatible with Expo SDK 52 / React Native 0.76 (Apple skipped versions 17–25). This broke all iOS/tvOS builds in downstream branded app repos despitePREFERRED_MACOS_RUNNERalready being set tomacos-15.Build log from cust-app-xrtube confirming the issue: https://github.com/OwnTube-tv/cust-app-xrtube/actions/runs/22347211910/job/64664815299
Reverts the
latest-stablechange from #463. Fixes #485.Test plan
grep -r "latest-stable" .github/workflows/returns no resultsgrep -r "macos-latest" .github/workflows/returns no results from iOS/tvOS/deploy workflows🤖 Generated with Claude Code