A reliable React Native CI/CD setup should reduce release stress, not add another layer of brittle automation. This guide gives you a reusable checklist for shipping React Native apps with GitHub Actions, EAS Build, Fastlane, and app store release steps. It is written as a practical workflow reference: what to automate, how to divide responsibilities between tools, what to double-check before each release, and which parts need review when your app, dependencies, or store requirements change.
Overview
The most useful way to think about react native ci cd is as a pipeline with clear ownership. Source control and pull request checks live well in GitHub Actions. Cloud or local app builds can run through EAS Build or native tooling. Store metadata, signing steps, screenshots, and submission flows often benefit from Fastlane, especially when your team needs repeatable release tasks across environments.
For many teams, the best setup is not choosing one tool for everything. It is combining them in a way that matches your app and team constraints:
- GitHub Actions for linting, tests, type checks, dependency caching, branch rules, and release orchestration.
- EAS Build for managed or hybrid Expo workflows, cloud builds, credential handling, preview builds, and consistent release artifacts.
- Fastlane for native automation, store submissions, screenshots, changelog handling, version bumps, and finer control over iOS and Android release tasks.
If you are working in Expo, an expo tutorial often starts with EAS because it removes a large amount of local machine setup. If you are in a bare React Native app with custom native modules, Fastlane usually becomes more valuable as your release process grows. In both cases, GitHub Actions remains a strong entry point for automation because it helps standardize checks before code reaches a build step.
A solid mobile CI/CD pipeline for react native app development usually covers five layers:
- Code quality: lint, TypeScript, formatting, static analysis.
- Automated testing: unit, integration, and selected E2E coverage.
- Build generation: Android and iOS artifacts for preview, staging, or production.
- Signing and secrets: certificates, keystores, API keys, environment variables.
- Distribution and release: internal testers, beta channels, and store submissions.
Keep the pipeline understandable. The more release logic you hide across too many tools, the harder it becomes to debug failures during a time-sensitive launch. A good rule is simple: CI should be predictable for routine changes and inspectable when something breaks.
Before building your workflow, define a few release decisions in writing:
- Which branches can trigger preview, staging, and production builds?
- What checks are mandatory before merging?
- Who can approve production releases?
- How are secrets stored and rotated?
- How are build numbers and versions updated?
- How will you handle hotfixes and rollback plans?
That documentation matters as much as the automation itself. It reduces confusion when teammates rotate, when native dependency errors appear after upgrades, or when release and signing issues show up close to submission time.
Checklist by scenario
This section gives you a scenario-based checklist you can come back to before making changes to your release workflow.
1. Scenario: Small team shipping with Expo and EAS Build
This is often the cleanest starting point for cross-platform mobile teams that want cloud builds and fewer local environment differences.
- Use GitHub Actions for pull request checks: install dependencies, run lint, run TypeScript, run tests.
- Keep app configuration consistent across environments using explicit environment files or centrally managed secrets.
- Use EAS Build profiles for development, preview, staging, and production.
- Decide whether credentials are managed by EAS or by your team, and document that choice.
- Generate internal test builds automatically on merges to a staging branch.
- Trigger production builds only from tagged releases or protected branches.
- Store changelog text and release notes close to the codebase so they are not recreated manually each time.
- Review OTA update strategy separately from binary release strategy if you use updates in an Expo-based workflow.
This setup is usually a good fit if you want faster onboarding, fewer machine-specific issues, and a straightforward path to react native app release automation.
2. Scenario: Bare React Native app using GitHub Actions and Fastlane
This scenario suits teams that need full native control, custom build steps, or non-Expo native integrations.
- Create separate GitHub Actions jobs for JavaScript checks and native builds.
- Cache Node modules, Gradle dependencies, CocoaPods artifacts where practical, but keep cache invalidation simple.
- Use Fastlane lanes for Android beta, Android production, iOS beta, and iOS production.
- Move version bumps, changelog generation, and build number updates into repeatable Fastlane steps rather than manual edits.
- Store signing materials securely and document renewal procedures for certificates and provisioning assets.
- Add a manual approval gate before production submission.
- Keep native dependencies locked and reviewed carefully after upgrades.
- Record expected build output names, package identifiers, and environment bundle IDs in one place.
This approach typically takes more setup than an expo vs react native cli comparison might suggest, but it pays off when you need deeper control over native modules, multiple app flavors, or custom release logic.
3. Scenario: Hybrid setup with GitHub Actions orchestrating EAS and Fastlane
Many teams eventually land here. GitHub Actions becomes the controller, while EAS or Fastlane handles specialized build and release tasks.
- Use GitHub Actions as the single trigger point for branch, tag, and release events.
- Send preview and internal test builds through EAS when cloud consistency is more important than native customization.
- Use Fastlane for store submission tasks, metadata handling, screenshots, or platform-specific release lanes.
- Separate jobs by concern: validation, build, distribute, submit.
- Pass artifacts between jobs explicitly instead of rebuilding the same app in multiple stages unless your security model requires it.
- Keep environment-specific logic out of ad hoc shell scripts where possible.
- Make failure notifications visible in pull requests or team channels.
This model works well if your app is growing and you want flexibility without turning the pipeline into a black box.
4. Scenario: Enterprise or multi-environment React Native pipeline
If you support several brands, tenants, or environment variants, keep the pipeline boring and declarative.
- Define environment matrices carefully so staging and production do not share accidental configuration.
- Use naming conventions for app IDs, schemes, flavors, and signing assets that are easy to audit.
- Track which secrets apply to which environment and who owns them.
- Require release notes and rollback notes for each production promotion.
- Automate artifact retention and naming so support teams can identify builds later.
- Add post-build smoke checks for critical startup paths such as authentication, navigation, and API connectivity.
- Review store compliance steps as part of release readiness, not as an afterthought.
As complexity grows, the hardest failures are usually not compilation errors. They are mismatched environment variables, wrong signing assets, or unexpected differences between staging and production behavior.
5. Scenario: Adding testing to an existing release flow
If your team already ships manually, improve the process in layers instead of attempting full automation at once.
- Automate lint, type checks, and unit tests first.
- Add branch protections so failing checks block merges.
- Automate internal preview builds next.
- Add release tagging and production build generation.
- Only then automate store submission once the build outputs are stable.
This staged approach reduces the risk of introducing automation that nobody trusts. For broader guidance on what to test, see React Native Testing Strategy: Unit, Integration, and E2E Tools Compared and for E2E tool selection see Detox vs Maestro vs Appium for React Native E2E Testing.
What to double-check
These are the details that most often break an otherwise reasonable pipeline. Review them before every major release and after every tooling change.
Branch and trigger rules
- Are production workflows restricted to tags or protected branches?
- Can pull requests from forks access secrets unexpectedly?
- Do preview builds run on the right branches and events?
- Are hotfix flows documented separately from main release flows?
Secrets and signing
- Are Android keystores and iOS signing assets current and accessible to the right workflows?
- Do you know when certificates, tokens, or API keys expire?
- Are secrets stored once, or duplicated across multiple systems without a clear owner?
- Are environment variables different for build time and runtime, and is that documented?
Versioning and release metadata
- Does your version name match your store submission plan?
- Are build numbers incremented automatically and consistently?
- Are changelogs generated from commits, pull requests, or manual notes?
- Do screenshots, privacy text, and metadata live in a repeatable process rather than personal notes?
Native dependency changes
- Did a package upgrade change Gradle, CocoaPods, Kotlin, Swift, or Xcode expectations?
- Have you tested archive builds, not just local debug builds?
- Did new native modules introduce entitlements, permissions, or build script changes?
When release problems follow an upgrade, use a formal upgrade checklist rather than guessing. A good companion piece is How to Upgrade React Native Safely: Step-by-Step Checklist for Major and Minor Releases.
Quality gates before shipping
- Run a performance check before and after release candidates. Use a stable checklist, not memory-based judgment. See React Native Performance Checklist: What to Measure Before and After Every Release.
- Confirm app size changes if your release includes new assets or native libraries. See How to Reduce React Native App Size on Android and iOS.
- Review startup flows, navigation transitions, and auth entry points after dependency changes. If your app structure has grown, revisit React Native App Architecture Guide: Feature Folders, Domain Layers, and Scaling Patterns.
- Watch for leak regressions and long-session problems, especially before production builds. See React Native Memory Leak Guide: Common Causes, Detection Tools, and Fixes.
Debugging readiness
Your pipeline is only as useful as your ability to diagnose failed releases. Make sure build logs are readable, artifacts are retained long enough, and common debug commands are documented. For day-to-day inspection workflows, see React Native Debugging Toolkit: Flipper, React DevTools, Logs, and Network Inspectors.
Common mistakes
Most CI/CD issues in React Native are not caused by choosing the wrong branded tool. They come from weak boundaries and undocumented assumptions.
1. Automating too much before the basics are stable
If local builds are inconsistent, CI will magnify that inconsistency. Get one reproducible Android build and one reproducible iOS release build working before layering on store automation.
2. Mixing environment logic into random scripts
As soon as build behavior depends on hidden shell conditions, debugging becomes expensive. Prefer explicit configuration files, named build profiles, and clearly separated lanes.
3. Treating store submission as the same problem as app building
Building artifacts and releasing them are related but different concerns. Your app may compile successfully while still failing on metadata, permissions, screenshots, review text, or signing details.
4. Relying on one person to understand signing
This is a common operational risk. Document where keys live, who can rotate them, and what to do when a certificate expires or a machine is lost.
5. Ignoring performance and UX checks in release pipelines
A green build is not the same as a safe release. For example, navigation regressions, oversized bundles, auth edge cases, and memory issues may only show up in realistic test flows. If navigation changes are part of a release, a comparison like React Native Navigation Options Compared: React Navigation, Expo Router, and Native Navigation can help frame what needs validation.
6. Letting architecture drift break release assumptions
As features, state, and modules grow, release scripts often lag behind the app. That is especially common when state management, feature flags, or environment-specific code paths change. If that sounds familiar, revisit Best State Management for React Native: Redux, Zustand, Jotai, MobX, and Context Compared together with your release checklist.
7. Not defining rollback and hotfix paths
Many teams automate the happy path and neglect what happens when a production issue slips through. Decide in advance how to ship a hotfix, who can trigger it, and what minimum checks still apply under time pressure.
When to revisit
This is a living workflow area. Review your React Native CI/CD setup before seasonal planning, before major app releases, and any time your inputs change. In practice, that means revisiting the pipeline when any of the following happens:
- You upgrade React Native, Expo SDK, Xcode, Android Gradle tooling, or native libraries.
- You add push notifications, authentication providers, deep linking, or other features with native release implications.
- You change branching strategy or move from manual releases to staged environments.
- You introduce Fastlane into an EAS workflow, or EAS into an existing native release flow.
- You add new team members who need release access or who depend on the pipeline for preview builds.
- You see repeated failures around signing, certificates, environment variables, or versioning.
- Your store release checklist starts living in chat threads instead of in source control.
If you only do one practical thing after reading this guide, do this: create a one-page release checklist in your repository that mirrors your actual workflow. Include branch rules, required checks, build commands, artifact locations, submission owners, and rollback steps. Then link it directly from your GitHub Actions workflow files, EAS configuration, and Fastlane lanes.
That small piece of documentation turns a fragile setup into an operational system. It also makes this topic worth revisiting: each time a tool changes, a dependency upgrade lands, or store requirements shift, you have one place to review and update.
For a maintainable github actions react native and eas build fastlane workflow, aim for three outcomes: every release should be reproducible, every failure should be diagnosable, and every critical step should have a clear owner. If your current pipeline does not meet those standards yet, start with the smallest stable improvement and build from there.