feat(ci): extend test-ios.yml to cover React Native iOS samples#163
Merged
Conversation
Previously test-ios.yml only built native iOS samples (samples/ios/*).
RN iOS sub-apps (samples/react-native/*/ios) had no CI coverage — the
gap that justified the dependabot manual-review exception for RN bumps.
find-projects now discovers both:
- native iOS: project.yml at samples/ios/<flow>/
- RN iOS: Podfile at samples/react-native/<flow>/ios/
Per-entry steps branch on project type:
- native iOS: existing flow (xcconfig + SPM + `xcodebuild test`)
- RN iOS: setup-node + yarn install (walk up to RN root) + pod install
+ `xcodebuild build` against the generated xcworkspace
`build` (not `test`) for RN — RN samples don't ship XCTest bundles; their
tests run via Jest, exercised by test-js.yml. The build alone validates
pod install, native module autolinking, and the iOS compile path.
The watch_root walk-up to package.json (same pattern test-android.yml
uses for RN Android) ensures JS-side changes correctly trigger the iOS
build for RN samples.
Once green, the dependabot manual-review exception for RN can be
dropped in a follow-up PR.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
`xcodebuild -resolvePackageDependencies` (native iOS) and `pod install` (RN iOS) both pay a non-trivial cold-fetch cost on every matrix entry. Cache the global source caches keyed on each project's lockfile / config: - Native iOS: ~/Library/Caches/org.swift.swiftpm and DerivedData SourcePackages, keyed on project.yml content. - RN iOS: ~/Library/Caches/CocoaPods (just the source archives, not the per-project Pods/ dir which `pod install` regenerates deterministically), keyed on Podfile.lock content. Saves ~30s per native iOS entry and ~90s per RN iOS entry on warm cache. Also bumps actions/cache to @v5 to match the rest of the repo. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…0.85.3 The login-pkce sample's package.json was bumped to react-native@0.85.3 but Podfile.lock still pinned 0.85.2 — drift that the new RN iOS CI coverage (test-ios.yml) caught on the first run. Regenerated via `yarn install && cd ios && pod install`. Also includes incidental quote-stripping in token-refresh's project.pbxproj (PRODUCT_BUNDLE_IDENTIFIER) that Xcode produced as a side effect. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1. fail-fast: true on the iOS test matrix. macOS minutes are ~10× Ubuntu's, so cancelling in-flight entries on the first failure saves real money. Other test workflows keep fail-fast: false (Linux runner cost is small). 2. login-pkce Podfile.lock fully regenerated after nuking Pods/. The earlier regeneration left Pods/Local Podspecs/React-Core-prebuilt.podspec.json stale at 0.85.2 because CocoaPods didn't invalidate that one cached spec, so the lockfile inherited 0.85.2 for React-Core-prebuilt while every other React pod was 0.85.3 — the drift that broke CI. Fresh install produces a uniformly 0.85.3 lock. pbxproj is incidental Xcode normalization. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ksroda-sa
marked this pull request as ready for review
May 14, 2026 09:19
ksroda-sa
requested review from
artursmolarek,
Copilot,
dfranco-sa,
jgutikonda-sa,
jkotiuk,
justintvnguyen,
lgonczarik and
rharasani-sa
and removed request for
Copilot
May 14, 2026 09:19
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.
Summary
Closes the only remaining CI gap that justified the dependabot manual-review exception for React Native: the iOS side of RN samples wasn't built in CI. Now it is.
What this changes
.github/workflows/test-ios.yml — extended from native-iOS-only to a unified workflow covering both native iOS and React Native iOS samples.
find-projects (Ubuntu, cheap)
Discovers both markers:
samples/ios/<flow>/project.yml(native, xcodegen)samples/react-native/<flow>/ios/Podfile(RN, CocoaPods)Same watch-root walk-up to
package.jsonas test-android uses for RN Android — JS-side dep changes correctly trigger the iOS build for RN samples.test (macOS runner, matrix per project)
Per-entry steps branch on project type:
cp Config.example.xcconfig Config.xcconfigxcodebuild -resolvePackageDependenciesyarn install --immutable(RN root)pod installxcodebuild test … -project …xcodeprojxcodebuild build … -workspace …xcworkspacebuild(nottest) for RN — those samples don't ship XCTests on the iOS side; their tests live in Jest and run via test-js.yml. The build alone validatespod install, native module autolinking, and the iOS compile path — the exact things that matter when a RN dep is bumped.Behavior matrix on this PR
This PR only changes test-ios.yml. Effects per workflow:
WORKFLOW_FILE changedbranch → full iOS matrix (all 4 entries: 2 native + 2 RN) runs. This is the self-test of the change.Known assumptions
Quickstart— true for both samples today. Future RN samples must follow this naming or we'd need dynamic discovery.macos-latest(true today; no explicitgem install cocoapodsneeded).🤖 Generated with Claude Code