Mobil CI/CD, web’deki “build & deploy”dan fazlasıdır: code signing, provisioning, store metadata, cihaz matrisi, OTA ve rollback. React Native’de bir de iki native toolchain (Gradle + Xcode) + JS bundle eklenir.
Pipeline kalitesi YAML uzunluğu değil; artifact bütünlüğü ve karar kapılarıdır. İmza, source map, native/OTA ayrımı oturmadan “günde üç store submit” yalnızca daha hızlı kırılmaktır.
Minimal sağlıklı pipeline
- Quality gate: lint, typecheck, unit test — PR merge blocker
- JS bundle sanity: Metro release + Hermes bytecode doğrulama
- Android release: AAB + mapping.txt arşivi
- iOS release: archive + export + dSYM arşivi
- Distribute: internal (Firebase / TestFlight) otomatik
- Store upload: production için manuel approval
- Opsiyonel OTA: native değişmemişse JS-only publish
- Observability: Sentry/Crashlytics + source map upload
Kavramsal GitHub Actions iskeleti:
jobs:
quality:
steps:
- run: yarn lint && yarn tsc --noEmit && yarn test
android-release:
needs: quality
steps:
- run: ./gradlew :app:bundleRelease
- uses: actions/upload-artifact@v4
with:
name: mapping
path: android/app/build/outputs/mapping/release/mapping.txt
ios-release:
needs: quality
steps:
- run: bundle exec fastlane ios beta
Quality gate’i atlayan “hotfix pipeline” borç biriktirir — acil durumda bile minimal test koşulsun.
PR vs release pipeline
Her PR’da tam native release pahalıdır; çoğu ekip PR’da quality + (opsiyonel) JS bundle çalıştırır. Native release main merge veya tag’de tetiklenir. Native kod değiştiren PR’larda en az bir platformda smoke release düşünün.
EAS vs Fastlane vs hybrid
| Yaklaşım | Artı | Eksi | Kim için |
|---|---|---|---|
| EAS Build | Düşük bakım, cloud macOS | Vendor lock-in | Küçük-orta ekip |
| Fastlane + self-host | Tam kontrol | Mac runner maliyeti | Regüle ortam, büyük ekip |
| Hybrid | EAS native + kendi OTA | İki sistem bilmek | Expo + custom native |
Karar: ekip boyutu, compliance, macOS runner erişimi.
İmzalama ve secret’lar
- Android: keystore + Play App Signing
- iOS: distribution certificate + provisioning (match veya ASC API key)
- CI secret’ları: rotate edilebilir, audit log’lu
- Anti-pattern: laptop’tan manuel store upload
Sertifika süresi dolmadan 30 gün önce alert. Staging ve production credential’ları ayrı tutun. Repo’da yalnızca .env.example kalsın.
OTA’nın pipeline’daki yeri
OTA (Over-The-Air) yalnızca JS bundle değişikliğinde çalışır. Native kod, Gradle/Pod, native config değiştiyse store pipeline zorunlu.
Path filter örneği:
git diff --name-only origin/main...HEAD | grep -E '^(android|ios|package.json|yarn.lock|app\.json)' \
&& echo "BLOCK OTA — native-capable change" || echo "JS-only OTA candidate"
package.json native modül bump içerebilir; otomatik OTA tehlikelidir. OTA bundle belirli native binary versiyonuna hedeflenmeli (targetBinaryVersion).
New Architecture ve CI matrix
Geçişte newArchEnabled=true/false matrix faydalıdır — her iki modda yeşil olmadan default değiştirmeyin.
- Pod cache key: RN sürümü + Podfile.lock + new arch flag
- Codegen’i commitlemeyin; build’de üretin
- Android R8 + New Arch’ı release job’da mutlaka çalıştırın
Cache: hız vs doğruluk
- node_modules / yarn cache
- Gradle dependency cache
- CocoaPods cache
- Metro transform cache (metro + babel hash)
Haftalık clean builder job — cache’siz tam pipeline — regresyonu erken yakalar.
Artifact bütünlüğü
| Artifact | Amaç | Platform |
|---|---|---|
| JS source map | Hermes stack | Her iki |
| mapping.txt | R8 reverse | Android |
| dSYM | Crash symbolication | iOS |
| AAB / IPA | Store + referans | Her iki |
| OTA metadata | Rollback + audit | JS-only |
Release name, build number ve git SHA her artifact’ta tutarlı olmalı.
Rollback runbook
Store: Yeni versiyon submit (downgrade yok). Kritik bug’da hızlı hotfix binary — OTA yetmez.
OTA: Önceki bundle’a promote, 30 dk monitoring. Threshold aşılırsa store hotfix.
Pipeline: Bozuk CI config’i geri al; artifact’lar immutable.
Production checklist
- PR’da quality gate zorunlu
- mapping.txt + dSYM + source map otomatik upload
- Internal dağıtım otomatik
- Store production upload manuel approval
- OTA path filter aktif
- Rollback runbook yazılı (store + OTA ayrı)
- Haftalık clean build job
- New Arch matrix (geçiş döneminde)
- Sertifika expiry alert 30 gün önce
Özet
RN CI/CD kalitesi artifact bütünlüğü ve karar kapılarında ölçülür. İmza güvenliği, symbol upload, native/OTA ayrımı ve cache hijyeni oturduğunda hotfix süresi düşer. Pipeline’ı “build geçti” değil “doğru artifact doğru yere gitti” olarak tanımlayın.