Claude-skill-registry gmacko-release-deploy-mobile
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.
git clone https://github.com/majiayu000/claude-skill-registry
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/gmacko-release-deploy-mobile" ~/.claude/skills/majiayu000-claude-skill-registry-gmacko-release-deploy-mobile && rm -rf "$T"
skills/data/gmacko-release-deploy-mobile/SKILL.mdGmacko 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 |
|---|---|---|
| Dev builds with Expo Go | Internal |
| TestFlight / Internal testing | Internal |
| 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:
or monitor store statusgmacko-release-close