Deploy the mobile app using EAS Build and Submit. Use when building for app stores, creating preview builds, or managing releases. Invoked by: "deploy", "build", "release", "eas", "app store", "publish".
Version: 1.0.0 Last Updated: 2026-01-11 Status: Active
Note: This is a template. Replace placeholders like
{PROJECT_NAME},{BUNDLE_ID}, and{BASE_URL}with your actual project values.
Build and deploy the mobile app to the App Store and Google Play using EAS Build (Expo Application Services). This guide covers build profiles, code signing, store submission, version management, and over-the-air updates.
ALWAYS: App store submissions, production builds, preview builds, OTA updates, version management SKIP: Local development builds, debugging, environment setup
npm install -g eas-clinpx eas logineas build -p ios --profile productioneas build -p android --profile productioneas submit -p ios or eas submit -p android┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Setup EAS │────>│ Configure │────>│ Build App │
│ CLI & Login │ │ Credentials │ │ (Cloud/Local) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│
v
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Release to │<────│ Store Review │<────│ Submit to │
│ Users │ │ Process │ │ App Store │
└─────────────────┘ └─────────────────┘ └─────────────────┘
| Phase | Description | Time |
|---|---|---|
| 1 | Setup EAS | 10 min |
| 2 | Configure Credentials | 15-30 min |
| 3 | Build App | 15-45 min |
| 4 | Submit to Store | 5 min |
| 5 | Store Review | 1-7 days |
| Profile | Environment | Use Case |
|---|---|---|
development | dev | Development builds with dev client |
development:simulator | dev | iOS simulator builds |
preview | dev | Internal distribution builds |
production | prod | Store-ready builds |
EAS Build includes automatic caching to speed up builds:
Each build profile includes cache configuration in eas.json:
{
"cache": {
"disabled": false,
"key": "profile-v1",
"cacheDefaultPaths": true,
"customPaths": ["./ios/Podfile.lock"]
}
}
| Profile | Cache Key | Purpose |
|---|---|---|
| development | dev-v1 | Development client builds |
| development:simulator | dev-sim-v1 | Simulator builds |
| preview | preview-v1 | Internal distribution |
| production | prod-v1 | Store builds |
To force a fresh build (when cache causes issues):
# Bump the cache key version in eas.json
# e.g., "key": "dev-v1" -> "key": "dev-v2"
Or use the EAS dashboard to clear cache for a specific build.
npm install -g eas-cli
npx eas login
npx eas whoami # Verify logged in
npm install -g eas-cli@latest
Required:
Required:
For testing on devices with development features:
# iOS (device)
task eas-build-ios
# Or: eas build -p ios --profile development
# Android
task eas-build-android
# Or: eas build -p android --profile development
# iOS (simulator only)
eas build -p ios --profile development:simulator
For store submission:
# iOS
eas build -p ios --profile production
# Android
eas build -p android --profile production
Build on your machine instead of EAS cloud:
# iOS (requires macOS + Xcode)
task eas-build-ios-local
# Android
task eas-build-android-local
Submit immediately after build:
# iOS
eas build -p ios --profile production --auto-submit
# Android
eas build -p android --profile production --auto-submit
Submit an existing build:
# List recent builds
eas build:list
# Submit specific build
eas submit -p ios --id <build-id>
eas submit -p android --id <build-id>
Version numbers are managed automatically by EAS:
// eas.json
{
"cli": {
"appVersionSource": "remote"
},
"build": {
"production": {
"autoIncrement": true
}
}
}
| Setting | Description |
|---|---|
appVersionSource: "remote" | EAS tracks version numbers |
autoIncrement: true | Build number increments automatically |
eas build:version:set
EAS manages iOS code signing automatically. On first build:
To manage credentials:
eas credentials
EAS generates and manages the keystore. For Play Store:
Sensitive variables are stored in EAS Secrets (not in code):
GOOGLE_SERVICES_JSON - Firebase Android config (base64)GOOGLE_SERVICE_INFO_PLIST - Firebase iOS config (base64)SENTRY_AUTH_TOKEN - Sentry upload tokenThe ENVIRONMENT variable controls which config is used:
| ENVIRONMENT | Bundle ID | API URL |
|---|---|---|
dev | {BUNDLE_ID}.dev | {BASE_URL_DEV} |
prod | {BUNDLE_ID} | {BASE_URL_PROD} |
For JavaScript-only updates (no native changes):
# Publish update to production channel
eas update --branch production --message "Bug fixes"
# Publish update to development channel
eas update --branch development --message "New feature"
Updates are automatically downloaded when users open the app.
Use OTA for:
Requires full build for: