Expo EAS Build i Submit u 2026: deploy React Native aplikacija na App Store i Google Play

Praktični vodič kroz Expo EAS Build profile, EAS Submit u TestFlight i Google Play, EAS Update OTA kanale i CI/CD pipeline za objavu React Native aplikacija u 2026.

Expo EAS Build 2026: App Store Deploy Vodič

Sjećam se kako je objava React Native aplikacije na App Store i Google Play još 2024. izgledala kao mali pothvat — sati borbe s Xcodeom, čupanje kose oko Android Studio konfiguracija, ručno potpisivanje, i naravno (zašto ne) povremeni promašeni provisioning profili koji bi srušili release u zadnji čas. U 2026. taj proces je gotovo neprepoznatljiv. Expo Application Services (EAS) postao je defacto standard koji preuzima cijelu složenost na sebe: cloud build infrastruktura, automatsko upravljanje certifikatima, izravna predaja u TestFlight i Google Play, pa i OTA ažuriranja s kontroliranim postupnim uvođenjem.

U ovom vodiču idemo od prvog eas build poziva do produkcijskog releasea s OTA hotfix kanalom — koristeći Expo SDK 53, React Native 0.79 i najnoviju verziju EAS CLI-ja. Sve naredbe i konfiguracije provjerene su na 2026. tooling stacku, tako da možete kopirati bez straha da nešto neće raditi.

Što je novo u EAS-u 2026.

Da budem iskren, EAS u 2026. više nije samo build servis. Riječ je o cjelovitoj deployment platformi koja objedinjuje:

  • EAS Build — cloud builderi za iOS i Android (Linux runneri za Android, macOS runneri za iOS)
  • EAS Submit — automatska predaja u App Store Connect i Google Play Console
  • EAS Update — OTA isporuka s kanalima, postupnim rolloutima i rollbackom
  • EAS Workflows — CI/CD orkestracija definirana u YAML-u, s integracijom u GitHub i GitLab eventima
  • EAS Hosting — hosting za Expo Router web verziju aplikacije

Najvažnije promjene u zadnjih dvanaest mjeseci? Tu su nativna podrška za privacy manifest datoteke koje Apple inzistira da imate, automatsko generiranje SDK declaration popisa za Google Play, znatno brži iOS build runneri temeljeni na Apple Silicon hardveru, te puno čvršća integracija s expo-updates protokolom verzije 1.

Preduvjeti i prva instalacija

Prije nego što krenemo, par stvari koje trebate imati spremne:

  • Besplatni Expo račun (registracija na expo.dev)
  • Apple Developer Program članstvo (99 USD/godina) za distribuciju na App Store
  • Google Play Console račun (jednokratno 25 USD) za Android distribuciju
  • Node.js 20 LTS ili noviji
  • Git inicijaliziran projekt — EAS zna biti vrlo nepopustljiv ako u radnoj kopiji visi nešto neispraćeno (osobno iskustvo, jednom me to koštalo pola sata)

EAS CLI instalirate globalno preko npm-a:

npm install -g eas-cli
eas --version
eas login

Mali savjet — ako CLI prijavi noviju verziju, ažurirajte ga prije svakog produkcijskog builda. Razlike između minor verzija znaju (tiho) utjecati na format eas.json sheme.

Inicijalizacija eas.json datoteke

Iz korijena projekta pokrenite:

eas init
eas build:configure

Prva naredba povezuje projekt s EAS računom i upisuje extra.eas.projectId u app.json. Druga generira inicijalni eas.json s tri standardna profila:

{
  "cli": {
    "version": ">= 14.0.0",
    "appVersionSource": "remote"
  },
  "build": {
    "development": {
      "developmentClient": true,
      "distribution": "internal"
    },
    "preview": {
      "distribution": "internal",
      "channel": "preview"
    },
    "production": {
      "autoIncrement": true,
      "channel": "production"
    }
  },
  "submit": {
    "production": {}
  }
}

Polje appVersionSource: "remote" možda je najveća promjena posljednjih godina — verzije aplikacije sada se vode na EAS serverima umjesto u app.json datoteci. To sprječava one frustrirajuće konflikte u timovima i osigurava monotone build brojeve između developera.

Razumijevanje build profila

Profil je, jednostavno rečeno, imenovani skup parametara koji opisuje točno jedan tip builda. Uobičajena tri (i njihove uloge) izgledaju ovako:

ProfildistributiondevelopmentClientTipična upotreba
developmentinternaltrueLokalni dev s expo-dev-client
previewinternalfalseQA, dionici, demo buildovi
productionstorefalseSubmit u App Store / Play Store

Profil nasljeđivanje s extends

Da izbjegnete duplikate (a vjerujte mi, brzo se nakupe), koristite extends ključ. Lanac može biti dubok do pet razina:

{
  "build": {
    "base": {
      "node": "20.18.0",
      "env": {
        "EXPO_PUBLIC_API_URL": "https://api.example.com"
      }
    },
    "production": {
      "extends": "base",
      "autoIncrement": true,
      "channel": "production",
      "ios": {
        "resourceClass": "large"
      }
    },
    "preview": {
      "extends": "production",
      "distribution": "internal",
      "channel": "preview",
      "env": {
        "EXPO_PUBLIC_API_URL": "https://staging-api.example.com"
      }
    }
  }
}

Resource klase

Default je medium. Za velike projekte s teškim native ovisnostima poput Skia ili Vision Camera, prebacite na large — ubrzanje builda obično je negdje između 30 i 50 posto, uz proporcionalno višu cijenu po minuti. U mom slučaju, na projektu s puno native modula, large se isplatio već prvog mjeseca.

Upravljanje certifikatima i potpisivanjem

Iskreno, najveće olakšanje koje EAS donosi je automatsko upravljanje credentials. Kod prvog iOS builda CLI će vas pitati želite li da Expo generira distribucijski certifikat i provisioning profil:

eas build --platform ios --profile production

Odgovorite potvrdno i unesite Apple Developer kredencijale jednom — EAS pohranjuje certifikate enkriptirano i ponovno ih koristi pri svakom buildu. Za Android, EAS može generirati keystore ili koristiti onaj vaš postojeći:

eas credentials

Ova interaktivna naredba otvara izbornik za upload, zamjenu ili izvoz keystore datoteke. Spremite back-up keystore datoteke izvan EAS-a — i to ozbiljno. Gubitak Android keystore znači da nikad više nećete moći ažurirati postojeću aplikaciju na Play Storeu. Ne, niti jedan support ticket vam tu ne pomaže.

Pokretanje prvog builda

Najjednostavniji development build koji možete instalirati izravno na uređaj:

eas build --profile development --platform all

EAS će u pozadini napraviti otprilike sljedeće:

  1. Pakirati izvorni kod u tarball
  2. Uploadati ga u cloud builder
  3. Pokrenuti npm install i expo prebuild (ako koristite managed workflow)
  4. Izvršiti xcodebuild ili gradlew assembleRelease
  5. Vratiti URL s .ipa ili .apk datotekom

Build za mali projekt traje 4 do 8 minuta po platformi. Status pratite naredbom eas build:list ili u web dashboardu — što god vam je zgodnije.

Internal distribution za QA tim

Preview profil s distribution: "internal" generira link koji možete podijeliti s testerima. Na iOS-u koristi ad-hoc provisioning, što znači da svaki uređaj mora biti registriran u Apple Developer računu (da, znam, gnjavaža):

eas device:create
eas build --profile preview --platform ios

Naredba eas device:create generira QR kod koji tester skenira sa svog uređaja. Nakon registracije, sljedeći preview build automatski uključuje uređaj u provisioning profil. Za Android nema te restrikcije — svatko s linkom može instalirati APK i krenuti.

Submit u App Store i Google Play

Nakon uspješnog production builda, predajete ga preko EAS Submit:

eas submit --profile production --platform ios --latest
eas submit --profile production --platform android --latest

Flag --latest govori EAS-u da uzme posljednji uspješan production build. Možete također specificirati --id <build-id> ili --path za lokalnu binarnu datoteku.

Konfiguracija submit profila

{
  "submit": {
    "production": {
      "ios": {
        "appleId": "[email protected]",
        "ascAppId": "1234567890",
        "appleTeamId": "ABC123XYZ"
      },
      "android": {
        "serviceAccountKeyPath": "./play-service-account.json",
        "track": "internal",
        "releaseStatus": "draft"
      }
    }
  }
}

iOS — TestFlight tijek

Sve iOS submissione EAS šalje u App Store Connect, a Apple ih nakon 10 do 15 minuta procesiranja stavlja na raspolaganje u TestFlightu. Razlikujemo dva tipa testiranja:

  • Internal testing — do 100 testera registriranih u vašem Apple Developer računu. Build je dostupan odmah po procesiranju.
  • External testing — do 10.000 vanjskih testera preko email pozivnica ili javnog linka. Zahtijeva brzi Apple review (obično par sati).

Bitno: TestFlight build se ne objavljuje automatski na App Store. Za produkcijsko izdanje morate u App Store Connectu popuniti metadata, screenshote, privacy upitnik i submitati za App Review. Da, sve to. Sretno.

Android — Google Play tracks

Polje track u submit profilu može biti:

  • internal — do 100 testera, dostupno odmah
  • alpha — closed testing, veće grupe
  • beta — open ili closed beta
  • production — javno izdanje nakon Google review

Jedna kvaka koju vrijedi naglasiti: prvi submit aplikacije u Google Play Console morate napraviti ručno — Google API ne dopušta API-based prvo izdanje. Sva sljedeća izdanja idu kroz eas submit bez problema.

Auto-submit za skraćivanje koraka

Flag --auto-submit spaja build i submit u jednu naredbu, što je idealno za CI:

eas build --platform all --profile production --auto-submit

Po završetku builda, EAS automatski poziva eas submit s odgovarajućim submit profilom. Ako koristite različite submit profile za različite buildove, imenujte ih i koristite --auto-submit-with-profile=staging-submit.

EAS Update — OTA ažuriranja

OTA pomaže izbjeći App Store review delay za sitne JavaScript bugfixeve. (A vjerujte, vrijedi zlata kad u petak navečer otkrijete krivu putanju u checkout flowu.) Instalacija je jednostavna:

npx expo install expo-updates
eas update:configure

Konfiguracija u eas.json povezuje build profile s update kanalima. Kada objavite update na production kanal, samo buildovi s tim kanalom dobivaju novu JS verziju.

eas update --branch production --message "Hotfix za navigaciju u checkout flowu"

Runtime Version — kritično pravilo

Polje runtimeVersion u app.json određuje kompatibilnost između JS bundlea i instaliranog binarnog buildaa. Ako promijenite native dependency (recimo, dodate Vision Camera), morate povećati runtime verziju — inače OTA može srušiti aplikaciju jer JS očekuje native modul kojeg na uređaju nema.

{
  "expo": {
    "runtimeVersion": {
      "policy": "fingerprint"
    }
  }
}

Politika fingerprint automatski generira hash svih native ovisnosti i mijenja runtime verziju samo kad se native dio doista promijeni. Ovo je preporučena postavka u 2026. — i osobno, ne bih je više mijenjao.

Postupni rollout

Umjesto da objavite update svim korisnicima odjednom (i molite se), koristite rollout postotak:

eas update --branch production --message "v2.5.1" --rollout-percentage 10

Update će dobiti samo 10 posto korisnika. Ako monitoring pokaže da nema crash spikea, povećajte:

eas update:edit --rollout-percentage 50

Strategije rollbacka

Ako loš update prodre u produkciju (a kad-tad hoće), imate tri opcije:

  1. Revertirati git commit i objaviti novi update — najsigurnije, jer ide kroz isti pipeline:
    git revert HEAD
    eas update --branch production --message "Rollback: revert lošeg patcha"
  2. Re-pointati kanal na poznatu stabilnu granu:
    eas channel:edit production --branch production-v2.5.0-stable
  3. Republicirati prethodnu update grupu po UUID-u:
    eas update:republish --group <uuid> --branch production

Mala napomena s ožiljaka: ako update sruši aplikaciju prije nego se expo-updates stigne učitati, OTA rollback neće raditi — korisnici moraju reinstalirati aplikaciju. Zato uvijek, ali stvarno uvijek, testirajte na preview kanalu prije roll-outa.

CI/CD integracija — EAS Workflows

EAS Workflows su YAML pipelinei koji žive u .eas/workflows/ direktoriju. Tipičan pipeline za production release na push u main granu:

name: Production release

on:
  push:
    branches: [main]

jobs:
  build_ios:
    type: build
    params:
      platform: ios
      profile: production
  submit_ios:
    needs: [build_ios]
    type: submit
    params:
      platform: ios
      build_id: ${{ needs.build_ios.outputs.build_id }}
  build_android:
    type: build
    params:
      platform: android
      profile: production
  submit_android:
    needs: [build_android]
    type: submit
    params:
      platform: android
      build_id: ${{ needs.build_android.outputs.build_id }}

Pokretanje:

eas workflow:run production-release.yml

Alternativno, koristite GitHub Actions s expo/expo-github-action:

- name: Setup EAS
  uses: expo/expo-github-action@v8
  with:
    eas-version: latest
    token: ${{ secrets.EXPO_TOKEN }}

- name: Build production
  run: eas build --platform all --profile production --non-interactive --no-wait

Token generirate u Expo dashboardu (expo.dev/accounts/[username]/settings/access-tokens) i pohranjujete kao GitHub repository secret. Standardni postupak, ali ne zaboravite ga rotirati barem jednom godišnje.

Najčešće greške i kako ih riješiti

Greška: "Invalid bundle identifier" pri iOS submitu

App Store Connect očekuje da bundle ID iz app.json postoji u Apple Developer portalu. Provjerite ios.bundleIdentifier i registrirajte App ID u Apple portalu prije prvog submita. Klasika koju svi promašimo barem jednom.

Greška: "Version code already used" na Androidu

Google Play odbija buildove s istim versionCode. Riješenje je autoIncrement: true u production profilu — EAS automatski povećava broj između buildova.

OTA update se ne primjenjuje na uređaju

Tri uobičajena uzroka:

  1. Runtime verzija builda i updatea ne odgovara — provjerite s eas update:list
  2. Aplikacija provjerava samo na cold start, a korisnik radi warm reload — testirajte gašenjem aplikacije
  3. checkAutomatically postavljen na NEVER u app.json — promijenite na ON_LOAD

Build pada na "Pod install failed"

Najčešće zbog konflikta između react-native i Expo SDK verzije. Pokrenite npx expo install --fix da uskladite ovisnosti, pa ponovno buildajte. U 9 od 10 slučajeva — to riješi stvar.

FAQ

Trebam li Mac za buildanje iOS aplikacije s EAS-om?

Ne. EAS Build ima macOS runnere u Expo cloudu koji izvršavaju Xcode build. Razvijate na Windowsu ili Linuxu, EAS odrađuje sve native korake umjesto vas.

Koliko košta EAS Build u 2026.?

Free tier daje 30 medium buildova mjesečno. Production planovi započinju na 99 USD/mjesec za neograničene buildove i prioritetni queue. EAS Update i Submit su besplatni za sve planove (uz fer korištenje).

Mogu li koristiti EAS bez managed Expo workflowa?

Da. EAS radi i s "bare" React Native projektima. Pokrenite eas build:configure u postojećem RN projektu i EAS će prepoznati native projekte u ios/ i android/ direktorijima.

Što se sve može mijenjati preko OTA, a što ne?

Možete: JavaScript kod, slike, fontove, JSON konfiguracije, navigation strukture. Ne možete: dodati native modul, promijeniti app ikonu, splash screen, app permissions, Info.plist ili AndroidManifest.xml.

Kako se nositi s tajnama (API ključevi) u EAS buildu?

Koristite EAS Secrets — naredba eas secret:create sprema vrijednost na server, a u eas.json je referencirate kroz env. Tajne se nikad ne nalaze u git repozitoriju i nedostupne su klijentskom kodu osim ako ih eksplicitno bundlate s EXPO_PUBLIC_ prefiksom.

Zaključak

Deployment React Native aplikacije u 2026. više nije usko grlo. Uz pravilno postavljen eas.json s razdvojenim profilima, automatske credential workflowe, EAS Update kanale i CI/CD pipeline u EAS Workflowima, vrijeme od commita do produkcije skraćuje se s dana na minute. Investicija u ispravnu konfiguraciju isplaćuje se mnogostruko — manje incidenata, brži rollback, manje vremena potrošenog na tooling, više vremena za izgradnju značajki koje korisnici zapravo vide.

Najvažniji savjet (i nešto što sam naučio na teži način): počnite s preview profilom i internal distribution, naviknite se na ritam eas build → eas submit → eas update, i tek onda automatizirajte preko Workflows. Tim koji razumije svaki korak ručno može odgovorno graditi automatizaciju koja će ga preživjeti.

O Autoru Editorial Team

Our team of expert writers and editors.