Add Fastlane setup for TestFlight distribution#16
Conversation
Adds a beta lane (pods install, build number bump via latest TestFlight build when an ASC API key is present, gym Release archive, pilot upload) and a build lane for local verification. Builds the committed ios/ project directly with automatic signing; team ID and ASC API key are read from env vars documented in fastlane/.env.example. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
Warning Review limit reached
Next review available in: 10 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (8)
📝 WalkthroughWalkthroughThis PR adds Fastlane-based iOS build and TestFlight automation for UltraEdge, plus supporting Ruby, Xcode, Podfile, plist, and privacy manifest updates. ChangesFastlane and iOS build setup
Sequence Diagram(s)sequenceDiagram
participant Developer
participant Fastfile
participant Xcode
participant TestFlight
Developer->>Fastfile: fastlane ios beta
Fastfile->>Fastfile: asc_api_key (validate env vars)
Fastfile->>Fastfile: ensure_pods
Fastfile->>Xcode: configure_signing
Fastfile->>TestFlight: bump_build_number (latest build + 1)
Fastfile->>Xcode: archive (build_app)
Fastfile->>TestFlight: upload_to_testflight
Related issues: None found in the provided context. Related PRs: None found in the provided context. Suggested labels: ios, fastlane, ci Suggested reviewers: None found in the provided context. 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
The committed Podfile.lock predated the current react-native version, so pod install failed on fast_float (and Sentry spec resolution). Generated by `pod update fast_float` + pod install: updated lockfile, codegen/autolinking build phases, RCTNewArchEnabled in Info.plist, and privacy manifest sync. No hand-written app code touched. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Sign with an explicit Apple Distribution cert + App Store profile via cert/sigh using the ASC API key (automatic signing fails at archive time: Xcode requests a development profile and the team has no registered devices). - Patch fmt 11.0.2 in pod post_install to disable consteval format checks, which Xcode 26 clang rejects; fmt hardcodes FMT_USE_CONSTEVAL so a -D override is not possible. - Keep fastlane-regenerated README in sync with lanes. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
There was a problem hiding this comment.
🧹 Nitpick comments (1)
ios/Podfile (1)
63-70: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winPatch silently no-ops if the fmt source line changes.
src.subreturns the string unchanged when the target#ifline isn't found, so a future fmt bump (or any wording change) would leave the header unpatched with no warning — reintroducing the Xcode 26constevalbuild failure in a hard-to-diagnose way. Consider asserting the substitution actually applied and surfacing a warning otherwise:🔧 Proposed hardening
unless src.include?(marker) - src = src.sub( + patched = src.sub( '`#if` !defined(__cpp_lib_is_constant_evaluated)', "`#if` 1 #{marker}" ) - FileUtils.chmod('u+w', fmt_base) # CocoaPods installs pod sources read-only - File.write(fmt_base, src) + if patched == src + Pod::UI.warn("fmt base.h consteval patch did not match — verify fmt version/base.h layout.") + else + FileUtils.chmod('u+w', fmt_base) # CocoaPods installs pod sources read-only + File.write(fmt_base, patched) + end end🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@ios/Podfile` around lines 63 - 70, The Podfile patching logic can silently fail when the expected fmt preprocessor line changes, leaving the header unmodified and the build issue unresolved. Update the patch block around the src.sub/File.write flow to verify the substitution actually happened before writing, and if it did not, surface a clear warning or error tied to the Podfile patch step so future fmt bumps are caught immediately.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@ios/Podfile`:
- Around line 63-70: The Podfile patching logic can silently fail when the
expected fmt preprocessor line changes, leaving the header unmodified and the
build issue unresolved. Update the patch block around the src.sub/File.write
flow to verify the substitution actually happened before writing, and if it did
not, surface a clear warning or error tied to the Podfile patch step so future
fmt bumps are caught immediately.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: d7577df9-62a9-461b-abad-8f0b3d8d2579
⛔ Files ignored due to path filters (1)
ios/Podfile.lockis excluded by!**/*.lock
📒 Files selected for processing (6)
fastlane/Fastfilefastlane/README.mdios/Podfileios/UltraEdge.xcodeproj/project.pbxprojios/UltraEdge/Info.plistios/UltraEdge/PrivacyInfo.xcprivacy
✅ Files skipped from review due to trivial changes (1)
- ios/UltraEdge/PrivacyInfo.xcprivacy
The committed ios/ project still used the legacy Objective-C AppDelegate (EXAppDelegateWrapper subclass). In Expo SDK 54 that wrapper is deprecated and no longer creates the window or starts React Native, so release builds launched to an empty black screen while the main thread idled with no JS runtime. Migrate AppDelegate to the SDK 54 Swift template (ExpoAppDelegate + ExpoReactNativeFactory, which explicitly creates the window and starts React Native), and add a root ErrorBoundary so future fatal render errors surface a message instead of a black screen. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Summary
Gemfile+fastlane/(Appfile, Fastfile, .env.example, README) for repeatable TestFlight builds of the committedios/project — noexpo prebuildinvolved.ios betalane: ensures pods installed, bumps build number (latest TestFlight build + 1 when an ASC API key is configured), archivesUltraEdge.xcworkspace(schemeUltraEdge, Release, automatic signing), uploads via pilot withskip_waiting_for_build_processing.ios buildlane: same archive without the upload, for local verification.ASC_KEY_ID,ASC_ISSUER_ID,ASC_KEY_P8/ASC_KEY_PATH,ASC_TEAM_ID) — documented infastlane/.env.example; no secrets committed..gitignoreupdated forfastlane/.env,build/,vendor/bundle/.3c338b7): the committedios/Podfile.lockpredated the current react-native version, sopod installfailed outright (fast_floatsnapshot conflict, then missingSentry/HybridSDK 8.56.1spec). Ranpod update fast_float(with repo update) +pod installand committed the regenerated files: Podfile.lock, codegen/autolinking build phases in project.pbxproj,RCTNewArchEnabledin Info.plist (verified: only semantic change), privacy manifest sync. No hand-written app code touched.Verification
bundle install✅ (Ruby 3.4, gems invendor/bundle)bundle exec fastlane laneslistsios build/ios beta✅ruby -con Fastfile/Appfile ✅pod installsucceeds after lockfile sync ✅xcodebuild -listconfirms schemeUltraEdge✅Before first run (Beaux)
.p8.cp fastlane/.env.example fastlane/.envand fill in the values (incl.ASC_TEAM_IDfrom developer.apple.com → Membership).com.beaux.ultraedgeapp record exists in App Store Connect and you're signed into Xcode with your Apple ID.bundle install && bundle exec fastlane ios betaTest plan
bundle exec fastlane ios buildproduces an .ipa locallybundle exec fastlane ios betauploads to TestFlight🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
Bug Fixes