For React Native teams, a practical CI/CD split is to let GitHub Actions run repository checks and coordinate releases while EAS Build creates hosted iOS and Android binaries. The key detail is that eas build --no-wait confirms dispatch, not build completion. If a later Actions step needs the finished artifact or result, wait for the build or use a completion-aware integration.
Choose where CI ends and mobile builds begin
EAS Build is Expo’s hosted service for producing Android and iOS app binaries. It can manage signing credentials or use credentials your team supplies; see Expo’s EAS Build overview. GitHub Actions, by contrast, is useful for checks tied to the repository—such as linting, type checks, tests, policy gates, and integrations with other systems.
There are three sensible arrangements. Use Actions to validate code and trigger EAS Build when you want general-purpose CI with hosted native builds. Use EAS Workflows when you want Expo-managed jobs for builds, submissions, updates, and tests. Or combine them: keep repository-specific checks in Actions and use EAS for Expo-specific release work. Expo supports using the services alongside one another; neither architecture is universally best.
| Decision point | GitHub Actions + EAS Build | EAS Workflows |
|---|---|---|
| Where jobs run | Actions runs repository CI; EAS Build performs the hosted native build. | EAS-hosted macOS and Linux workers run workflow jobs. |
| Packaged Expo jobs | Call EAS CLI and compose the rest of the pipeline yourself. | Packaged jobs cover build, submit, update, and Maestro end-to-end tests; custom jobs can run commands. |
| Custom integrations | Useful for broad pipeline control and integrations beyond EAS. | Useful for Expo-centered pipelines; can also be invoked as part of a hybrid. |
| Build completion | With --no-wait, Actions finishes after dispatch; omit it when the Actions job must wait for the result. |
Compose subsequent work in the workflow around its jobs. |
For details on EAS Workflows’ capabilities and triggers, see Expo’s EAS Workflows introduction.
Free tools Windows power users keep installed
One-click scans. No signup required.
#1 Best Overall
Prepare the Expo project before automating it
Do not make the first attempt to configure project identity and signing happen in a non-interactive CI run. Expo’s CI build guide recommends completing an initial successful build for each supported platform. That setup initializes the EAS projectId, adds build profiles to eas.json, fills in native identifiers such as the Android package and iOS bundle identifier, and ensures signing credentials are available. Existing projects may already have some of this configured; check each item rather than assuming CI can infer it.
For production, build signing and store submission are related but distinct. A build needs the platform signing credentials; uploading to Apple or Google also needs the relevant store-side configuration. EAS Workflows build jobs require an EAS Build project, a profile in eas.json, and platform credentials. The profile defaults to production if omitted, so select the intended profile explicitly—development, preview, or production. See the pre-packaged jobs documentation.
Rank #2
Trigger EAS Build from GitHub Actions
The following pattern reflects Expo’s documented CI setup: authenticate with an Expo personal access token saved as a GitHub secret, install dependencies reproducibly, and invoke EAS CLI in non-interactive mode. The action and Node versions shown in Expo’s current example are examples, not permanent recommendations; check compatibility before copying or updating them. The workflow dispatches builds for both platforms on a push to main or when manually run.
name: EAS Build
on:
workflow_dispatch:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Check out repository
uses: actions/checkout@v5
- name: Set up Node
uses: actions/setup-node@v6
with:
node-version: 24
- name: Set up Expo and EAS CLI
uses: expo/expo-github-action@v8
with:
eas-version: latest
token: ${{ secrets.EXPO_TOKEN }}
- name: Install dependencies
run: npm ci
- name: Start Android and iOS builds
run: eas build --platform all --non-interactive --no-wait
Expo’s example workflow is documented at Trigger builds from CI. Adapt the package manager and install command to the project’s lockfile and runtime requirements; reproducibility depends on installing the versions recorded by the repository.
Rank #3
What goes in EXPO_TOKEN?
Use an Expo personal access token, not a store credential. Save it as a GitHub Actions repository or organization secret named EXPO_TOKEN, then reference it in the workflow. Treat it as a credential: limit who can modify workflows that access it, and do not expose it to untrusted pull-request code. This access-control advice is a security recommendation, not a special token requirement.
Know exactly what --no-wait means
With --no-wait, the Actions runner is released after EAS accepts the build request. The Actions job can succeed even if the remote build later fails. This is appropriate when Actions only needs to dispatch work and no immediate downstream step needs the artifact or final result. Remove --no-wait when a later Actions step depends on the completed build, or use an integration that detects build completion. Otherwise, a green dispatch job can be mistaken for a successful binary build.
Rank #4
Use EAS Workflows for an Expo-managed pipeline
EAS Workflow files live in .eas/workflows/. A workflow can respond to GitHub pushes and pull requests, labels, branch or tag deletions, scheduled runs, App Store Connect events, manual CLI runs, and REST API calls. For GitHub events, the repository must be linked to its EAS project. Expo describes the service as automating builds, updates, submissions, and tests for React Native and Expo apps; see the workflow introduction.
Packaged job types include build, submit, update, and Maestro end-to-end tests. A custom job is available when a command does not fit a packaged type. Pick the build profile deliberately: if no profile is specified, the documented default is production. That implicit default can turn an otherwise routine workflow into a production build.
Recommended Free Tools
Expo’s generated deploy template uses project fingerprinting to choose between a production binary build and an over-the-air update: it builds and submits when native changes require a binary, or publishes an update when a matching native build already exists. See Get started with EAS Workflows. EAS Update does not eliminate native builds when native code changes or runtime compatibility requires a new binary; an OTA update is only suitable when a compatible native build is already available.
Automate TestFlight and Google Play releases safely
CI can build for iOS and Android, but distribution requires more than a successful compile. Prepare platform signing credentials for the production build, then configure the relevant Apple or Google submission credentials separately. EAS Submit configuration is documented in Configure EAS Submit with eas.json; EAS Workflows’ packaged submit jobs are described in the pre-packaged jobs guide.
Keep store credentials and production-capable workflows away from routine pull-request checks. Restrict release triggers to deliberate branches or events, and use repository or environment controls so untrusted changes cannot access production secrets. Expo documents supported workflow triggers and credential setup; the restrictive policy is an operational safeguard your team should apply.
For Apple credential repair, Expo’s CI guide also describes optional App Store Connect API key environment variables, including a provisioning-profile re-signing use case. These API credentials do not replace the separate platform signing and store submission setup.
Avoid the deprecated Expo dashboard build trigger
Expo’s legacy dashboard build triggers are deprecated and disabled for new projects. For a new setup, use GitHub Actions with EAS Build or EAS Workflows rather than designing around that legacy interface. See Trigger builds from the Expo GitHub App.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.




