Expo Deployment
Deploy Expo applications across all platforms using EAS (Expo Application Services). Based on official Expo skills.
Quick Start
Install EAS CLI
npm install -g eas-cli eas login
Initialize EAS
npx eas-cli@latest init
This creates eas.json with build profiles.
Build Commands
Production Builds
iOS App Store build
npx eas-cli@latest build -p ios --profile production
Android Play Store build
npx eas-cli@latest build -p android --profile production
Both platforms
npx eas-cli@latest build --profile production
Development Builds
iOS development (includes dev tools)
npx eas-cli@latest build -p ios --profile development
Android development
npx eas-cli@latest build -p android --profile development
iOS Simulator build
npx eas-cli@latest build -p ios --profile development --local
Submit to Stores
iOS: Build and submit to App Store Connect
npx eas-cli@latest build -p ios --profile production --submit
Android: Build and submit to Play Store
npx eas-cli@latest build -p android --profile production --submit
Shortcut for iOS TestFlight
npx testflight
EAS Configuration
Standard eas.json for production deployments:
{ "cli": { "version": ">= 16.0.1", "appVersionSource": "remote" }, "build": { "production": { "autoIncrement": true, "ios": { "resourceClass": "m-medium" } }, "preview": { "distribution": "internal" }, "development": { "developmentClient": true, "distribution": "internal", "ios": { "simulator": true } } }, "submit": { "production": { "ios": { "appleId": "your@email.com", "ascAppId": "1234567890" }, "android": { "serviceAccountKeyPath": "./google-service-account.json", "track": "internal" } } } }
Web Deployment
Deploy web apps using EAS Hosting:
Export web build
npx expo export -p web
Deploy to production
npx eas-cli@latest deploy --prod
Deploy PR preview
npx eas-cli@latest deploy
OTA Updates (EAS Update)
Push JavaScript updates without app store review:
Create an update for production branch
eas update --branch production --message "Bug fix"
Create an update for all platforms
eas update --branch preview --message "New feature"
Roll back to previous update
eas update:rollback --branch production
Configure Runtime Version
In app.json :
{ "expo": { "runtimeVersion": { "policy": "appVersion" }, "updates": { "url": "https://u.expo.dev/your-project-id" } } }
iOS Specific
TestFlight Submission
Quick TestFlight submission
npx testflight
Or manually
npx eas-cli@latest build -p ios --profile production npx eas-cli@latest submit -p ios --profile production
Configure Apple Credentials
Interactive credential setup
eas credentials
Configure App Store Connect
eas credentials:configure --platform ios
App Store Metadata
Configure in store.config.json or use EAS Metadata:
Push metadata to App Store Connect
eas metadata:push
Pull current metadata
eas metadata:pull
Android Specific
Play Store Submission
Build and submit to internal track
npx eas-cli@latest build -p android --profile production --submit
Submit existing build
npx eas-cli@latest submit -p android --latest
Track Progression
-
internal
-
Internal testing (up to 100 testers)
-
alpha
-
Closed testing
-
beta
-
Open testing
-
production
-
Full release
{ "submit": { "production": { "android": { "track": "internal", "releaseStatus": "completed" } } } }
Service Account Setup
-
Create service account in Google Cloud Console
-
Grant "Service Account User" role
-
Enable Google Play Android Developer API
-
Download JSON key
-
Add service account to Play Console with release permissions
CI/CD Workflows
EAS Workflows
Create .eas/workflows/release.yml :
name: Release
on: push: branches: [main]
jobs: build-ios: type: build params: platform: ios profile: production
submit-ios: type: submit needs: [build-ios] params: platform: ios profile: production
build-android: type: build params: platform: android profile: production
submit-android: type: submit needs: [build-android] params: platform: android profile: production
PR Preview Workflow
name: PR Preview
on: pull_request:
jobs: deploy-preview: type: deploy params: platform: web
build-preview: type: build params: platform: ios profile: preview
Version Management
EAS manages version numbers automatically with appVersionSource: "remote" :
Check current versions
eas build:version:get
Manually set version
eas build:version:set -p ios --build-number 42 eas build:version:set -p android --version-code 42
Sync versions between platforms
eas build:version:sync
Monitoring
List recent builds
eas build:list
Check build status
eas build:view
View submission status
eas submit:list
View update deployments
eas update:list
Environment Variables
EAS Secrets
Add a secret
eas secret:create --name API_KEY --value "your-api-key"
List secrets
eas secret:list
Delete a secret
eas secret:delete API_KEY
Per-Environment Configuration
Pull environment variables
eas env:pull --environment production
Push environment variables
eas env:push --environment production
Troubleshooting
Build Issues
Clear build cache
eas build --clear-cache
View build logs
eas build:view --logs
Check project configuration
npx expo-doctor
Submission Issues
Verify credentials
eas credentials
Check submission status
eas submit:list
View submission details
eas submit:view
Common Errors
Error Solution
"Missing Apple credentials" Run eas credentials
"Version already exists" Increment version in app.json or use autoIncrement
"Service account not found" Verify serviceAccountKeyPath in eas.json
"Build queue full" Wait or upgrade EAS plan for priority builds