Automate Mobile App Builds with Expo EAS | No CI Server Needed
Streamline mobile app development with Expo EAS. Automate builds, manage signing credentials, and submit to App Store and Google Play - no CI/CD server required.
Share this blog on
Manual mobile app builds waste time and often breaks with provisioning errors. With Expo EAS, you can automate the entire React Native CI/CD pipeline—from cloud builds and signing credentials to App Store and Google Play submissions. Simple CLI commands like eas build
, eas submit
, and eas update
replace fragile manual steps, enabling continuous delivery and instant over-the-air updates. Whether using managed or bare workflows, EAS streamlines staging and production builds, eliminates CI server setup, and keeps your release process reliable. Teams ship updates faster, reduce DevOps overhead, and focus on building better mobile apps.
Developing a mobile application is hard enough – dealing with build processes, app store uploads, and updates shouldn’t steal your joy. If you’ve ever manually archived an iOS app in Xcode, wrestled with provisioning profiles, or waited on slow, error-prone builds, you know the struggle is real. These challenges are exactly why strong build and deployment pipelines matter in mobile engineering; automation turns painful manual steps into smooth, repeatable workflows
In this guide, I’ll walk you through a developer’s journey from that pain to a streamlined solution using Expo EAS (Expo Application Services). You’ll see how to automate building, submitting, and updating your app without maintaining your own CI server. I’ll cover first steps, advanced tips, and common gotchas. Let’s dive in!
The Hidden Costs of Building and Releasing Apps Manually
Let’s face it - shipping mobile apps without automation is a productivity killer. What looks like “just a few release steps” quickly snowballs into hours of distraction, delay, and frustration. Here's what you're really signing up for when you go manual:
Tedious Builds Break Focus: Archiving in Xcode or Android Studio, exporting .ipa or .aab files, uploading to TestFlight or Play Console, bumping versions - every manual step pulls you out of deep work. Context switching becomes your biggest bottleneck.
CI Setup Is a Project on Its Own: Trying to automate? Jenkins, Bitrise, GitHub Actions - each demands config gymnastics. Think macOS runners, Android SDK layers, fragile YAMLs, and flaky scripts. It’s DevOps without the infrastructure team.
Signing = Stress: Apple certificates, provisioning profiles, Android keystores - nothing brings more uncertainty. Expired certs, wrong team access, locked keys - one misstep and you’re blocked for hours. This is not the kind of debugging you signed up for.
Every time you build and release manually, you lose flow, burn hours, and introduce risk.
“You didn’t become a developer to babysit .ipa files and renew provisioning profiles... but here we are.”
It's time to replace this grind with a system that works for us, not against us.
For a deeper dive into strategies beyond Expo, check out our Mobile App Development Services, where we help teams automate builds, reduce DevOps overhead, and ship faster.
How Expo’s EAS Simplifies Builds, Submissions, and Updates
Imagine automating every tedious part of mobile releases - building binaries, handling signing, uploading to app stores with just a few commands. That’s what Expo’s EAS (Expo Application Services) offers: a fully managed CI/CD solution for Expo and React Native apps.
EAS is a suite of cloud tools and a CLI that handles everything from builds to store submissions and even over-the-air updates; no CI server needed.
EAS Build compiles your app in the cloud, manages signing credentials, and handles Apple chores like App ID registration and provisioning - all automatically.
EAS Submit uploads builds directly to App Store Connect or Google Play from your terminal - no Transporter or Play Console required.
EAS Update delivers JS and asset hotfixes instantly, so you can ship improvements without waiting on app store reviews.
How EAS Changes the Game!
Expo EAS is purpose-built for mobile app releases, removing the complexity of generic CI setups. No Mac build agents, no YAML pipelines, just simple config and prebuilt workflows for building, submitting, and updating apps. EAS treats these as first-class tasks, so you don’t have to script them from scratch.
Why Choose EAS Over GitHub Actions?
While GitHub Actions is a flexible CI tool, managing mobile app builds through it introduces overhead, especially for iOS. You need to manually configure signing credentials, secure secrets, and maintain macOS runners.
EAS removes this burden by managing provisioning profiles and certificates automatically. EAS also supports non-interactive builds (--non-interactive
), which makes it CI-friendly when you need automated builds in pipelines without manual prompts.
Managed vs Bare Workflow
EAS supports both Expo workflows:
Managed: No native code to manage - Expo handles it for you. You write JS/TS, and EAS generates native builds as needed. Ideal for simplicity.
Bare: You control the native code (
ios/
andandroid/
folders exist). Great for custom native modules. EAS still builds in the cloud, just skips the prebuild step.
Both workflows benefit from EAS’s automation - you just choose your level of control
Getting Started with Expo EAS: Setup and First Build
So you’re ready to try EAS and see some quick wins. In this section, I’ll define the key parts of the EAS workflow and get your project configured for the first automated build.
EAS Workflow Components
In practice, using EAS involves three primary CLI commands:
eas build
Triggers a cloud build for your app, producing an Android APK/AAB or iOS IPA. You can build for development, internal testing, or app store release. EAS Build integrates deeply with Expo/React Native projects to simplify the process.
eas submit
Uploads an app binary to the Apple App Store or Google Play Store. It can take the output of eas build (or a local build) and handle the transport and authentication to submit your app for you.
eas update
Publishes an OTA update to your app (for projects using expo-updates). This allows you to deploy JS and asset changes to users instantly, via release channels (more on this later), without a new app store build.
Setting Up EAS in Your Project
Here are a few prerequisites to ensure that you have all the basics in place for setting up EAS in your project:
An Expo account (free). If you haven’t already, sign up on expo.dev and then log in via the CLI (
expo login
oreas login
).Node.js and npm installed (you likely have this if you’ve been using Expo CLI).
For iOS builds: an Apple Developer account ($99/year) is required to distribute to TestFlight or the App Store (not needed for iOS Simulator builds).
For Android: a Google Play Developer account ($25 one-time) is required to upload to the Play Store. You can still use EAS Build without those accounts for testing (e.g., building an Android APK for internal use or an iOS simulator build).
Install EAS CLI
EAS comes with its own CLI tool. Install it globally with npm:
Make sure you’re logged in:
Once authenticated, you’re ready to configure your app for EAS.
Configure the Project
In your Expo project directory, run the init command:
This command links your local project to an Expo EAS project in the cloud and creates an eas.json
file in your project if it doesn’t exist. The CLI will ask a couple of questions, for example:
iOS bundle identifier / Android package if not already set in your app config (
app.json
). Provide unique IDs (likecom.yourcompany.yourapp
).It may ask whether your project is managed or bare (to determine if it should run a prebuild). If you’re unsure, it can auto-detect in most cases.
It might prompt about setting up EAS Update (you can opt to configure OTA update channels now or later).
After running eas build:configure
, check out the newly created eas.json
file. This is where you define build profiles – named configurations for different build types. By default, Expo generates three profiles: development, preview, and production.
Example eas.json
:
This default config means:
development
: creates a Development Build (includes the Expo Dev Client for debugging) and is intended for internal distribution (not app store).preview
: creates a release build but for internal testing (not for app store, perhaps ad-hoc distribution to team testers). No dev menus included.production
: a release build configured for app store distribution.
You can also define advanced profiles like staging builds and use extends
in eas.json
to reuse config across environments. This flexibility lets you separate dev, staging, and production workflows cleanly.
Running Your First EAS Build: Android & iOS in the Cloud
Credential Setup & First Build
The first time you run eas build
, the CLI walks you through credentials - logging into Apple, generating certificates, and provisioning profiles. Let EAS handle it.
For Android, it can generate a keystore if needed; no manual steps required.
You’ll see live logs in the terminal, and once done, get a QR code and link to share the build. Internal testers can install directly, and for iOS, you can use ad-hoc builds or Expo Orbit to install on simulators.
Want to test quickly?
Use
--profile development
Or set
"ios": {"simulator": true}
ineas.json
Kickstart your release pipeline by generating signed binaries for Android and iOS - no local setup, no build machines, just one command in the terminal.
One common gotcha: for cloud builds, Metro doesn’t need to be running, but during local builds, developers sometimes wonder why Metro launches. This is expected behavior when bundling JS locally. And once the build is ready, pairing EAS with strong QA and Testing Services ensures every release is validated before it reaches users.
Use the eas build
command to kick off a build. For example:
This will bundle your app and upload it to Expo’s build servers. Within some time, you’ll have a signed Android APK/AAB ready for release.
Likewise, you can build for iOS:
To build both platforms at once, run:
For teams that prefer more control, you can also run eas build --local
to execute the same process on your own machine. This is handy for debugging or when cloud builds aren’t feasible.
Real Developer Insight: Why We Switched from GitHub Actions to EAS
Developers often compare EAS with GitHub Actions for build automation. However, with GitHub Actions, everything from key management to build configuration must be done manually, often via scripts and secrets stored in the repo.
In contrast, EAS handles credentials natively, supports interactive prompts via CLI, and keeps your mobile pipeline aligned with Expo’s evolving ecosystem. This reduces setup time and increases team-wide consistency.
“Switching to EAS cut our release time in half and removed the stress of expired certs.”
Mobile Dev, React Native Team
Conclusion: Build Smarter, Release Faster with Expo EAS
Manually managing mobile builds is no longer a badge of honor; it’s a bottleneck. Expo’s EAS offers a modern, cloud-native approach to CI/CD for mobile apps, letting developers focus on features, not file management. By adopting EAS Build, you eliminate the need for local build machines, remove friction in the signing process, and set your team up for scalable, repeatable success.
Whether you're a solo developer or scaling a product with a team, automating mobile app builds with EAS is the foundation for a faster, more reliable release process. In Part 2 of this series, we’ll dive into automating store submissions and pushing live fixes with EAS Submit and EAS Update.
If you found this post valuable, I’d love to hear your thoughts. Let’s connect and continue the conversation on LinkedIn.