| name | gmacko-release-deploy-mobile |
| description | Use when (1) building mobile app via EAS for distribution, (2) submitting to App Store or Google Play, (3) managing mobile release workflow. Handles Expo EAS build and submission process. |
| license | MIT |
| compatibility | opencode |
| metadata | [object Object] |
Gmacko Mobile Deployment (EAS)
Build and submit mobile applications using Expo Application Services (EAS).
When to Use
- Web deployment is complete (or mobile-only release)
- Ready to build for TestFlight/Play Store internal testing
- Ready to submit to App Store / Google Play
- Need to manage app credentials
Prerequisites
- EAS CLI installed:
npm install -g eas-cli - EAS authenticated:
eas whoami - EAS project configured:
apps/mobile/eas.json - Apple/Google credentials configured
Workflow
digraph deploy_mobile {
rankdir=TB;
node [shape=box];
start [label="Start Mobile Release" shape=ellipse];
confirm [label="1. Confirm Build Type"];
version [label="2. Update Version"];
credentials [label="3. Verify Credentials"];
build [label="4. Start EAS Build"];
monitor [label="5. Monitor Build"];
success [label="Build Success?" shape=diamond];
submit [label="6. Submit to Stores"];
wait [label="7. Wait for Review"];
document [label="8. Document Release"];
done [label="Mobile Release Complete" shape=ellipse];
failed [label="Build Failed" shape=ellipse];
start -> confirm -> version -> credentials -> build;
build -> monitor -> success;
success -> submit [label="yes"];
success -> failed [label="no"];
submit -> wait -> document -> done;
}
Build Profiles
Defined in apps/mobile/eas.json:
| Profile | Purpose | Distribution |
|---|---|---|
development |
Dev builds with Expo Go | Internal |
preview |
TestFlight / Internal testing | Internal |
production |
App Store / Play Store | Store |
Execution Steps
Step 1: Confirm Build Type
Ask user:
I'm preparing a mobile build.
Options:
- Preview - Internal testing (TestFlight / Internal track)
- Production - Store release (App Store / Play Store)
Platforms:
- iOS
- Android
- Both
Which would you like to build?
Step 2: Update Version
Check and update version in apps/mobile/app.config.js:
// Current version
const version = "1.0.0"; // User-facing version
const buildNumber = "1"; // iOS: CFBundleVersion, Android: versionCode
Ask user:
Current version: 1.0.0 (build 1)
For this release:
- Version: [suggest next version]
- Build number: [suggest increment]
Confirm or specify new values.
Update config:
# In apps/mobile/app.config.js
# Update version and buildNumber constants
Step 3: Verify Credentials
Check credentials are configured:
# Check iOS credentials
eas credentials --platform ios
# Check Android credentials
eas credentials --platform android
For iOS:
## iOS Credentials Check
- [ ] Apple Developer account connected
- [ ] Distribution certificate valid
- [ ] Provisioning profile valid
- [ ] Push notification key configured (if needed)
For Android:
## Android Credentials Check
- [ ] Keystore configured
- [ ] Service account key available (for Play Store)
- [ ] Bundle signing configured
Step 4: Start EAS Build
Preview Build (internal testing):
# Build for both platforms
eas build --profile preview --platform all
# Build for specific platform
eas build --profile preview --platform ios
eas build --profile preview --platform android
Production Build (store release):
# Build for both platforms
eas build --profile production --platform all
# Build for specific platform
eas build --profile production --platform ios
eas build --profile production --platform android
Capture build IDs:
# Build URLs will be provided in output
# Example: https://expo.dev/accounts/gmacko/projects/my-app/builds/xxx
Step 5: Monitor Build
Monitor build progress:
# List recent builds
eas build:list --limit 5
# View specific build
eas build:view [build-id]
# Open in browser
eas build:view [build-id] --open
Report status:
Build Status
============
iOS Build: BUILDING / SUCCESS / FAILED
- Build ID: xxx
- Started: [time]
- Duration: [Xm Xs]
Android Build: BUILDING / SUCCESS / FAILED
- Build ID: yyy
- Started: [time]
- Duration: [Xm Ys]
Build times:
- iOS: ~15-30 minutes
- Android: ~10-20 minutes
Step 6: Submit to Stores
For Preview builds (internal testing):
iOS (TestFlight):
eas submit --platform ios --profile preview
Android (Internal track):
eas submit --platform android --profile preview
For Production builds (store release):
iOS (App Store):
eas submit --platform ios --profile production
Android (Play Store):
eas submit --platform android --profile production
Step 7: Wait for Review
iOS App Store:
- TestFlight: Usually instant to ~1 hour
- App Store: 24-48 hours typical, can take longer
Google Play:
- Internal track: Usually instant
- Production: Few hours to a few days
Track status:
## Review Status
### iOS
- Submitted: [timestamp]
- Status: Waiting for Review / In Review / Ready for Sale
- Estimated: [X hours/days]
### Android
- Submitted: [timestamp]
- Status: Pending / In Review / Published
- Estimated: [X hours]
Step 8: Document Release
Update release summary:
## Mobile Deployment Record
### iOS
- **Version**: X.Y.Z (build N)
- **Build ID**: [eas-build-id]
- **Submitted**: [timestamp]
- **Status**: [current status]
- **TestFlight**: [available/pending]
- **App Store**: [available/pending/in-review]
### Android
- **Version**: X.Y.Z (versionCode N)
- **Build ID**: [eas-build-id]
- **Submitted**: [timestamp]
- **Status**: [current status]
- **Internal Track**: [available/pending]
- **Production**: [available/pending/in-review]
### Release Notes (for stores)
[Same as GitHub release notes, adapted for store format]
Credential Management
iOS Credentials
# Setup/update credentials
eas credentials --platform ios
# Renew expiring certificates
eas credentials --platform ios
# Select "Manage credentials" > "Renew"
Android Credentials
# Setup/update credentials
eas credentials --platform android
# View keystore info
eas credentials --platform android
# Select "View credentials"
Error Handling
Build Failures
Check build logs:
eas build:view [build-id]Common iOS issues:
- Code signing errors → Check credentials
- Pod install failures → Clear pods, rebuild
- Xcode version mismatch → Update EAS config
Common Android issues:
- Gradle errors → Check dependencies
- Keystore issues → Verify credentials
- Memory errors → Adjust EAS build config
Submission Failures
iOS rejection reasons:
- Missing screenshots
- Privacy policy issues
- Guideline violations
Android rejection reasons:
- Policy violations
- Missing permissions justification
- Target API level issues
OTA Updates (Expo Updates)
For minor updates without store release:
# Publish OTA update
eas update --branch production --message "Bug fixes"
# Check update status
eas update:list
Note: OTA updates are limited to JS/asset changes, not native code.
Red Flags
| Rationalization | Correction |
|---|---|
| "Skip version increment" | ALWAYS increment build number for new builds |
| "Credentials are fine, skip check" | Verify credentials before every release |
| "Submit to production directly" | Test via preview/TestFlight first |
| "Don't need to wait for review" | Document expected review time |
| "OTA can fix native issues" | Native changes require new build |
Integration
- Input: Build profile, platforms, version
- References: Release summary, eas.json config
- Output: Build IDs, store submission status, updated release record
- Next:
gmacko-release-closeor monitor store status