chore(ci): migrate iOS CI runners from macOS Sequoia to Tahoe for Xcode 26.x support#28433
Conversation
|
CLA Signature Action: All authors have signed the CLA. You may need to manually re-run the blocking PR check if it doesn't pass in a few minutes. |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 2 potential issues.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 1a09ba3. Configure here.
| ANDROID_API_LEVEL: ${{ inputs.android-api-level }} | ||
| ANDROID_ABI: ${{ inputs.android-abi }} | ||
| run: | | ||
| IMAGE="system-images;android-$ANDROID_API_LEVEL;google_apis;$ANDROID_ABI" |
There was a problem hiding this comment.
Hardcoded google_apis ignores android-tag input
Low Severity
The "Install additional Android SDK components" step hardcodes google_apis in the system image path instead of using ${{ inputs.android-tag }} (or an ANDROID_TAG env variable). The AVD creation step at line 164 correctly uses $ANDROID_TAG. Additionally, the if condition on line 135 only checks android-api-level and android-abi but not android-tag, so a non-default tag alone won't trigger the install at all. Together, these cause a mismatch: the wrong image gets installed, or no image gets installed, leading to AVD creation failure.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit 1a09ba3. Configure here.
| setup-simulator: | ||
| description: 'Whether to setup simulator/emulator' | ||
| required: false | ||
| default: 'false' |
There was a problem hiding this comment.
setup-simulator input declared but never used
Medium Severity
The setup-simulator input is defined and accepted by the action, and callers pass meaningful values for it (e.g., update-e2e-fixtures.yml passes true, run-e2e-workflow.yml passes ${{ inputs.platform == 'ios' }}), but no step in the action references inputs.setup-simulator. This means simulator/emulator setup is silently skipped regardless of the value, which can cause downstream E2E test failures on workflows that depend on a booted simulator being available.
Reviewed by Cursor Bugbot for commit 1a09ba3. Configure here.
🔍 Smart E2E Test Selection
click to see 🤖 AI reasoning detailsE2E Test Selection:
Since these changes affect the entire E2E infrastructure (runner environment, setup action, simulator device), ALL test suites need to run to validate that:
No app code was changed, so this is purely a CI infrastructure validation. Running all tags is the conservative and correct approach to ensure the new infrastructure works end-to-end. Performance Test Selection: |
|
|
✅ E2E Fixture Validation — Schema is up to date |





Description
Apple requires all iOS and iPadOS apps to be built with the iOS 26 SDK (Xcode 26 or later) starting April 28, 2026. A previous commit (#27726) bumped the pinned Xcode version from
16.3to26.3, but all iOS CI runner images were still pointing to macOS Sequoia (sequoia/sequoia-xl). The Sequoia images only ship with Xcode 16.x, soxcodes select 26.3(orxcode-select -s /Applications/Xcode_26.3.app) would fail with "invalid developer directory".This PR migrates every iOS CI runner image from
ghcr.io/cirruslabs/macos-runner:sequoia[-xl]toghcr.io/cirruslabs/macos-runner:tahoe[-xl], which ships with the 3 latest Xcode versions including 26.3 and thexcodesCLI tool. The Xcode selection step inbuild.ymlis also updated to usexcodes select 26.3per the Cirrus Labs recommended approach for their multi-Xcode runner images. Theactionlint.yamlrunner allowlist is updated accordingly to prevent false lint failures.Files changed:
.github/actionlint.yaml— update self-hosted runner allowlist totahoe/tahoe-xl.github/workflows/build.yml— runnersequoia-xl→tahoe-xl; Xcode selection updated toxcodes select 26.3.github/workflows/setup-node-modules.yml— runnersequoia-xl→tahoe-xl(must match build consumer for native dep symlinks).github/workflows/build-ios-e2e.yml— runnersequoia-xl→tahoe-xl.github/workflows/run-e2e-smoke-tests-ios-flask.yml— runnersequoia→tahoe.github/workflows/run-e2e-workflow.yml— runnersequoia→tahoe.github/workflows/update-e2e-fixtures.yml— runnersequoia→tahoe.github/workflows/upload-to-testflight.yml— runnersequoia-xl→tahoe-xlChangelog
CHANGELOG entry: null
Related issues
Fixes:
Manual testing steps
N/A
Screenshots/Recordings
Before
N/A
After
N/A
Pre-merge author checklist
Pre-merge reviewer checklist
Made with Cursor
Note
Medium Risk
Medium risk because it changes CI runner images and Xcode selection logic across multiple iOS build/E2E workflows; misconfiguration could break iOS builds/tests despite minimal product-code impact.
Overview
Migrates iOS CI execution to Cirrus Labs
tahoe/tahoe-xlrunners across build, TestFlight upload, E2E, and fixture-update workflows to ensure Xcode 26.x availability.Standardizes Xcode selection by switching the iOS build workflow to
xcodes select 26.3.Brings E2E setup in-repo by adding a composite action
./.github/actions/setup-e2e-envand updating workflows to use it, and updates Detox’s default iOS simulator fromiPhone 15 ProtoiPhone 16 Pro(plus matching docs).Reviewed by Cursor Bugbot for commit 4cea412. Bugbot is set up for automated code reviews on this repo. Configure here.