
Our React Native CI/CD Pipeline Deploys to Both App Stores in 18 Minutes. Here's Every Step.
- Larry Brooks
- Software, Technology
- 01 Jun, 2026
Every Thursday, our lead mobile developer spent 3 hours building, signing, and submitting our React Native app to the App Store and Play Store. That is 156 hours per year — nearly a full month of engineering time — on a process that should be automated.
We built a CI/CD pipeline that deploys to both stores in 18 minutes from a git push to the release branch. Here is every component.
The Pipeline Architecture
Our pipeline has five stages: validate, build, test, sign, and deploy. Each stage has clear pass/fail criteria. A failure at any stage stops the pipeline, notifies the team, and provides diagnostic output.
We use GitHub Actions as the orchestration layer. The iOS build runs on a macOS runner. The Android build runs on a Linux runner. Both execute in parallel, which is why the total time is 18 minutes instead of 36.
Stage 1: Validate (2 minutes)
TypeScript compilation with strict mode catches type errors. ESLint with our custom rule set catches code quality issues. Dependency audit checks for known vulnerabilities. Version validation ensures the build number has been incremented.
If any validation fails, the pipeline stops before spending compute resources on builds.
Stage 2: Build (8 minutes, parallel)
The iOS build uses Fastlane's gym action with our release scheme. The Android build uses Gradle's assembleRelease task. Both builds use Hermes for JavaScript compilation, which reduces bundle size by 30% compared to JavaScriptCore.
Build caching is critical. We cache CocoaPods, Gradle dependencies, and the Hermes bytecode compilation between runs. A clean build takes 14 minutes. A cached build takes 8.
Stage 3: Test (4 minutes, parallel with build)
Unit tests run via Jest with coverage thresholds. Integration tests run via Detox on iOS Simulator and Android Emulator. We run tests in parallel with builds because our test suite does not require a built artifact — it tests JavaScript logic and component rendering, not compiled app behavior.
End-to-end tests run on a separate schedule — nightly — because they take 25 minutes and catch different categories of issues.
Stage 4: Sign (1 minute)
iOS signing uses match — Fastlane's code signing management tool — which stores certificates and provisioning profiles in an encrypted git repository. Android signing uses a keystore stored in GitHub Secrets.
Automated signing eliminated the most common deployment failure: expired or misconfigured certificates.
Stage 5: Deploy (3 minutes)
iOS deployment uses Fastlane's deliver action to upload to App Store Connect and submit for review. Android deployment uses Fastlane's supply action to upload to the Play Store's internal testing track.
For OTA updates — JavaScript-only changes that do not require a store submission — we use EAS Update, which deploys in under 60 seconds.
The ROI
156 hours of manual deployment time eliminated per year. Zero deployment errors in the last 8 months. Release frequency increased from weekly to daily. Developer confidence increased because every deployment is identical.
If your team is still deploying React Native apps manually, let's automate the process.
