[No QA] Update iOS build workflows to Xcode 26.6 - #97452
Merged
Merged
Conversation
All iOS build jobs selected Xcode by pinning DEVELOPER_DIR to Xcode_26.2.app, set back in January when 26.2 became the runner image default. Since then the macOS jobs moved to Blacksmith macos-latest, which tracks the macOS 26 image where Xcode 26.5 is the default and 26.6 is the newest available. This bumps all five pins to Xcode_26.6.app so the iOS builds use the newest toolchain and simulator runtimes on the image instead of running three releases behind it: - buildIOS.yml (reusable build, called from deploy/verifyHybridApp/buildAdHoc) - deploy.yml (iosUploadTestflight and iosSubmit Fastlane jobs) - remote-build-ios.yml (Rock remote build matrix) - publishReactNativeiOSArtifacts.yml (workflow-level env for both jobs) There is no single source of truth for the version, so all occurrences change together. The previous two bumps each shipped as a follow-up commit because deploy.yml was missed, which broke the staging deploy.
Contributor
|
🚧 mountiny has triggered a test Expensify/App build. You can view the workflow run here. |
Contributor
|
🧪🧪 Use the links below to test this adhoc build on Android, iOS, and Web. Happy testing! 🧪🧪
|
Contributor
Author
|
Tested the ios build and its all fine |
lakchote
approved these changes
Jul 30, 2026
mjasikowski
approved these changes
Jul 30, 2026
Contributor
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppAndroid: mWeb ChromeiOS: HybridAppiOS: mWeb SafariMacOS: Chrome / SafariMacOS: Desktop |
Contributor
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
49 tasks
Contributor
|
🚀 Deployed to staging by https://github.com/mountiny in version: 9.4.47-0 🚀
|
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.
Explanation of Change
All iOS build jobs in this repo select Xcode by pinning the
DEVELOPER_DIRenvironment variable to/Applications/Xcode_26.2.app/Contents/Developer. That pin was set in Update Xcode version to 26.2 in Rock iOS build workflows in January 2026.Since then the macOS jobs moved to Blacksmith
macos-latestrunners, which track the macOS 26 image and mirror the GitHub-hosted macOS 26 runner image. That image now ships Xcode 26.0.1, 26.1.1, 26.2, 26.3, 26.4.1, 26.5 (default) and 26.6 (build 17F113) — so the builds run three releases behind the image default, compiling against an older toolchain and older simulator runtimes than the runner otherwise provides. The four macOS jobs that don't setDEVELOPER_DIRare already on the image default, so the build jobs and the rest of CI disagree about which Xcode they use.This PR bumps all five pins to
/Applications/Xcode_26.6.app/Contents/Developer:.github/workflows/buildIOS.ymlbuild— the reusable iOS build, called fromdeploy.yml,verifyHybridApp.yml,buildAdHoc.yml.github/workflows/deploy.ymliosUploadTestflightandiosSubmit(Fastlane).github/workflows/remote-build-ios.ymlbuild(Rock remote build matrix).github/workflows/publishReactNativeiOSArtifacts.ymlenv, coversBuild iOS SliceandCompose XCFrameworkThere is no single source of truth for the version — no
.xcode-versionfile, nosetup-xcodeaction, andworkflow_calldoes not inheritenvfrom the caller — so all five occurrences change together in one commit. Worth noting for reviewers: the previous two bumps each needed a follow-up commit becausedeploy.ymlwas missed, and that broke the staging deploy.Two follow-ups are tracked in the linked issue and deliberately not done here:
Mobile-Expensify/.github/workflows/lint-swift.ymlis still on Xcode 16.2.0 but lives in the submodule (separate PR), and agetXcodeVersioncomposite action would stop this drifting again.Fixed Issues
$ #97450
Tests
Because this PR only touches
.github/**, no iOS build is triggered automatically —remote-build-ios.ymlhaspaths-ignore: ['.github/**', ...]on its push trigger, andverifyHybridApp.ymlonly fires on native-source /package.json/Podfile.lockpaths. The builds below must be dispatched manually against this branch.remote-build-ios.ymlagainst this branch withreviewed_code=true.xcode-select: error: invalid developer directoryorxcrun: error: unable to find utility, which would mean Xcode 26.6 is not present on the Blacksmith image.New Expensify Dev,Expensify Dev, and the remaining schemes) compiles successfully.testBuild.ymlagainst this branch withIOS=trueandREVIEWED_CODE=trueto exercise the HybridApp path throughbuildIOS.yml.Two jobs cannot be verified before merge and need watching afterwards:
deploy.yml(iosUploadTestflight,iosSubmit) only runs onstaging/productiondeploys, so the first staging deploy after merge must be watched. This is the exact job that regressed on the previous two bumps.publishReactNativeiOSArtifacts.ymlisworkflow_call-only and runs viapublishReactNativeArtifacts.yml; confirm the next artifact-publish run onmainproduces the XCFramework.Offline tests
N/A — this changes CI workflow configuration only and has no runtime or network behavior.
QA Steps
[No QA] — this is a CI infrastructure change with no user-facing behavior.
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectiontoggleReportand notonIconClick)Avatar, I verified the components usingAvatarare working as expected)StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))npm run compress-svg)Avataris modified, I verified thatAvataris working as expected in all cases)Designlabel and/or tagged@Expensify/designso the design team can review the changes.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps.Screenshots/Videos
Android: Native
Not yet tested — needs manual QA.
Android: mWeb Chrome
Not yet tested — needs manual QA.
iOS: Native
Not yet tested — needs manual QA.
iOS: mWeb Safari
Not yet tested — needs manual QA.
MacOS: Chrome / Safari
Not yet tested — needs manual QA.