Skip to content

ci(e2e): stop pinning the scene E2E simulator model - #668

Merged
mahmoud-elmorabea merged 2 commits into
mainfrom
ci/scene-e2e-simulator
Oct 23, 2026
Merged

mahmoud-elmorabea merged 2 commits into
mainfrom
ci/scene-e2e-simulator

Conversation

@Shahroz16

@Shahroz16 Shahroz16 commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Refs MBL-2397

Problem

The scheduled React Native scene routing E2E has failed every day since 2026-09-18 (last green: 2026-09-17), before it builds anything:

error: no available 'iPhone 17 Pro' simulator on iOS 27; set E2E_DEVICE_ID, E2E_SIMULATOR_NAME, or E2E_IOS_RUNTIME_MAJOR

The xcode-27-arm64 runner image changed under it. From 20260912.0186.1, the image ships the Xcode 27 GM (27A266a, iOS 27.0 runtime 24A434) instead of beta 27A5252f. Its iOS 27.0 simulator set is iPhone 17, iPhone 17e, iPhone 18 Pro, iPhone 18 Pro Max and iPhone Air (image readme). The workflow pinned E2E_SIMULATOR_NAME: iPhone 17 Pro, which no longer exists.

PR runs didn't catch it because the full lane only runs when scene-routing paths change. Every recent "Full React Native scene routing E2E" PR run shows green only because full-scene-e2e was skipped.

Change

  • react-native-scene-e2e.yml: drop the E2E_SIMULATOR_NAME pin.
  • run_scene_push.sh: when neither E2E_DEVICE_ID nor E2E_SIMULATOR_NAME is set and no iPhone is booted, pick the newest numbered iPhone N Pro on the requested runtime, then fall back to any iPhone on it. An explicit E2E_SIMULATOR_NAME still fails if that model is missing. The chosen simulator is logged.
  • .maestro/README.md: document the selection order.
  • Second commit: the scene host now uses the released React Native 0.88.0 instead of 0.88.0-nightly-20260823-0c7f63a4e. The nightly was pinned only because 0.88 had no release yet. 0.88.0 ships the same scene APIs the fixtures call (RCTReactNativeFactory startReactNativeWithModuleName:inWindow:connectionOptions:, RCTLinkingManager scene:openURLContexts: / scene:continueUserActivity:), and every package the script pins (react-native, @react-native/new-app-screen, babel-preset, eslint-config, jest-preset, metro-config, typescript-config) exists at 0.88.0. It also keeps the host installable once the package declares a real react-native peer range (feat!: require React Native 0.77 or later #671): npm rejects prereleases against such ranges. RN 0.88.0 requires react ^19.3.0 while the 0.87.0 template pins 19.2.3 (the nightly accepted ^19.2.3), so the script also sets react / react-test-renderer to 19.3.0. Reproduced locally: with 19.2.3, npm install fails with ERESOLVE; with 19.3.0, it and the SDK tarball install succeed.

Verification

  • Selection checked against fixtures. On the runner's iOS 27 set it picks iPhone 18 Pro. With no Pro it picks iPhone Air. iPhone 18 Pro beats 17 Pro and 9 Pro (numeric sort). Pro Max, other runtimes and iPads never win. With no iPhone, or with an explicit missing name, it exits 2.
  • On a local Mac with Xcode 27 GM it picks iPhone 18 Pro (iOS 27.0) and iPhone 17 Pro (iOS 26.2).
  • bash -n, shellcheck -S warning and actionlint pass.
  • The full scene E2E lane passed on this PR at the first commit (run 39460429945): Using simulator iPhone 18 Pro (…, com.apple.CoreSimulator.SimRuntime.iOS-27-0), then warm/terminated notification routing and ordinary-link flows on the Xcode 27 GM image. It's the first green run of this lane since 2026-09-17, so the beta-era xcodebuild failure below didn't recur. It passed again on the 0.88.0 commit (run 39489475424, ae9909e6): RN 0.88.0 stable + React 19.3.0, iPhone 18 Pro / iOS 27.0, no nightly references in the log.

Caveat

Before the GM image, the nightly also failed 3 times (2026-09-12/13/15) in xcodebuild with the following command failed with exit code 0 but produced no further output on the Xcode 27 beta. This PR doesn't touch that. If it recurs on the GM image, it will show up in this PR's run.

Codex review

Second commit: Codex flagged the React 19.3.0 peer mismatch (high). It's fixed and reproduced as above. It found no nightly-only dependency in the Swift/Ruby fixtures, and all seven pinned packages exist at 0.88.0.

First commit:
Codex (gpt-6.1-sol, high) did an adversarial review and found no actionable findings. It verified the jq numeric sort, anchored-regex handling of Pro Max/SE/Plus, // fallback on empty arrays, set -euo pipefail behaviour, that the xcodebuild destination uses the chosen UDID, that the flows use text selectors rather than coordinates, and that the full PR lane triggers for these paths. Like this PR, it can't prove the whole nightly passes past simulator selection; this PR's own full-lane run covers that.

🤖 Generated with Claude Code

The nightly "React Native scene routing E2E" has failed every day since
2026-09-18 with "no available 'iPhone 17 Pro' simulator on iOS 27". The
xcode-27-arm64 runner image 20260912 (Xcode 27 GM, 27A266a) replaced the
beta's simulator set: iOS 27.0 now ships iPhone 17, 17e, 18 Pro, 18 Pro Max
and Air, so the hardcoded model no longer exists. PR runs never caught it
because the full lane only runs when scene-routing paths change.

Drop the model pin from the workflow and, when neither E2E_DEVICE_ID nor
E2E_SIMULATOR_NAME is set and no iPhone is booted, pick the newest numbered
iPhone Pro on the requested runtime, falling back to any iPhone. An explicit
E2E_SIMULATOR_NAME still fails if that model is missing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The scene host pinned 0.88.0-nightly-20260823 because 0.88 had no release
when the lane was written. 0.88.0 is out and ships the same scene APIs the
fixtures use (RCTReactNativeFactory startReactNativeWithModuleName:inWindow:
connectionOptions:, RCTLinkingManager scene:openURLContexts: and
scene:continueUserActivity:), so test the release customers install.

0.88.0 requires react ^19.3.0 while the 0.87.0 template pins 19.2.3 (the
nightly accepted ^19.2.3), so also set react and react-test-renderer to
19.3.0; without that, npm install fails with ERESOLVE.

It also keeps the host installable once the package declares a real
`react-native` peer range: npm only matches a prerelease against a range
naming the same x.y.z, so the nightly would fail it.

Refs MBL-2397

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@mahmoud-elmorabea
mahmoud-elmorabea merged commit 882499a into main Oct 23, 2026
24 checks passed
@mahmoud-elmorabea
mahmoud-elmorabea deleted the ci/scene-e2e-simulator branch October 23, 2026 10:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants