Skip to content

Enhance iOS TestFlight configuration and update README - #89

Merged
omarghatasheh merged 3 commits into
mainfrom
ios/finalizing
Jun 4, 2026
Merged

Enhance iOS TestFlight configuration and update README#89
omarghatasheh merged 3 commits into
mainfrom
ios/finalizing

Conversation

@MusaMisto

@MusaMistoMusaMisto commented Jun 4, 2026

Copy link
Copy Markdown
Member

This pull request updates the documentation for the iOS build and TestFlight upload workflow. The main changes clarify the release process and update the inputs table to remove a deprecated or unused option.

Documentation updates:

  • Removed the use-simplify9-xcode-setup input from the inputs table in the README.md, as it is no longer relevant.
  • Clarified that releases now run exclusively in the release_with_environment job, which is protected by an approval gate set via the release-environment input, instead of describing two separate release paths.

Summary by CodeRabbit

  • Chores
    • Simplified iOS TestFlight release workflow by removing five configuration inputs (install-react-native-cli, use-simplify9-xcode-setup, verify-cocoapods, signing-style, build-number-offset).
    • Added automatic detection of Xcode project path when not specified.
    • Updated workflow documentation to clarify release process.

@MusaMistoMusaMisto self-assigned this Jun 4, 2026
@MusaMistoMusaMisto added documentation Improvements or additions to documentation enhancement New feature or request labels Jun 4, 2026
@coderabbitai

coderabbitaiBot commented Jun 4, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

Pull request was closed or merged during review

📝 Walkthrough

Walkthrough

This pull request refactors the shared iOS TestFlight reusable workflow by removing five obsolete inputs (install-react-native-cli, use-simplify9-xcode-setup, verify-cocoapods, signing-style, build-number-offset), consolidating versioning logic into a single "Bump version" step with auto-detection, eliminating the ungated release job path in favor of environment-gated release_with_environment, and reorganizing build/release steps with consistent naming across setup, dependencies, archiving, export, and credential handling.

Changes

iOS TestFlight Workflow Refactoring

Layer / File(s)Summary
Input contract simplification and documentation
.github/workflows/generic-ios-testflight.yml
Removes obsolete inputs (install-react-native-cli, use-simplify9-xcode-setup, verify-cocoapods, signing-style, build-number-offset). Updates pbxproj-path documentation to describe auto-detection from ios-dir. Removes "ARCHIVE PATHS" header comment.
Release job gating and structure consolidation
.github/workflows/generic-ios-testflight.yml
Removes the ungated release job; consolidates on environment-gated release_with_environment only. Updates header comments and conditional logic to reflect unified release path. Renames build job announce step.
Build environment setup and dependency installation
.github/workflows/generic-ios-testflight.yml
Reorganizes Ruby setup, ccache initialization, and Xcode version selection steps. Renames Node dependency installation. Removes React Native CLI install step, proceeding directly to CocoaPods.
CocoaPods caching and consolidated version bumping
.github/workflows/generic-ios-testflight.yml
Renames CocoaPods caching/install steps ("Cache pod specs", "Cache pods", "Install pods"). Consolidates version bumping into a single "Bump version" step that auto-detects pbxproj-path and removes build-number-offset effect.
Signing, pod reinstall, and archiving refactoring
.github/workflows/generic-ios-testflight.yml
Separates signing into dedicated "Install certificate", checkpoint, "Install profile", and "Extract profile metadata" steps. Renames pod reinstall step. Adds standalone "Reset ccache stats" step preceding inline xcodebuild archive.
Export options generation and IPA export
.github/workflows/generic-ios-testflight.yml
Renames ExportOptions steps ("Generate export options", "Resolve export options"). Functional IPA export/rename/upload flow remains unchanged.
Build failure handling and summary output
.github/workflows/generic-ios-testflight.yml
Adds "Build failure" step and updates summary generation. Removes outdated summary fields (versioning strategy, manual-archive input). Gates ccache stats display to ENABLE_CCACHE only.
Release credential validation and upload preparation
.github/workflows/generic-ios-testflight.yml
Renames release IPA resolution step ("Resolve IPA path"). Standardizes credential/upload-prep steps: "Validate credentials", "Install API key", "Decode API key", "Prepare upload".
Release upload execution and confirmation
.github/workflows/generic-ios-testflight.yml
Renames upload flow steps: "Upload", "Confirm upload", "Upload (altool)" replace prior names. Functional upload logic preserved.
Release failure handling and summary
.github/workflows/generic-ios-testflight.yml
Renames "Release failure" and "Release summary" steps. Error messages and GITHUB_STEP_SUMMARY table structure preserved.
Input and release documentation updates
README.md
Removes use-simplify9-xcode-setup from documented inputs. Simplifies Notes section to explicitly state release runs in release_with_environment protected by approval gate.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • simplify9/.github#88: Overlapping changes to TestFlight iOS versioning logic and build-number calculation in the same workflow.
  • simplify9/.github#87: Related refactoring of pbxproj version-bumping, archiving, and release upload step wiring in generic-ios-testflight.yml.
  • simplify9/.github#84: Connected release job changes to the TestFlight upload implementation flow.

Suggested reviewers

  • omarghatasheh
  • samerzughul

🐰 A workflow refreshed with inputs shed,
Steps renamed and release jobs bled,
Version bumping now unified and lean,
The cleanest TestFlight pipeline yet seen!
Auto-detection makes pbxproj shine,
Environment gates seal the deploy line. ✨

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title 'Enhance iOS TestFlight configuration and update README' accurately reflects the main changes: workflow restructuring and documentation updates.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch ios/finalizing

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@omarghatasheh
omarghatasheh merged commit 9fc74f5 into mainJun 4, 2026
1 of 2 checks passed
@omarghatasheh
omarghatasheh deleted the ios/finalizing branch June 4, 2026 12:04
MusaMisto added a commit that referenced this pull request Aug 11, 2026
react-native advertises a loose peer range while its bundled renderer
hard-codes an exact React version and throws at runtime:
if ("19.2.3" !== isomorphicReactPackageVersion) throw Error(...)
react-native@0.85.1 declares peerDependencies { react: "^19.2.3" }, so
bumping react to 19.2.8 is a legal semver-PATCH update. It installs, type-
checks, lints, passes jest and bundles with metro -- then throws on the
first real screen. mealivery-customer-mobile PR #89 auto-merged exactly
this combination into develop on 2026-07-22.
On the New Architecture it is a DEFERRED crash, not a launch crash:
renderElement() correctly uses Fabric, but RendererImplementation.js binds
six APIs to the Paper renderer unconditionally regardless of newArchEnabled
(findNodeHandle, unstable_batchedUpdates, sendAccessibilityEvent,
findHostInstance_DEPRECATED, unmountComponentAtNodeAndRemoveContainer,
isChildPublicInstance). ScrollView, FlatList, TextInput and any
useNativeDriver animation reach that set.
Verified by experiment which gates miss it: react-test-renderer render
passes under a simulated mismatch, and `npx react-native bundle` completes
successfully even with an unconditional throw injected into the renderer
module body (Metro builds a static graph and never evaluates it). tsc and
eslint are unaffected. Only a version-contract assertion or a real
native/E2E run catches this class.
Adds:
- .github/actions/check-react-native-contract (composite)
- .github/workflows/react-native-contract-gate.yml (reusable)
- workflow-templates/react-native-contract-check.yml (caller)
- react-core group in dependabot-templates/react-native-mobile.yml
Design notes:
- Plain `pull_request`, not pull_request_target: needs the PR's own
package.json/lockfile, needs no secrets, never installs or executes PR
code. A `yarn install` step must never be added here.
- Reads the lockfile first (it decides what installs), package.json only
as fallback; resolves ranges via npm view.
- Fails closed when the contract can't be determined. RN >= 0.86 removes
the Paper renderer, so it falls back to Fabric's reconcilerVersion
before giving up -- a gate that silently passes manufactures confidence.
- Also fails on duplicate react in the tree.
Verified against real repos and the real breaking commit:
083147e (PR #89) -> exit 1, DRIFT 19.2.8 vs 19.2.3
mealivery develop (current) -> exit 0, OK
RN 0.86.2 (no Paper renderer) -> exit 1, DRIFT via fabric-reconciler
duplicate react in yarn.lock -> exit 1, DUPLICATE_REACT
non-RN repo / caret RN range -> exit 0
fail-on-unknown=false -> downgrades to warning, exit 0
Grouping and exact-pinning are NOT the fix: Dependabot opens react-only PRs
when no matching react-native release exists, and it rewrites exact pins
(it did so twice in this repo). The gate is the fix, and it only blocks
once `rn-contract / check` is marked required on the Dependabot target
branch -- auto-merge waits on required checks only.
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationenhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@MusaMisto@omarghatasheh