Repository navigation
ci: fix the v6 builds on Node 22 and Xcode 26 - #5101
Merged
Merged
Conversation
yarn.lock is not committed, so every CI install resolves dependencies from scratch. @types/react-native-web depends on react-native "*", which now resolves to react-native 0.87, and 0.87 requires Node ^22.13.0 || ^24.3.0. On Node 20, the root yarn install stops at its engines check before anything is built. The last green Android example build was on 2026-08-05, before react-native 0.87.0 was released on 2026-08-11; the iOS and JS workflows share the same install step. Run the shared setup-node action on Node 22 and point .nvmrc at the same version. The Android, iOS and JS workflows now also run when that action changes, since they did not pick up this change otherwise.
The iOS jobs asked xcodebuild for an "iPhone 16" simulator, which the current macos-latest image (Xcode 26) no longer has, so all three failed before compiling with "Unable to find a device matching the provided destination specifier". They only build, so target the generic iOS Simulator destination, which does not depend on the simulators installed on the runner.
With a simulator the jobs can find, the iOS example build failed compiling fmt's format.cc. React Native 0.78 bundles fmt 11.0.2, whose FMT_STRING usages Xcode 26's Apple Clang 21 rejects: "call to consteval function ... is not a constant expression". consteval does not exist before C++20, so build only the fmt pod as C++17, the same workaround as example/ios/Podfile on master (#5080).
Okelm
self-requested a review
September 15, 2026 13:29
Okelm
approved these changes
Sep 15, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Gets the v6 CI builds green again. Three separate breakages, each hidden behind the previous one: the dependency install fails on Node 20, the iOS jobs ask for a simulator the current macOS image no longer has, and React Native 0.78's fmt does not compile with Xcode 26.
Motivation
Node. On
support/6.x.x, the Android example build fails at the firstyarn install, before anything is built:yarn.lockis in.gitignore, so every CI install resolves dependencies from scratch.@types/react-native-webdeclaresreact-native: "*"as a regular dependency (all 0.19.x versions), so yarn installs the latest react-native next to the project's 0.78.^22.13.0 || ^24.3.0 || >= 26.0.0; 0.86 still accepted^20.19.4..github/actions/setup-nodeaction pins Node20.x.The last green Android example build on this branch was on 2026-08-05. It is what fails on #5099 and #5100.
build-iosandcheck-jsuse the same install step.iOS simulator. With the install fixed, all three iOS jobs failed at
xcodebuild, which asked for-destination 'platform=iOS Simulator,name=iPhone 16'. Themacos-latestimage now ships Xcode 26 with iPhone 17 / 16e / Air simulators only:fmt on Xcode 26. With a destination it can use, the iOS build failed compiling
fmt'sformat.cc. React Native 0.78 bundles fmt 11.0.2, and Xcode 26's Apple Clang 21 rejects itsFMT_STRINGusages.xcprettyhides the compiler output in CI; compiling fmt 11.0.2'sformat.ccfor the simulator with Xcode 26.6 locally gives 5 of these errors in C++20 and none in C++17:This is the problem #5080 fixed for the v7 example on master.
Changes
.github/actions/setup-node/action.yml: Node20.x→22.x(LTS until April 2027)..nvmrc:v18→v22, matching CI.build-ios.yml: the three jobs build forgeneric/platform=iOS Simulator. They only build and never run the app, so they do not need a specific device, and this no longer breaks when the runner image changes its simulators.examples/bare/ios/Podfile: builds only thefmtpod as C++17 (consteval does not exist before C++20), throughuse_test_app!'s:post_install; the same workaround asexample/ios/Podfileon master.Podfile.lockis left alone: it was already out of date (React 0.78.2, different Podfile checksum) and CI resolves pods on every run.build-android,build-iosandcheck-jsalso trigger on changes to.github/actions/setup-node/**. Without this, none of them ran for a change to the action they all use, so this PR could not have tested itself.Not changed, for the maintainers to decide: committing
yarn.lock, or pinning the nestedreact-nativewithresolutions. Either would stop unrelated releases from breaking CI in the same way again; this PR only fixes the current break. Also note that--immutablein the install step is a Yarn Berry flag, and CI runs Yarn 1, so the install is not actually immutable.Test plan
All checks on this PR pass:
yarn install(log above, from feat(android): support Media3 1.9 in the load control and re-enable bufferingStrategy #5099). After the Node change, both Android builds and the JS checks passed; the iOS jobs got past install andpod installand failed on the destination, then on fmt, and pass with all three commits.