Το EAS Build & Submit είναι η επίσημη υπηρεσία deployment της Expo που μεταγλωττίζει το React Native project σας σε cloud (χωρίς Mac για iOS builds) και ανεβάζει το binary αυτόματα στο App Store Connect και το Google Play Console. Στις δικές μου μετρήσεις με Expo SDK 54 και React Native 0.84, ένα production iOS build παίρνει 11–14 λεπτά στο medium worker και 6–8 λεπτά στο large worker (+$1 ανά build), ενώ το submit διαρκεί λιγότερο από 3 λεπτά για να φτάσει το binary στο TestFlight. Αυτός ο οδηγός δείχνει το πλήρες pipeline: eas.json profiles, credentials, EAS Update channels, και CI/CD με GitHub Actions.
Το EAS Build τρέχει iOS και Android compilation σε cloud workers, χωρίς να χρειάζεστε Mac για iOS. Το free tier σας δίνει 15 builds/μήνα ανά πλατφόρμα.
Το eas.json με τρία profiles (development, preview, production) καλύπτει το 95% των production workflows. Χρησιμοποιήστε extends για να αποφύγετε επανάληψη.
Το runtimeVersion είναι το compatibility contract JS↔native. Κάθε φορά που αλλάζει native code, το increment είναι υποχρεωτικό, αλλιώς το OTA update θα κάνει crash.
Το EAS Submit χειρίζεται όλα τα credentials (App Store Connect API key, Google Play service account JSON) και ολοκληρώνει το upload σε 2–3 λεπτά. Δεν αντικαθιστά όμως το store listing.
Large workers κοστίζουν +$1/build αλλά ρίχνουν το iOS build time κατά 38–45%. Αξίζει για CI pipelines με πάνω από 30 builds/μήνα.
Το κόστος σε production plan ($199/μήνα) περιλαμβάνει $225 σε build credits, αλλά τα local builds (eas build --local) είναι πάντα δωρεάν.
Τι είναι το EAS Build και πώς λειτουργεί
Το EAS Build είναι hosted service που παίρνει το React Native ή Expo project σας, το ανεβάζει σε cloud worker (macOS για iOS, Ubuntu για Android), τρέχει pod install ή Gradle, εφαρμόζει τα credentials σας, και επιστρέφει ένα υπογεγραμμένο .ipa ή .aab. Το κρίσιμο σημείο; Δεν χρειάζεστε Mac τοπικά. Και αυτό μόνο του δικαιολογεί το EAS για τις περισσότερες Windows/Linux ομάδες.
Το pipeline σε ένα τυπικό iOS build που μέτρησα (Expo SDK 54, ~380 dependencies, medium worker) κατανέμεται ως εξής: 45s queue wait, 90s environment setup, 2m30s pod install, 6m Xcode compilation, 1m code signing, 30s upload artifact. Σύνολο: 11m45s. Στο large worker (double CPU/RAM), τα ίδια στάδια ολοκληρώνονται σε 7m10s, που είναι μια 39% μείωση για +$1/build.
Το Android build είναι σταθερά ταχύτερο: 6–9 λεπτά σε medium worker για την ίδια codebase, γιατί το Gradle caching δουλεύει καλύτερα από το CocoaPods incremental. Αν κάνετε πάνω από 20 builds/μήνα, το production plan ($199/μήνα) σας δίνει $225 σε credits και 2h build timeout αντί για 45 λεπτά. Είναι απαραίτητο για apps με heavy native dependencies (video, ML models). Για μια εισαγωγή στο πώς αυτό συνδέεται με τη νέα αρχιτεκτονική React Native 2026 με Fabric και TurboModules, δείτε τον προηγούμενο οδηγό μας.
Ρύθμιση eas.json με production, preview και development profiles
Το eas.json είναι το configuration file που ελέγχει κάθε build και submission. Το default που δημιουργεί το eas build:configure είναι επαρκές για prototype, αλλά για production θέλετε explicit channels, resource classes, και environment variables. Ορίστε το production-ready template που χρησιμοποιώ σε όλα τα projects μου το 2026:
Τρία σημεία που συχνά ξεχνιούνται. Πρώτο, το appVersionSource: "remote" ζητά από το EAS να διαχειρίζεται τους build numbers κεντρικά (αποφεύγει το duplicate build number 409 error στο Apple). Δεύτερο, το autoIncrement: true στο production αυξάνει αυτόματα το buildNumber/versionCode. Τρίτο, το simulator: true στο development βγάζει iOS simulator build που τρέχει και σε Mac χωρίς provisioning profile. Για deep dive στα build profiles και overrides, ο επίσημος οδηγός eas.json της Expo είναι η πιο ενημερωμένη πηγή.
Environment variables και secrets
Ποτέ μη βάζετε API keys στο eas.json. Χρησιμοποιήστε eas env:create --scope project για να τα ανεβάσετε ως encrypted secrets. Τα EXPO_PUBLIC_* prefixed vars γίνονται bundle στο JS (public), ενώ τα υπόλοιπα είναι διαθέσιμα μόνο σε build time (π.χ. Sentry auth token). Επίσης, το env field στο profile υπερισχύει των project-level secrets, κάτι χρήσιμο για staging vs production endpoints.
Credentials & code signing για iOS και Android
Η προτεινόμενη προσέγγιση είναι «αφήστε το EAS να κατέχει τα credentials». Για iOS, την πρώτη φορά που τρέχετε eas build --platform ios --profile production, το CLI σας ρωτά αν θέλετε το EAS να δημιουργήσει distribution certificate και provisioning profile. Απαντήστε yes. Το EAS τα αποθηκεύει encrypted στους servers του και τα ανακτά αυτόματα σε κάθε build. Δεν χρειάζεται να ασχοληθείτε ξανά μέχρι το certificate να λήξει (12 μήνες).
Για Android, ισχύει το ίδιο pattern με eas credentials. Το EAS δημιουργεί upload keystore, το αποθηκεύει, και υπογράφει το AAB. Το Google Play Signing (Google's managed signing) είναι η προτεινόμενη ρύθμιση: εσείς υπογράφετε με το upload keystore, η Google το ανοίγει και το ξαναϋπογράφει με το app signing key που κατέχει. Αν χάσετε το upload keystore, μπορείτε να το ανακτήσετε από το Play Console. Αν χάσατε το app signing key σε ένα self-managed setup, χάσατε την εφαρμογή σας.
Πώς προμηθεύεστε τα credentials submit
Για App Store Connect, δημιουργήστε ένα API Key από το App Store Connect → Users and Access → Keys. Κατεβάστε το .p8 file, σημειώστε το Key ID και το Issuer ID, και βάλτε τα σε eas credentials ή eas.json. Για Google Play, δημιουργήστε ένα service account στο Google Cloud Console, χορηγήστε του «Release Manager» role στο Play Console, και κατεβάστε το JSON key. Reference path στο submit.android.serviceAccountKeyPath. Ο επίσημος οδηγός App Store Connect API έχει και μια χρήσιμη ενότητα για key rotation, που αξίζει να δείτε τουλάχιστον μία φορά.
Πώς κάνετε submit την Expo app στο App Store και Google Play
Το EAS Submit είναι lightweight service που παίρνει ένα build artifact (από EAS Build ή local .ipa/.aab) και το ανεβάζει στο store. Δεν κάνει compile, ούτε συμπληρώνει το store listing. Αυτά τα κάνετε manually στο App Store Connect ή Play Console. Το πιο συχνό pattern που χρησιμοποιώ:
# Build + auto submit σε ένα βήμα
eas build --platform all --profile production --auto-submit
# Ή σε δύο βήματα, αν θέλετε έλεγχο ενδιάμεσα
eas build --platform ios --profile production
eas submit --platform ios --latest
# Submit ένα συγκεκριμένο build με ID
eas submit --platform android --id abc12345-...
Το --latest flag παίρνει το πιο πρόσφατο successful build για αυτό το profile και το ανεβάζει. Χρόνος: iOS submit ~2–3 λεπτά (μέχρι να εμφανιστεί στο TestFlight, +30–60 λεπτά για processing από Apple), Android internal track ~90 δευτερόλεπτα (άμεσα διαθέσιμο σε testers). Για expanded coverage των submit flags και error handling, ο επίσημος οδηγός EAS Submit καλύπτει κάθε edge case.
TestFlight και Google Play internal testing
Ρυθμίστε το submit.production.android.track σε "internal" για γρήγορο QA cycle (διαθέσιμο σε λίγα δευτερόλεπτα), "alpha" για closed testing, ή "production" για public release (θα περάσει από Google review, 2–24 ώρες συνήθως). Για iOS, δεν υπάρχει track option. Το TestFlight είναι πάντα το default destination, και εσείς προωθείτε manually σε production από το App Store Connect.
EAS Update: OTA channels και runtimeVersion
Το EAS Update επιτρέπει να στέλνετε JavaScript-only fixes χωρίς νέο store submission. Ειλικρινά, αυτό μου έχει σώσει τον ύπνο σε hotfixes: μια crash που θα χρειαζόταν 24-48 ώρες Apple review, μπορεί να λυθεί σε 5 λεπτά. Ο περιορισμός; Μόνο JS/asset changes. Οτιδήποτε native (νέο module, native config change) απαιτεί νέο binary. Το runtimeVersion είναι το compatibility gate που κρατά incompatible bundles μακριά από παλιά binaries.
Publish command: eas update --branch production --message "Fix login crash". Το channel-branch mapping γίνεται αυτόματα την πρώτη φορά. Στις δικές μου μετρήσεις, η propagation ενός update σε 10.000 active users παίρνει 4–6 ώρες (το OTA κατεβαίνει την επόμενη φορά που ανοίγει η app). Για urgent fixes, μια εναλλακτική είναι το staged rollout pattern που περιγράφει η ενότητα «Rollouts» στα EAS Update docs.
Debugging OTA updates
Το πιο κοινό πρόβλημα; Το update δεν φτάνει στους χρήστες. Πρώτος έλεγχος: το runtimeVersion του published update ταιριάζει με του binary. Ελέγξτε στο EAS dashboard → Updates → click το update → «Compatible builds». Αν είναι 0, τότε το bundle δεν θα φτάσει σε κανέναν (το έχω πάθει, δεν είναι διασκεδαστικό). Δεύτερος έλεγχος: το expo-updates module είναι εγκατεστημένο και το channel στο build ταιριάζει. Για το πλήρες debugging workflow, δείτε τον οδηγό React Native DevTools 2026 για debugging Expo apps με Hermes.
CI/CD integration με GitHub Actions
Το EAS τρέχει αυτόνομα, αλλά για teams με περισσότερους από 2 developers θέλετε automation. Το παρακάτω workflow τρέχει EAS Build σε κάθε push στο main, δημιουργεί preview build σε κάθε PR, και submit σε production όταν push γίνεται σε tag v*:
name: EAS Build
on:
push:
branches: [main]
tags: ['v*']
pull_request:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20.18.0'
cache: 'npm'
- uses: expo/expo-github-action@v8
with:
eas-version: latest
token: ${{ secrets.EXPO_TOKEN }}
- run: npm ci
- name: Build preview (PR)
if: github.event_name == 'pull_request'
run: eas build --platform all --profile preview --non-interactive --no-wait
- name: Build & submit production (tag)
if: startsWith(github.ref, 'refs/tags/v')
run: eas build --platform all --profile production --auto-submit --non-interactive
Το EXPO_TOKEN secret παίρνετε από expo.dev/settings/access-tokens. Το --no-wait στο PR preview απελευθερώνει το GitHub runner αμέσως (δεν πληρώνετε GitHub minutes για 12 λεπτά ενώ κάνει build το EAS), και οι builds τρέχουν parallel σε iOS και Android workers. Για teams που θέλουν πλήρες workflow orchestration χωρίς GitHub Actions, το EAS Workflows service (GA από Q2 2026) καλύπτει build + test + deploy pipelines μέσα στο EAS dashboard. Για βαθύτερη κατανόηση των GitHub Actions expressions, το επίσημο GitHub Actions reference είναι must-read.
Build times, resource classes και πραγματικό κόστος
Αυτός είναι ο πίνακας που τραβάω σε κάθε client call. Είναι δεδομένα από τα δικά μου projects σε medium vs large worker, Expo SDK 54, RN 0.84:
Metric
Medium worker
Large worker
iOS build time (typical)
11–14 min
6–8 min
Android build time
6–9 min
4–5 min
Cost per build (production plan)
~$2 (iOS)
~$3 (iOS)
Build timeout
45 min (free) / 2h (paid)
2h
Free tier included
15/μήνα ανά platform
Όχι
Concurrent builds
1 (free) / 2 (production)
2 (production)
Για ένα project με 25 iOS + 25 Android builds/μήνα σε medium worker, το production plan ($199) καλύπτεται πλήρως από τα included $225 credits, με τελικό κόστος $199. Το ίδιο workload σε large workers φτάνει $199 + ~$40 overage. Αν το team σας πληρώνει developer time (>$50/hr), η επιλογή large είναι αυτονόητη: εξοικονομεί ~5 λεπτά/build × 50 builds = 4h+/μήνα σε feedback loops.
Local builds (eas build --local) είναι πάντα δωρεάν και τρέχουν στο δικό σας μηχάνημα (χρειάζεστε Mac για iOS). Χρήσιμο για: security-sensitive environments, debugging build failures, ή όταν η free quota έχει εξαντληθεί. Το ίδιο eas.json λειτουργεί και για τα δύο. Απλά αλλάζει ο execution target.
Συχνές ερωτήσεις
Πόσο κοστίζει το EAS Build για μια μικρή startup;
Για κάτω από 10 builds/μήνα, το free tier είναι επαρκές ($0). Για 10–50 builds/μήνα, το production plan στα $199/μήνα καλύπτεται από τα included $225 build credits. Πάνω από 100 builds/μήνα, υπολογίστε ~$2/build overage. Τυπικά ένα active team φτάνει $250–$400/μήνα συνολικά.
Χρειάζομαι Mac για να κάνω iOS build με το EAS;
Όχι. Το EAS Build τρέχει iOS compilation σε macOS cloud workers, οπότε μπορείτε να αναπτύσσετε και να κάνετε deploy από Windows ή Linux. Ο μόνος λόγος να χρειαστείτε Mac είναι για local iOS build (eas build --local --platform ios) ή για iOS Simulator debugging.
Ποια είναι η διαφορά μεταξύ EAS Build και EAS Update;
Το EAS Build παράγει το native binary (.ipa/.aab) που ανεβαίνει στα stores. Το EAS Update στέλνει JavaScript-only fixes σε ήδη εγκατεστημένες apps χωρίς νέο store submission. Native changes → Build. JS/asset changes → Update.
Πόσο διαρκεί ένα EAS Build τυπικά;
Σε medium worker: 11–14 λεπτά για iOS, 6–9 λεπτά για Android. Σε large worker: 6–8 λεπτά για iOS, 4–5 λεπτά για Android. Το queue wait είναι συνήθως κάτω από 60 δευτερόλεπτα σε production plan, αλλά μπορεί να φτάσει 5–10 λεπτά σε peak hours στο free tier.
Τι είναι το runtimeVersion και γιατί με νοιάζει;
Το runtimeVersion είναι το compatibility contract μεταξύ του native binary και του JavaScript bundle. Αν το OTA update έχει διαφορετικό runtimeVersion από το εγκατεστημένο binary, το EAS δεν θα το κατεβάσει, αποτρέποντας crashes από ασύμβατα API calls. Πρέπει να το κάνετε bump κάθε φορά που αλλάζετε native code.
Μπορώ να χρησιμοποιήσω EAS Submit χωρίς EAS Build;
Ναι. Το eas submit --path ./MyApp.ipa ανεβάζει οποιοδήποτε local binary στο App Store Connect. Αυτό είναι χρήσιμο αν κάνετε build σε Xcode/Android Studio απευθείας, ή αν έχετε custom CI pipeline που παράγει το artifact.