agentleFS
Ampli-GroupAmpli-Group/agentic-mobile-blueprint/.agents/skills/eas-mobile-deployment/SKILL.md

eas-mobile-deployment

Skill4 starsChanged 6 months agoMITView on GitHub

Explains how EAS Build and Submit work together for App Store and Google Play deployment. Use when configuring eas.json, troubleshooting mobile builds/submissions, or understanding version management, submit profiles, and the build-then-submit pipeline.

The file

We split this skill into the rules it gives an agent

4 rules. About 0 are common, 0 are distinctive, and 4 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈0

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 4

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Note: Use "draft" for new apps. Builds upload successfully but require manual publish in Google Play Console.

    line 66
  2. Very specific:

    For Android: Use --profile internal for submit to send to internal testing track, or --profile production for production track.

    line 111
  3. Very specific:

    For iOS: Use --profile production for submit to send to TestFlight (appears after ~10-15 min Apple processing).

    line 113
  4. Very specific:

    Only EXPO_TOKEN needs to be a GitHub secret.

    line 117

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

EAS Mobile Deployment

How It Works

BUILD and SUBMIT are independent EAS services. A build creates the binary. A submit uploads an existing binary to a store. They never need to run together.

  • eas build creates an IPA (iOS) or AAB (Android) and stores it on EAS
  • eas submit takes an existing build artifact and uploads it to App Store Connect or Google Play
  • A single build can be submitted multiple times (e.g. first to internal track, then to production)
  • A failed submission does not require a rebuild

Distribution Settings (CRITICAL)

The distribution field controls build type, but does NOT automatically upload to stores:

SettingPurposeRequired For
"distribution": "store"Creates store-ready binariesApp Store / Play Store submissions

Important: distribution: "store" alone does NOT upload to stores. You must explicitly submit builds using a separate eas submit command after the build completes.

CI/CD Pattern: Split build and submit into separate jobs:

  1. Build job: eas build --platform ios --profile production --non-interactive
  2. Submit job: eas submit --platform ios --profile production --latest --non-interactive

This allows builds to succeed even if submission fails, and enables retrying submissions without rebuilding.

Version Management

Two separate version concepts:

VersionWhereWho managesPurpose
versionapp.jsonYou, manuallyUser-facing (e.g. 1.2.0). Shown on App Store / Play Store.
buildNumber / versionCodeEAS remoteEAS, automaticallyDeveloper-facing. Must be unique per store upload. Auto-incremented.

This is controlled by two eas.json fields:

  • appVersionSource: "remote" -- EAS stores build numbers on its servers, not in local files. Required for CI/CD where builds happen on different machines/branches.
  • autoIncrement: true (on the build profile) -- EAS bumps the build number on every build. You never touch it.

This means you can build 10 times for version 1.2.0 -- each gets a unique build number (1, 2, 3...) and the stores accept all of them. You only bump version in app.json when you want a new user-facing release.

For apps already in stores, sync the current store build number to EAS first:

eas build:version:set

Submit Profiles

Submit profiles in eas.json control where a build goes:

ProfileAndroid TrackAndroid StatusiOSUse Case
internalinternaldraftn/aQA testing (up to 100 testers)
productionproductiondraftSubmits to App Store ConnectPublic release

Android track options: internal, alpha, beta, production. Android releaseStatus options: draft, completed, inProgress, halted.

Note: Use "draft" for new apps. Builds upload successfully but require manual publish in Google Play Console. Once your app is published and you want automatic rollouts, you can change to "completed".

iOS submit requires ascAppId -- your App Store Connect App ID (numeric, found in the ASC URL for your app). When submitted, builds appear in TestFlight after ~10-15 min of Apple processing.

Note: Submit profiles are used with eas submit --profile NAME, not with eas build. The profile name passed to eas submit determines the destination (e.g., --profile internal submits to Android internal track).

Key CLI Flags

Build Flags

FlagWhat it does
--profile NAMESpecifies which build profile to use from eas.json (e.g., production, preview)
--platform ios|android|allWhich platform(s) to build
--non-interactiveRequired for CI. Skips all prompts.
--no-waitQueues the build on EAS and returns immediately. Doesn't block CI runner.

Submit Flags

FlagWhat it does
--profile NAMESpecifies which submit profile to use from eas.json (e.g., production, internal)
--latestPicks the most recent successful build for that platform. Use in CI.
--id BUILD_IDSubmits a specific build. Use when --latest isn't precise enough.
--non-interactiveRequired for CI. Skips all prompts.

CI/CD Workflow Pattern

The recommended pattern splits build and submit into separate jobs:

build-ios:
  steps:
    - run: eas build --platform ios --profile production --non-interactive

submit-ios:
  needs: build-ios
  steps:
    - run: eas submit --platform ios --profile production --latest --non-interactive

Benefits:

  • Builds can succeed even if submission fails
  • Retry submissions without rebuilding
  • Clearer separation of concerns
  • Better error isolation

For Android: Use --profile internal for submit to send to internal testing track, or --profile production for production track.

For iOS: Use --profile production for submit to send to TestFlight (appears after ~10-15 min Apple processing).

Credentials

Only EXPO_TOKEN needs to be a GitHub secret. All store credentials (Apple ASC API key, Google Play service account JSON) are managed by EAS and configured once locally via:

eas credentials

EAS stores them encrypted and uses them during cloud builds/submissions.

Gotchas

iOS build succeeds but not in TestFlight -- Build succeeded but submit step didn't run or failed. The IPA is built but not uploaded. Fix: Run eas submit --platform ios --profile production --latest --non-interactive to submit the existing build.

"Build number already exists" -- Missing appVersionSource: "remote" + autoIncrement: true, or stale local version. Fix with eas build:version:set.

Android "track not found" -- The track must exist in Google Play Console first. Create it and upload one build manually before CI submissions work.

iOS not in TestFlight after upload -- Apple processing takes 10-15 min. Check App Store Connect status.

--latest picks wrong build -- It always picks the most recent successful build. Use --id for precision, or check with eas build:list --platform ios.

First Android submission ever -- Google requires the very first AAB to be uploaded manually via Play Console. After that, EAS Submit works.

Profile name confusion -- --profile production in eas build refers to the BUILD PROFILE NAME, not the release destination. It means "production-quality build" (optimized, release config). The distribution: "store" creates store-ready binaries. After building, you submit with eas submit --profile production which uses the SUBMIT PROFILE. iOS goes to TestFlight first, then you manually promote to App Store when ready.

Reference

See eas.json for the complete configuration template with submit profiles.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.