Tüm Yazılar
KategoriReact Native
Okuma Süresi
14 dk okuma
Yayın Tarihi
...
Kelime Sayısı
2.501kelime

Kahveni hazırla - bu içerikli bir makale!

Expo SDK 52, EAS Build cloud infrastructure, custom dev clients, updates (OTA), submit workflow, production app deploy — mobil CI/CD'de yeni standart.

Expo SDK 52 EAS Build: Production Workflow ve 2026 Deployment Rehberi

# Expo SDK 52 EAS Build: Production Workflow ve 2026 Deployment Rehberi

Mobil geliştirme dünyasında 2026'nın en kritik sorusu şu: "Uygulamayı nasıl deploy ediyorsun?" Artık Xcode'u açıp manuel archive yapmak, Android Studio'da Gradle scriptlerini debug etmek geride kaldı. Expo SDK 52 ve EAS Build ekosistemi, enterprise-grade bir CI/CD pipeline'ı kutudan çıkar çıkmaz sunuyor.

Bu rehberde sıfırdan production'a giden tüm yolu ele alacağız. İlk eas build komutundan TestFlight'a otomatik submit'e, OTA update branching stratejisinden monorepo desteğine kadar her şey burada.

Pro Tip: EAS Build'e geçmeden önce eas diagnostics komutunu çalıştırın. Mevcut project config'inizdeki potansiyel sorunları önceden tespit eder, ilk build'de saat kaybetmezsiniz.

İçindekiler

  1. Expo SDK 52 Yenilikleri
  2. EAS Build Nedir ve Neden Önemli?
  3. eas.json Profil Sistemi
  4. Build Cache Optimizasyonu
  5. Custom Dev Client
  6. EAS Submit Workflow
  7. OTA Updates Stratejisi
  8. Environment Variable Yönetimi
  9. Monorepo Desteği
  10. Maliyet Analizi ve Tier Seçimi

1. Expo SDK 52 Yenilikleri

SDK 52, 2025 sonunda release olan ve 2026 için standart haline gelen major versiyon. Temel değişiklikler şunlar:

React Native 0.76 altyapısı: New Architecture artık varsayılan açık. Fabric renderer ve TurboModules production-ready duruma geldi. Eski bridge mimarisine geri dönmek için artık ekstra config gerekiyor.

Expo Router v4: File-based routing sistemi artık daha güçlü. Parallel routes, intercepting routes, API routes (server actions) desteği geldi.

expo-modules-core 2.0: Native module yazma deneyimi tamamen değişti. Swift ve Kotlin için yeni API, async event emitter'lar, TypeScript type generation otomatik.

Expo Go artık sadece SDK 52+: Eski SDK versiyonları için Expo Go çalışmıyor. Custom dev client zorunlu hale geliyor — ama bu aslında bir avantaj.

SDK güncellemesi için:

bash
1# SDK upgrade komutu
2npx expo install expo@^52.0.0
3 
4# Otomatik dependency migration
5npx expo install --fix
6 
7# Breaking change check
8npx expo-doctor

expo-doctor çıktısı oldukça değerli. Hangi paketlerin uyumsuz olduğunu, hangi native config değişikliklerinin gerektiğini listeler.


2. EAS Build Nedir ve Neden Önemli?

EAS (Expo Application Services) Build, Expo'nun cloud-based build servisi. Temel farkı şu: Build işlemi kendi makinenizde değil, Expo'nun cloud worker'larında çalışıyor.

Cloud Worker Spesifikasyonları (2026):

Platform
Worker
RAM
Disk
iOS
macOS M1 Pro
14 GB
100 GB SSD
Android
Linux x86_64
16 GB
80 GB SSD

M1 Pro worker'lar sayesinde iOS build süreleri önceki Intel worker'lara göre yaklaşık 2.3x hızlandı. Özellikle büyük projelerde bu fark belirgin.

Local machine'e kıyasla avantajları:

Kendi bilgisayarınızda iOS build yapmak için Mac'e ihtiyacınız var. Windows veya Linux kullanıcıları hiçbir zaman iOS build alamaz. EAS Build bu problemi ortadan kaldırıyor — herhangi bir makineye eas build yazıyorsunuz, Expo'nun M1 makinesi iOS binary'yi üretiyor.

Ayrıca "bende çalışıyor" problemleri de çözülüyor. Build environment tamamen deterministik: hangi Node versiyonu, hangi Xcode versiyonu, hangi Gradle versiyonu kullanıldığı eas.json'da sabitlenmiş.

bash
1# EAS CLI kurulum
2npm install -g eas-cli
3 
4# Proje initialize
5eas init
6 
7# Build başlat
8eas build --platform ios --profile production

3. eas.json Profil Sistemi

eas.json dosyası EAS Build'in kalbidir. Development, preview ve production için farklı profiller tanımlanır.

json
1{
2 "cli": {
3 "version": ">= 12.0.0",
4 "appVersionSource": "remote"
5 },
6 "build": {
7 "development": {
8 "developmentClient": true,
9 "distribution": "internal",
10 "ios": {
11 "simulator": false,
12 "buildConfiguration": "Debug"
13 },
14 "android": {
15 "buildType": "apk",
16 "gradleCommand": ":app:assembleDebug"
17 },
18 "env": {
19 "APP_ENV": "development",
20 "API_URL": "https://dev-api.yourapp.com"
21 },
22 "cache": {
23 "key": "dev-v1"
24 }
25 },
26 "preview": {
27 "distribution": "internal",
28 "ios": {
29 "buildConfiguration": "Release",
30 "enterpriseProvisioning": "adhoc"
31 },
32 "android": {
33 "buildType": "apk"
34 },
35 "env": {
36 "APP_ENV": "staging",
37 "API_URL": "https://staging-api.yourapp.com"
38 }
39 },
40 "production": {
41 "ios": {
42 "buildConfiguration": "Release"
43 },
44 "android": {
45 "buildType": "app-bundle"
46 },
47 "env": {
48 "APP_ENV": "production"
49 },
50 "autoIncrement": "version",
51 "cache": {
52 "key": "prod-v1",
53 "cacheDefaultPaths": true,
54 "customPaths": [
55 "node_modules/.cache",
56 ".expo/cache"
57 ]
58 }
59 }
60 },
61 "submit": {
62 "production": {
63 "ios": {
64 "appleId": "[email protected]",
65 "ascAppId": "1234567890",
66 "appleTeamId": "ABCDEF1234"
67 },
68 "android": {
69 "serviceAccountKeyPath": "./google-service-account.json",
70 "track": "internal"
71 }
72 }
73 }
74}

Profil detayları:

  • development:: Custom dev client build. Simulator veya gerçek cihaz için debug build. Hot reload, network inspector, performans overlay çalışır.
  • preview:: Internal distribution. TestFlight veya Play Store internal'a gerek kalmadan doğrudan QR kod ile cihaza yüklenebilir.
  • production:: App Store / Play Store'a gidecek release build. App bundle (AAB) formatında, code signing otomatik.

4. Build Cache Optimizasyonu

EAS Build'in en güçlü özelliklerinden biri cache sistemi. Doğru yapılandırıldığında build süreleri dramatik düşer.

json
1{
2 "build": {
3 "production": {
4 "cache": {
5 "key": "prod-cache-v3",
6 "cacheDefaultPaths": true,
7 "customPaths": [
8 "node_modules",
9 "ios/Pods",
10 ".expo/cache",
11 "android/.gradle"
12 ],
13 "disabled": false
14 }
15 }
16 }
17}

Cache key'i ne zaman değiştirmelisiniz?

  • Native dependency eklediğinizde (yeni package.json dependency ile expo install)
  • Podfile veya build.gradle'ı manuel değiştirdiğinizde
  • Xcode veya Gradle versiyonu değiştiğinde
  • Temiz build garantisi istediğinizde

Cache etkinliği izleme:

Build loglarında Cache hit veya Cache miss mesajlarını görürsünüz. Cache miss olduğunda build ~4 dakika sürerken, cache hit ile bu ~90 saniyeye düşebilir. iOS Pods cache özellikle kritik — CocoaPods install süreci kendi başına 2-3 dakika alabilir.


5. Custom Dev Client

Expo Go artık SDK 52'de custom native modüller çalıştıramıyor. Bunun yerine custom dev client kullanılıyor. Bu aslında projenize özel bir Expo Go — içinde tam olarak sizin native modülleriniz var.

bash
1# Dev client build
2eas build --profile development --platform all
3 
4# Build bittikten sonra cihaza install
5# iOS: build URL'inden .ipa indir, cihaza yükle
6# Android: QR kod ile APK'yı direkt yükle
typescript
1// app.json - dev client konfigürasyonu
2{
3 "expo": {
4 "name": "MyApp",
5 "slug": "my-app",
6 "version": "1.0.0",
7 "runtimeVersion": {
8 "policy": "appVersion"
9 },
10 "updates": {
11 "url": "https://u.expo.dev/your-project-id",
12 "enabled": true,
13 "checkAutomatically": "ON_LOAD",
14 "fallbackToCacheTimeout": 0
15 },
16 "plugins": [
17 "expo-dev-client",
18 "expo-router",
19 [
20 "expo-build-properties",
21 {
22 "ios": {
23 "deploymentTarget": "16.0",
24 "newArchEnabled": true
25 },
26 "android": {
27 "compileSdkVersion": 35,
28 "targetSdkVersion": 35,
29 "minSdkVersion": 24,
30 "newArchEnabled": true
31 }
32 }
33 ]
34 ]
35 }
36}

Dev client bir kere yüklenince, her JavaScript değişikliği için yeniden build almanıza gerek yok. Sadece JS bundle değişir, native layer aynı kalır. Native bir şey değiştiğinde (yeni modül, config değişikliği) yeniden build alınır.


6. EAS Submit Workflow

Build tamam, şimdi store'a gönderme zamanı. EAS Submit bu adımı da otomatize ediyor.

iOS - TestFlight'a Otomatik Submit:

bash
1# Build sonrası direkt submit
2eas build --platform ios --profile production --auto-submit
3 
4# Var olan build'i submit et
5eas submit --platform ios --latest
6 
7# Belirli bir build ID ile
8eas submit --platform ios --id abc123

App Store Connect API key'i configure etmek gerekiyor:

bash
1# ASC API Key oluşturma (Apple Developer Portal'dan)
2# Key ID, Issuer ID ve .p8 dosyası gerekli
3 
4eas credentials
5# Interactive menüden iOS > App Store Connect API Key seçin

Android - Play Store Internal Track:

bash
1# Play Store submit
2eas submit --platform android --latest --profile production

Google Service Account JSON dosyası gerekiyor. Play Console'dan API access bölümünden oluşturulur. Bu dosyayı asla git'e commit etmeyin — eas secret kullanın.

GitHub Actions ile tam otomasyon:

yaml
1# .github/workflows/eas-build.yml
2name: EAS Build and Submit
3 
4on:
5 push:
6 branches: [main]
7 pull_request:
8 branches: [main]
9 
10jobs:
11 build:
12 name: EAS Build
13 runs-on: ubuntu-latest
14 steps:
15 - name: Checkout repository
16 uses: actions/checkout@v4
17 
18 - name: Setup Node.js
19 uses: actions/setup-node@v4
20 with:
21 node-version: 20
22 cache: pnpm
23 
24 - name: Install pnpm
25 uses: pnpm/action-setup@v3
26 with:
27 version: 9
28 
29 - name: Install dependencies
30 run: pnpm install --frozen-lockfile
31 
32 - name: Setup EAS
33 uses: expo/expo-github-action@v8
34 with:
35 eas-version: latest
36 token: ${{ secrets.EXPO_TOKEN }}
37 
38 - name: Build on EAS (PR preview)
39 if: github.event_name == 'pull_request'
40 run: eas build --platform all --profile preview --non-interactive
41 
42 - name: Build and Submit (main branch)
43 if: github.ref == 'refs/heads/main'
44 run: |
45 eas build --platform all --profile production --non-interactive
46 eas submit --platform all --latest --non-interactive
47 env:
48 EXPO_APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}

Bu workflow ile her PR'da preview build, her main push'ta production build + submit otomatik çalışır.


7. OTA Updates Stratejisi

EAS Update (eski Expo Updates), JavaScript bundle'ını native binary'yi güncellemeden değiştirmenizi sağlar. App Store review bypass — kritik bir bug fix'i dakikalar içinde kullanıcılara ulaştırabilirsiniz.

runtimeVersion vs SDK Version:

json
1{
2 "expo": {
3 "runtimeVersion": {
4 "policy": "appVersion"
5 }
6 }
7}

runtimeVersion hangi native binary ile hangi JS bundle'ın uyumlu olduğunu belirtir. Politikalar:

  • appVersion:: app.json'daki version string'i (1.0.0, 1.1.0...)
  • sdkVersion:: Expo SDK versiyonu
  • nativeVersion:: Native code değişikliklerini otomatik track eder (önerilen)

Branching Stratejisi:

bash
1# Production update publish
2eas update --branch production --message "Fix checkout crash"
3 
4# Staging test
5eas update --branch staging --message "New feature test"
6 
7# Belirli bir channel'a yönlendirme
8# app.json'da channel tanımlanmış olmalı
typescript
1// Uygulama içi update kontrolü
2import * as Updates from "expo-updates";
3 
4async function checkForUpdates() {
5 if (!Updates.isEnabled) {
6 console.log("Updates disabled in development");
7 return;
8 }
9 
10 try {
11 const update = await Updates.checkForUpdateAsync();
12 
13 if (update.isAvailable) {
14 await Updates.fetchUpdateAsync();
15 
16 // Kullanıcıya sor veya kritikse direkt reload
17 Alert.alert(
18 "Güncelleme Hazır",
19 "Yeni bir güncelleme yüklendi. Uygulamayı yeniden başlatmak ister misiniz?",
20 [
21 { text: "Sonra", style: "cancel" },
22 {
23 text: "Şimdi Yenile",
24 onPress: () => Updates.reloadAsync(),
25 },
26 ]
27 );
28 }
29 } catch (error) {
30 // Update check başarısız — mevcut bundle ile devam et
31 console.error("Update check failed:", error);
32 }
33}

Rollback Stratejisi:

Bir update bozuk çıktıysa geri almak için:

bash
1# Son başarılı update'i bul
2eas update:list --branch production
3 
4# Önceki update'e rollback
5eas update:rollback --branch production --group

OTA update sınırları: Native kod değişiklikleri (yeni modül ekleme, permission değişikliği, Podfile/Gradle değişikliği) OTA ile gönderilemez. Bunlar için yeni binary build gerekir.


8. Environment Variable Yönetimi

Production uygulamalarında API key'leri, secret'ları doğru yönetmek kritik. EAS'ın iki farklı mekanizması var.

Build-time secrets (eas secret):

bash
1# Secret ekle
2eas secret:create --scope project --name STRIPE_SECRET_KEY --value sk_live_xxx
3 
4# Tüm secret'ları listele
5eas secret:list
6 
7# Secret'ı sil
8eas secret:delete --id secret-id

Build sırasında environment variable olarak erişilir, binary içine gömülmez. Server-side API call'larda kullanılan key'ler için ideal.

Client-side env variables (expo-constants):

typescript
1// app.config.ts - dynamic config
2import { ExpoConfig, ConfigContext } from "expo/config";
3 
4export default ({ config }: ConfigContext): ExpoConfig => ({
5 ...config,
6 name: "MyApp",
7 extra: {
8 apiUrl: process.env.API_URL ?? "https://api.yourapp.com",
9 stripePublishableKey: process.env.STRIPE_PUBLISHABLE_KEY ?? "",
10 sentryDsn: process.env.SENTRY_DSN ?? "",
11 appEnv: process.env.APP_ENV ?? "production",
12 eas: {
13 projectId: "your-project-uuid",
14 },
15 },
16});
typescript
1// Constants kullanımı
2import Constants from "expo-constants";
3 
4const API_URL = Constants.expoConfig?.extra?.apiUrl as string;
5const IS_PRODUCTION = Constants.expoConfig?.extra?.appEnv === "production";
6 
7// Type-safe wrapper
8interface AppConfig {
9 apiUrl: string;
10 stripePublishableKey: string;
11 appEnv: "development" | "staging" | "production";
12}
13 
14export function getAppConfig(): AppConfig {
15 const extra = Constants.expoConfig?.extra;
16 if (!extra) throw new Error("App config not available");
17 
18 return {
19 apiUrl: extra.apiUrl,
20 stripePublishableKey: extra.stripePublishableKey,
21 appEnv: extra.appEnv,
22 };
23}

Önemli güvenlik notu: extra alanındaki değerler JavaScript bundle'ına gömülür ve reverse engineering ile okunabilir. Asla private key, secret token gibi değerleri burada tutmayın. Sadece public API key'ler (Stripe publishable key, Sentry DSN, Analytics tracking ID) güvenli.


9. Monorepo Desteği

2026'da büyük React Native projeleri büyük çoğunlukla monorepo yapısında. EAS Build native monorepo desteği sunuyor.

swift
1my-monorepo/
2├── apps/
3│ ├── mobile/ # Expo uygulaması
4│ │ ├── app.json
5│ │ ├── eas.json
6│ │ └── package.json
7│ └── web/ # Next.js
8├── packages/
9│ ├── ui/ # Shared component library
10│ ├── api-client/ # Shared API types
11│ └── utils/ # Shared utilities
12├── package.json
13└── pnpm-workspace.yaml
json
1{
2 "build": {
3 "production": {
4 "node": {
5 "version": "20.x"
6 },
7 "env": {
8 "EXPO_NO_DOTENV": "1"
9 }
10 }
11 }
12}
bash
1# Monorepo root'ta değil, app dizininde çalıştır
2cd apps/mobile
3eas build --platform ios --profile production
4 
5# Veya root'tan subdirectory belirterek
6eas build --platform ios --profile production --work-dir apps/mobile
yaml
1# pnpm-workspace.yaml
2packages:
3 - "apps/*"
4 - "packages/*"

Monorepo'da dikkat edilmesi gereken nokta: node_modules hoisting. pnpm ile shamefully-hoist=true veya public-hoist-pattern ayarları Expo için gerekebilir. .npmrc dosyasına:

ini
1public-hoist-pattern[]=*expo*
2public-hoist-pattern[]=*react-native*
3public-hoist-pattern[]=@react-native*

10. Maliyet Analizi ve Tier Seçimi

EAS Build fiyatlandırması 2026 için:

Tier
Aylık Ücret
Concurrent Builds
iOS Build Dakikası
Android Build Dakikası
Free
$0
1
30 dk/ay
30 dk/ay
Production
$99
10
Sınırsız
Sınırsız
Enterprise
Custom
Sınırsız
Sınırsız
Sınırsız

Free tier ne zaman yeterli?

Solo developer, hobbyist projeler, ilk MVP. Ayda 30 dakika build süresine denk — yaklaşık 5-8 build.

Production tier ne zaman gerekli?

Aktif geliştirme aşamasındaki ticari proje. Günlük birden fazla build, CI/CD pipeline, team kullanımı. $99/ay maliyeti Xcode'u çalıştıracak Mac mini kiralamaktan (yaklaşık $150-200/ay) ucuz.

Alternatif: Self-hosted EAS Build

Enterprise tier yerine kendi runner'larınızı kullanabilirsiniz:

bash
1# Self-hosted runner kurulum (EAS Worker)
2eas worker:create --platform ios
3 
4# Runner'ı başlatma (kendi Mac'inizde)
5eas worker:run

Bu sayede $99/ay ödemeden kendi M1 Mac'inizi build worker olarak kullanabilirsiniz. Ama CI stability, uptime, paralel build yönetimi sizin sorumluluğunuzda.


bash
1# 1. Tüm native config doğru mu?
2npx expo-doctor
3 
4# 2. Credentials hazır mı?
5eas credentials
6 
7# 3. Environment variable'lar set edildi mi?
8eas secret:list
9 
10# 4. runtimeVersion policy doğru mu?
11# app.json kontrolü
12 
13# 5. Test build (preview profile)
14eas build --platform all --profile preview
15 
16# 6. OTA update channel'ları configured mı?
17eas channel:list
18 
19# 7. Son build sonrası production submit
20eas build --platform all --profile production --auto-submit

ALTIN İPUCU

Bu yazının en değerli bilgisi

Bu ipucu, yazının en önemli çıkarımını içeriyor.

yaml
1# .github/workflows/pr-preview.yml
2name: PR Preview Build
3 
4on:
5 pull_request:
6 types: [opened, synchronize]
7 
8jobs:
9 preview:
10 runs-on: ubuntu-latest
11 steps:
12 - uses: actions/checkout@v4
13 
14 - uses: expo/expo-github-action@v8
15 with:
16 eas-version: latest
17 token: ${{ secrets.EXPO_TOKEN }}
18 
19 - run: pnpm install --frozen-lockfile
20 
21 - name: Create preview build
22 run: |
23 eas build --platform all --profile preview --non-interactive --message "PR #${{ github.event.pull_request.number }}: ${{ github.event.pull_request.title }}"
24 
25 - name: Comment PR with build links
26 uses: actions/github-script@v7
27 with:
28 script: |
29 github.rest.issues.createComment({
30 issue_number: context.issue.number,
31 owner: context.repo.owner,
32 repo: context.repo.repo,
33 body: "Build hazır! EAS Dashboard'dan indirin: https://expo.dev/accounts/your-account/projects/your-project/builds"
34 })

Easter Egg

Gizli bir bilgi buldun!

Bu bölümde gizli bir bilgi var. Keşfetmek ister misin?

dockerfile
1# eas-build.Dockerfile
2FROM ubuntu:22.04
3 
4# Node.js 20
5RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
6RUN apt-get install -y nodejs
7 
8# pnpm
9RUN npm install -g pnpm@9
10 
11# Android SDK
12ENV ANDROID_HOME=/opt/android-sdk
13RUN mkdir -p $ANDROID_HOME/cmdline-tools
14# ... Android SDK kurulumu
15 
16# Custom tools (özel signing tools, internal CLI, vb.)
17RUN npm install -g @mycompany/deploy-cli
json
1{
2 "build": {
3 "production": {
4 "android": {
5 "image": "your-registry/eas-build:latest"
6 }
7 }
8 }
9}

Okuyucu Ödülü

EAS Build'de kendi Docker image'ınızı kullanabilirsiniz. Bu özellik henüz preview aşamasında ama son derece güçlü:

Sonuç

Expo SDK 52 ve EAS Build kombinasyonu, 2026'da mobil CI/CD'nin altın standardı. Manual archive ve submission süreçleri geride kaldı. Doğru yapılandırılmış bir EAS pipeline ile:

  • Her commit'te otomatik build tetiklenebilir
  • Her PR için test edilebilir preview build oluşturulabilir
  • Critical bug fix'ler OTA update ile dakikalar içinde canlıya alınabilir
  • iOS ve Android submit tamamen otomatize edilebilir

Başlangıç için en kritik adım eas.json profil yapılandırmasını doğru kurmak. Development, preview ve production ortamları net ayrıldıktan sonra geri kalan her şey bu temelin üzerine inşa ediliyor.

React Native geliştirme sürecinizi bir üst seviyeye taşımak istiyorsanız React Native vs Flutter karşılaştırmasına göz atabilirsiniz. AI araçlarıyla geliştirme verimliliğini nasıl artıracağınızı öğrenmek için Claude Computer Use API rehberini incelemenizi öneririm.

Faydalı kaynaklar:

Etiketler

#Expo#EAS Build#React Native#OTA Updates#CI/CD#Deployment#2026
Muhittin Çamdalı

Muhittin Çamdalı

Senior iOS Developer

12+ yıllık deneyime sahip iOS Developer. Swift, SwiftUI ve modern iOS mimarileri konusunda uzman. Apple platformlarında performanslı ve kullanıcı dostu uygulamalar geliştiriyorum.

iOS Geliştirme Haberleri

Haftalık Swift tips, SwiftUI tricks ve iOS best practices. Spam yok, sadece değerli içerik.

Gizliliğinize saygı duyuyoruz. İstediğiniz zaman abonelikten çıkabilirsiniz.

Paylaş

Bunu da begenebilirsiniz