eas build and eas submit: Expo CI Builds
eas build runs an Expo Application Services build for iOS or Android; eas submit takes the resulting artifact and uploads it to App Store Connect or Google Play.
EAS moves the native build off your runner and into Expo cloud, driven by build profiles in eas.json. In CI the key is non-interactive mode plus a token so it never prompts for login.
What it does
eas build reads a named profile from eas.json, provisions credentials, and builds on EAS servers (or locally with --local). eas submit uploads a finished build (by id, latest, or a local path) to the store configured for the platform. eas.json profiles define release channels, build types, and env.
Common usage
eas build --platform android --profile production --non-interactive
eas build --platform ios --profile preview --non-interactive
eas submit --platform ios --latest --non-interactive
eas build --platform android --profile production --localOptions
| Flag | What it does |
|---|---|
| --platform android|ios|all | Target platform(s) |
| --profile <name> | Build profile from eas.json |
| --non-interactive | Never prompt (required in CI) |
| --local | Build on the runner instead of EAS cloud |
| --latest / --id <id> | For submit: pick which build to upload |
| --auto-submit | Submit automatically after a successful build |
In CI
Authenticate with EXPO_TOKEN as an environment variable (from a secret) so eas never asks for credentials, and always pass --non-interactive. Store signing credentials in EAS or provide them via credentials.json; for Android, an unmanaged keystore comes from a secret.
Common errors in CI
"Input is required, but stdin is not readable" means EAS hit a prompt without --non-interactive (or missing credentials). "An Expo user account is required ... EXPO_TOKEN" means no auth token is set. "Invalid eas.json" means a schema error in the config. "No Android keystore ... credentials" means the keystore is not configured in EAS or credentials.json for a non-interactive run.