From atum-workflows
Expo Application Services (EAS) deployment pattern library for React Native and Expo apps — EAS Build for iOS and Android native builds in the cloud, EAS Submit for App Store Connect and Google Play Console uploads, EAS Update for OTA updates without app store review (shipping JavaScript fixes in hours instead of days), eas.json build profiles (development / preview / production), credentials management (Apple certificates, provisioning profiles, keystores), environment variables per profile, build caches, internal distribution via Ad-Hoc or TestFlight Internal Testing, monorepo support with workspaces, and integration with CI (GitHub Actions). Use when building or deploying a React Native / Expo app to iOS or Android, configuring build profiles, managing signing credentials, pushing OTA updates, or automating mobile deployment via CI. Differentiates from platform-specific skills (deploy-app-store, deploy-play-store) by covering the build pipeline, not the store submission workflow.
npx claudepluginhub arnwaldn/atum-plugins-collection --plugin atum-workflowsThis skill uses the workspace's default tool permissions.
EAS est la suite Expo pour builder, tester, et distribuer des apps React Native sans devoir configurer Xcode/Android Studio localement. Trois services clés : **EAS Build**, **EAS Submit**, **EAS Update**.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Searches prompts.chat for AI prompt templates by keyword or category, retrieves by ID with variable handling, and improves prompts via AI. Use for discovering or enhancing prompts.
Dispatches parallel agents to independently tackle 2+ tasks like separate test failures or subsystems without shared state or dependencies.
EAS est la suite Expo pour builder, tester, et distribuer des apps React Native sans devoir configurer Xcode/Android Studio localement. Trois services clés : EAS Build, EAS Submit, EAS Update.
# Install EAS CLI
npm install -g eas-cli
# Login
eas login
# Configurer un projet
cd my-app
eas build:configure
# Génère eas.json et ajoute projectId dans app.json
eas.json — profiles de build{
"cli": {
"version": ">= 14.0.0",
"appVersionSource": "remote"
},
"build": {
"development": {
"developmentClient": true,
"distribution": "internal",
"channel": "development",
"env": {
"API_URL": "https://dev.example.com"
}
},
"preview": {
"distribution": "internal",
"channel": "preview",
"ios": {
"simulator": true
},
"env": {
"API_URL": "https://staging.example.com"
}
},
"production": {
"channel": "production",
"autoIncrement": true,
"env": {
"API_URL": "https://api.example.com"
}
}
},
"submit": {
"production": {
"ios": {
"appleId": "developer@example.com",
"ascAppId": "1234567890",
"appleTeamId": "ABCD1234EF"
},
"android": {
"serviceAccountKeyPath": "./pc-api-xxx.json",
"track": "production",
"releaseStatus": "completed"
}
}
}
}
# Build preview pour TestFlight Internal
eas build --profile preview --platform ios
# Build production pour soumission App Store
eas build --profile production --platform ios
# Build Android APK pour test interne
eas build --profile preview --platform android
# Build Android AAB pour Play Store
eas build --profile production --platform android
eas build --profile preview --platform ios --local # ou sur EAS si tu veux
Les builds iOS simulator ne nécessitent pas de certificats Apple — utile pour du test rapide.
# Laisser EAS gérer les certificats
eas credentials
# → iOS → Set up a new build credential
EAS peut :
Ou bien uploader manuellement les credentials existants.
eas credentials
# → Android → Set up a new build credential
Règle critique : le keystore Android doit être sauvegardé off-site. Si perdu, impossible de publier une update.
# Submit à App Store Connect (TestFlight → Review → App Store)
eas submit --profile production --platform ios --latest
# Submit à Play Console
eas submit --profile production --platform android --latest
Prérequis iOS :
ascAppId dans eas.jsonPrérequis Android :
# Publier une update JS/assets sans rebuild
eas update --branch production --message "Fix login bug"
Les users reçoivent la update au prochain lancement de l'app (ou via Updates.checkForUpdateAsync() en code).
Limites :
runtimeVersion)// app.json
{
"expo": {
"runtimeVersion": {
"policy": "appVersion"
}
}
}
appVersion policy : chaque version native est sa propre "runtime". Les updates OTA ne vont que vers les users sur la même version native.
EAS injecte les variables déclarées dans eas.json au moment du build. Pour les secrets :
# Secret côté EAS (chiffré)
eas secret:create --scope project --name STRIPE_KEY --value sk_live_xxx
# Le build l'injecte comme env var
Dans le code :
const STRIPE_KEY = process.env.EXPO_PUBLIC_STRIPE_KEY // accessible côté JS runtime si préfixé EXPO_PUBLIC_
Règle : les vars préfixées EXPO_PUBLIC_ sont accessibles dans le JS bundle (donc visible par les users). Les vars sans préfixe sont server-side only (build-time).
// eas.json dans un monorepo pnpm
{
"build": {
"production": {
"node": "20.0.0",
"pnpm": "9.0.0",
"prebuildCommand": "pnpm --filter=@app/mobile install"
}
}
}
Aussi possible via cli.requireCommit: true pour forcer un commit avant chaque build (évite les builds avec du working dir sale).
# .github/workflows/eas-build.yml
name: EAS Build
on:
push:
branches: [main]
paths: ['apps/mobile/**']
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install EAS CLI
run: npm install -g eas-cli
- name: Install deps
run: pnpm install
- name: EAS Build
run: eas build --profile production --platform all --non-interactive
env:
EXPO_TOKEN: ${{ secrets.EXPO_TOKEN }}
EXPO_TOKEN = personal access token généré sur expo.dev/accounts/<username>/settings/access-tokens.
EAS cache automatiquement :
node_modulesPour forcer un rebuild sans cache : --clear-cache.
EXPO_PUBLIC_* pour un secret → secret exposé dans le bundleappVersionSource: remote → conflits de version entre devseas.json committé avec profiles dev / preview / productionruntimeVersion policy définieEXPO_TOKENdeploy-app-store (dans ce plugin)deploy-play-store (dans ce plugin)expo-expert (dans atum-stack-mobile)atum-stack-mobile