Skip to content

fix(mobile): Xcode 26 SDK for iOS upload + hermesc path for Android#14396

Merged
raymondjacobson merged 1 commit into
mainfrom
rj-mobile-release-retry-3
May 23, 2026
Merged

fix(mobile): Xcode 26 SDK for iOS upload + hermesc path for Android#14396
raymondjacobson merged 1 commit into
mainfrom
rj-mobile-release-retry-3

Conversation

@raymondjacobson
Copy link
Copy Markdown
Member

Summary

Two real failures surfaced in run 26319345276 after the displayer fix in #14394 made fastlane log altool errors again.

1. iOS RC + Prod — Apple now requires iOS 26 SDK

altool now returns:
```
ERROR: Validation failed (409) SDK version issue. This app was built with the iOS 18.5 SDK.
All iOS and iPadOS apps must be built with the iOS 26 SDK or later, included in Xcode 26 or
later, in order to be uploaded to App Store Connect or submitted for distribution.
(ID: 287c542e-3971-4158-b3c3-71eb1fcd6eb3)
```

The `macos-15` runners ship Xcode 16.4 (iOS 18.5 SDK) by default — that's why gym archived fine but altool rejected the upload. Switch both iOS jobs to `macos-26` (Tahoe, GA), which has Xcode 26 as the only supported major.

2. Android RC + Prod — hermesc binary lookup also anchored at the wrong root

```
Couldn't determine Hermesc location. Please set `react.hermesCommand` to the path of the
hermesc binary file. node_modules/react-native/sdks/hermesc/%OS-BIN%/hermesc
```

#14394 restored `react.root` to its default (`../.. = packages/mobile`) to unblock the Hermes JS bundle's `entryFile` lookup. But the same gradle plugin uses `root` for hermesc detection too (`PathUtils.kt#detectOSAwareHermesCommand` → only checks `root/node_modules/react-native/sdks/hermesc/...`), and RN is hoisted to the monorepo `node_modules` so that path doesn't exist.

Set `react.hermesCommand` explicitly to the hoisted prebuilt:
```groovy
hermesCommand = "$rootDir/../../../node_modules/react-native/sdks/hermesc/%OS-BIN%/hermesc"
```
The `%OS-BIN%` placeholder is substituted by the plugin at runtime (linux64-bin / osx-bin / win64-bin). Verified all three subdirs exist in `node_modules/react-native/sdks/hermesc/` after `npm ci`.

Housekeeping

Test plan

  • Merge → version-check fires all 4 binary jobs
  • Android RC + Prod reach `fastlane releaseCandidate` / `prod` (no `Couldn't determine Hermesc location`)
  • iOS RC + Prod reach App Store Connect (no `SDK version issue` 409)
  • Slack notification fires from the success branch of each iOS / Android job

🤖 Generated with Claude Code

Two real failures surfaced in run 26319345276 after the displayer fix
in #14394 made fastlane log altool errors again:

### iOS RC + Prod — Apple now requires iOS 26 SDK

altool 409 Validation failed:

  This app was built with the iOS 18.5 SDK. All iOS and iPadOS apps
  must be built with the iOS 26 SDK or later, included in Xcode 26
  or later, in order to be uploaded to App Store Connect or submitted
  for distribution. (ID: 287c542e-…)

The `macos-15` runners default to Xcode 16.4 (iOS 18.5 SDK). Switch
both iOS upload jobs to `macos-26` (Tahoe, GA), which has Xcode 26
as the only supported major.

### Android RC + Prod — hermesc location anchored at the wrong root

  Couldn't determine Hermesc location. Please set `react.hermesCommand`
  to the path of the hermesc binary file.
  node_modules/react-native/sdks/hermesc/%OS-BIN%/hermesc

The previous PR restored `react.root` to its default
(`../..` = `packages/mobile`) to fix the Hermes JS bundle's entryFile
lookup. The same plugin uses `root` to detect the prebuilt hermesc
binary (PathUtils.kt#detectOSAwareHermesCommand) and only checks
`root/node_modules/react-native/sdks/hermesc/...`. Since RN is
hoisted to the monorepo node_modules, that lookup fails.

Set `react.hermesCommand` explicitly to the hoisted prebuilt path:

  $rootDir/../../../node_modules/react-native/sdks/hermesc/%OS-BIN%/hermesc

The `%OS-BIN%` placeholder is substituted at runtime by the plugin
to `linux64-bin` / `osx-bin` / `win64-bin` as appropriate. Verified
those bin directories exist in node_modules/react-native/sdks/hermesc/
in this branch.

### Housekeeping

- `Gemfile.lock` dependency line aligned to `= 2.234.0` to match the
  Gemfile pin from #14394 (the squash-merge left the lock at the
  pre-pin `>= 2.228.0` constraint).
- Bump versions to re-fire the build matrix:
  `1.5.182 -> 1.5.183`, iOS `1.1.195 -> 1.1.196`, Android `1.1.531
  -> 1.1.532`.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented May 23, 2026

⚠️ No Changeset found

Latest commit: f9b4610

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@raymondjacobson raymondjacobson merged commit fa4a923 into main May 23, 2026
3 checks passed
@raymondjacobson raymondjacobson deleted the rj-mobile-release-retry-3 branch May 23, 2026 01:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant