Skip to content

chore(ci): migrate iOS CI runners from macOS Sequoia to Tahoe for Xcode 26.x support#28433

Merged
Cal-L merged 5 commits into
mainfrom
chore/update-macos-to-tahoe
Apr 7, 2026
Merged

chore(ci): migrate iOS CI runners from macOS Sequoia to Tahoe for Xcode 26.x support#28433
Cal-L merged 5 commits into
mainfrom
chore/update-macos-to-tahoe

Conversation

@tommasini

@tommasini tommasini commented Apr 6, 2026

Copy link
Copy Markdown
Contributor

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.3 to 26.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, so xcodes select 26.3 (or xcode-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] to ghcr.io/cirruslabs/macos-runner:tahoe[-xl], which ships with the 3 latest Xcode versions including 26.3 and the xcodes CLI tool. The Xcode selection step in build.yml is also updated to use xcodes select 26.3 per the Cirrus Labs recommended approach for their multi-Xcode runner images. The actionlint.yaml runner allowlist is updated accordingly to prevent false lint failures.

Files changed:

  • .github/actionlint.yaml — update self-hosted runner allowlist to tahoe / tahoe-xl
  • .github/workflows/build.yml — runner sequoia-xltahoe-xl; Xcode selection updated to xcodes select 26.3
  • .github/workflows/setup-node-modules.yml — runner sequoia-xltahoe-xl (must match build consumer for native dep symlinks)
  • .github/workflows/build-ios-e2e.yml — runner sequoia-xltahoe-xl
  • .github/workflows/run-e2e-smoke-tests-ios-flask.yml — runner sequoiatahoe
  • .github/workflows/run-e2e-workflow.yml — runner sequoiatahoe
  • .github/workflows/update-e2e-fixtures.yml — runner sequoiatahoe
  • .github/workflows/upload-to-testflight.yml — runner sequoia-xltahoe-xl

Changelog

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

  • I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed).
  • I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots.

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-xl runners 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-env and updating workflows to use it, and updates Detox’s default iOS simulator from iPhone 15 Pro to iPhone 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.

@tommasini tommasini self-assigned this Apr 6, 2026
@github-actions

github-actions Bot commented Apr 6, 2026

Copy link
Copy Markdown
Contributor

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.

@metamaskbot metamaskbot added the team-mobile-platform Mobile Platform team label Apr 6, 2026
@github-project-automation github-project-automation Bot moved this to Needs dev review in PR review queue Apr 6, 2026
@tommasini tommasini marked this pull request as ready for review April 6, 2026 22:45
@tommasini tommasini requested review from a team as code owners April 6, 2026 22:45
@github-actions github-actions Bot added the size-S label Apr 6, 2026
Comment thread .github/workflows/build-ios-e2e.yml
@github-actions github-actions Bot added the risk-medium Moderate testing recommended · Possible bug introduction risk label Apr 7, 2026
Cal-L
Cal-L previously approved these changes Apr 7, 2026

@Cal-L Cal-L left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@github-project-automation github-project-automation Bot moved this from Needs dev review to Review finalised - Ready to be merged in PR review queue Apr 7, 2026
@github-actions github-actions Bot added size-M risk-high Extensive testing required · High bug introduction risk and removed size-S risk-medium Moderate testing recommended · Possible bug introduction risk labels Apr 7, 2026

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

❌ 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"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 1a09ba3. Configure here.

setup-simulator:
description: 'Whether to setup simulator/emulator'
required: false
default: 'false'

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 1a09ba3. Configure here.

Cal-L
Cal-L previously approved these changes Apr 7, 2026

@Cal-L Cal-L left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@github-actions github-actions Bot removed the risk-high Extensive testing required · High bug introduction risk label Apr 7, 2026
@github-actions github-actions Bot added the risk-high Extensive testing required · High bug introduction risk label Apr 7, 2026
@github-actions github-actions Bot added risk-high Extensive testing required · High bug introduction risk and removed risk-high Extensive testing required · High bug introduction risk labels Apr 7, 2026
@github-actions

github-actions Bot commented Apr 7, 2026

Copy link
Copy Markdown
Contributor

🔍 Smart E2E Test Selection

  • Selected E2E tags: SmokeAccounts, SmokeConfirmations, SmokeIdentity, SmokeNetworkAbstractions, SmokeNetworkExpansion, SmokeTrade, SmokeWalletPlatform, SmokeRamps, SmokeMultiChainAPI, SmokePredictions, SmokePerps, SmokeCard, FlaskBuildTests
  • Selected Performance tags: None (no tests recommended)
  • Risk Level: high
  • AI Confidence: 88%
click to see 🤖 AI reasoning details

E2E Test Selection:
This PR makes significant CI/infrastructure changes that affect the entire E2E test pipeline:

  1. New local setup-e2e-env action: The setup-e2e-env composite action has been brought in-house from MetaMask/github-tools@v1.7.0 to a local .github/actions/setup-e2e-env/action.yml. This 362-line action handles the complete E2E environment setup for both iOS and Android (Node.js, Yarn, Ruby, CocoaPods, Android SDK, AVD creation, Xcode selection, keystore configuration, Foundry installation). Any issues in this new local action would break ALL E2E tests.

  2. macOS runner migration: All workflows have been updated from ghcr.io/cirruslabs/macos-runner:sequoiaghcr.io/cirruslabs/macos-runner:tahoe (and sequoia-xltahoe-xl). This is a new macOS version (Tahoe = macOS 26) with Xcode 26.x. This affects build-ios-e2e.yml, run-e2e-workflow.yml, run-e2e-smoke-tests-ios-flask.yml, setup-node-modules.yml, update-e2e-fixtures.yml, and upload-to-testflight.yml.

  3. iOS simulator device change: .detoxrc.js updated from iPhone 15 ProiPhone 16 Pro. This affects all iOS E2E tests as they now run on a different simulator model.

  4. Xcode selection method change: build.yml now uses xcodes select 26.3 instead of xcode-select -s, which is the method used in the new Tahoe runner environment.

Since these changes affect the entire E2E infrastructure (runner environment, setup action, simulator device), ALL test suites need to run to validate that:

  • The new macOS Tahoe runner can successfully build and run iOS apps
  • The local setup-e2e-env action correctly sets up the environment for both iOS and Android
  • The iPhone 16 Pro simulator works correctly with Detox tests
  • The Flask/Snaps build pipeline works on the new runner

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:
No app source code was changed in this PR - all changes are CI/infrastructure related (runner images, setup action, simulator device, Xcode selection). Performance tests measure app behavior, not CI infrastructure, so no performance tests are needed.

View GitHub Actions results

@sonarqubecloud

sonarqubecloud Bot commented Apr 7, 2026

Copy link
Copy Markdown

@github-actions

github-actions Bot commented Apr 7, 2026

Copy link
Copy Markdown
Contributor

E2E Fixture Validation — Schema is up to date
16 value mismatches detected (expected — fixture represents an existing user).
View details

@Cal-L Cal-L left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@Cal-L Cal-L added this pull request to the merge queue Apr 7, 2026
Merged via the queue into main with commit bc06cd5 Apr 7, 2026
111 checks passed
@Cal-L Cal-L deleted the chore/update-macos-to-tahoe branch April 7, 2026 23:25
@github-project-automation github-project-automation Bot moved this from Review finalised - Ready to be merged to Merged, Closed or Archived in PR review queue Apr 7, 2026
@github-actions github-actions Bot locked and limited conversation to collaborators Apr 7, 2026
@weitingsun weitingsun added release-7.74.0 Issue or pull request that will be included in release 7.74.0 and removed release-7.78.0 labels Apr 8, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

release-7.74.0 Issue or pull request that will be included in release 7.74.0 risk-high Extensive testing required · High bug introduction risk size-M team-mobile-platform Mobile Platform team

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

4 participants