CI/CD & distribuce
Release za minuty. Hotfix za hodiny.
Automatizujeme celý release pipeline mobilních aplikací — build, testování, podpis, upload do Store. Žádné ruční kroky.
Proč automatizovaný mobilní CI/CD¶
Mobilní release není jako web deploy. Nemůžete deployment rollbacknout za sekundy. App Store review trvá hodiny až dny. Signing certificates, provisioning profiles, keystores — každý ruční krok je potenciální selhání.
Bez automatizace je release bolestivý proces, který tým odkládá. Features se hromadí v develop branchi, release se dělá jednou za měsíc, hotfixy jdou „až s příštím releasem.” Výsledek: pomalý feedback loop, frustrovaní uživatelé, nešťastní vývojáři.
Automatizovaný pipeline: Merge do main → automatický build → testy → signing → upload do Store → notifikace týmu. Celý proces na jedno kliknutí (nebo zero clicks s auto-deploy).
Fastlane pipeline¶
Fastlane je de facto standard pro automatizaci mobilního CI/CD. Ruby-based toolchain, který orchestruje celý release process.
iOS pipeline¶
lane :release do
increment_build_number
run_tests(scheme: "AppTests")
match(type: "appstore") # certificate management
gym(scheme: "App") # build
pilot(skip_waiting: true) # upload to TestFlight
upload_to_app_store # App Store release
end
Match pro certificate management: Provisioning profiles a signing certificates uložené v šifrovaném Git repozitáři. Každý vývojář a CI stroj sdílí stejné credentials. Žádné „nemůžu buildovat” — fastlane match stáhne a nainstaluje vše potřebné.
Metadata as code: App Store metadata (screenshots, popisy, release notes, keywords) verzované v Gitu. Lokalizace pro více jazyků. Review screenshots generované automaticky z UI testů (fastlane snapshot).
Android pipeline¶
lane :release do
increment_version_code
gradle(task: "test")
gradle(task: "assembleRelease")
supply(track: "internal") # upload to Google Play
end
Keystore management: Signing keystore v secure storage (CI secrets, Vault). Upload key vs. app signing key oddělené (Google Play App Signing).
Bundle vs APK: Android App Bundle (AAB) jako default — Google Play generuje optimalizované APK per zařízení. Menší download, rychlejší instalace.
CI/CD infrastruktura¶
Build servery¶
- GitHub Actions: Self-hosted macOS runners pro iOS buildy. Linux runners pro Android. Matrix build pro více verzí SDK.
- Bitrise: Managed CI pro mobilní vývoj. macOS stroje pro iOS, Docker pro Android. Integrované s Fastlane.
- Xcode Cloud: Apple’s CI/CD. Integrované s App Store Connect. Omezení: jen iOS/macOS.
Pipeline stages¶
- Lint & Static Analysis — SwiftLint, Detekt, ktlint. Code style enforcement automaticky.
- Unit Tests — Rychlé, izolované. Běží při každém push. Fail = blocked merge.
- Integration Tests — API contract testy, database testy. Běží na PR merge.
- UI Tests — E2E flows na simulátoru/emulátoru. Běží na PR merge a nightly.
- Build — Debug pro PR, Release pro main/release branch.
- Sign — Automatic signing s Match (iOS) / Keystore (Android).
- Upload — TestFlight/Firebase App Distribution pro beta, Store pro release.
- Notify — Slack/Teams notifikace s build statusem a QR kódem pro instalaci.
Paralelizace: iOS a Android buildy běží paralelně. Testy paralelně (sharded). Celý pipeline pod 15 minut.
Beta distribuce¶
TestFlight (iOS)¶
Apple’s official beta testing platform:
- Internal testing: build dostupný okamžitě pro tým (až 100 testerů)
- External testing: App Store Connect review (typicky <24h), až 10 000 testerů
- Automatic build upload po merge do develop
- Feedback přímo v aplikaci — screenshot + anotace + device info
Firebase App Distribution (Android + iOS)¶
- Distribuce mimo Store — přímý download přes link nebo QR kód
- Tester groups — QA, stakeholders, beta users
- Release notes per build
- SDK pro in-app feedback
In-app feedback¶
Tester potřásne telefonem (shake gesture) → otevře se feedback formulář:
- Screenshot s možností anotace (šipky, obdélníky, text)
- Automaticky přiložené: device info, OS verze, app verze, network stav, logs
- Odeslání do Jira/Linear/GitHub Issues
- Výrazně rychlejší feedback loop než „pošli mi screenshot přes email”
OTA updates (CodePush)¶
Kdy OTA¶
Pro React Native a Flutter aplikace: JavaScript/Dart bundle update bez Store review. Hotfix v produkci za minuty, ne dny.
Co OTA může: UI změny, business logika v JS/Dart, content updates, bug fixy v managed kódu.
Co OTA nemůže: Nativní kód (Swift/Kotlin moduly), nové native dependencies, native SDK updates.
Staged rollout¶
Nikdy nerolloutneme OTA update na 100% uživatelů naráz:
- Canary (1-5%) — minimální skupina, monitoring crash rate a error rate
- Early adopters (10-20%) — širší validace, business metriky
- General availability (100%) — po potvrzení stability
Automatic rollback: pokud crash rate vzroste o >X% oproti baseline, OTA update se automaticky stáhne a uživatelé dostanou předchozí verzi.
Store staged rollout¶
- Google Play: Procentuální rollout (0.1% → 1% → 5% → 20% → 50% → 100%). Monitoring crash-free rate v Google Play Console. Halt and rollback kdykoliv.
- iOS Phased Release: 7-denní postupný rollout (1% → 2% → 5% → 10% → 20% → 50% → 100%). Halt kdykoliv. Immediate release pro kritické updates.
Post-release monitoring¶
Release nekončí uploadem do Store. Monitoring po release je kritický:
Crash reporting¶
- Crashlytics (Firebase): Real-time crash reporting s stack traces, device info, breadcrumbs. Automatické grouping podobných crashů. Alerting při spike.
- Sentry: Detailnější error tracking s custom context. Performance monitoring (transaction tracing). Release health dashboard.
Performance monitoring¶
- Startup time: Cold start, warm start. Trend across verzí.
- Frame rendering: Frozen frames, slow frames. Detekce jank.
- Network: API latence, error rate, payload size per endpoint.
- Battery a memory: Excessive battery drain, memory leaks, disk usage.
Forced update¶
Pro kritické security patche — aplikace zobrazí dialog: „Aktualizujte na nejnovější verzi.” Konfigurovatelné: soft update (dismiss možný) vs. hard update (blokuje použití). Minimum version check při každém app startu.
Technologický stack¶
CI/CD: Fastlane, GitHub Actions, Bitrise, Xcode Cloud, Gradle.
Distribution: TestFlight, Firebase App Distribution, Google Play Console, App Store Connect.
OTA: CodePush (App Center), Expo Updates, Shorebird (Flutter).
Monitoring: Crashlytics, Sentry, Firebase Performance, Google Play Vitals, App Store Connect Analytics.
Signing: Fastlane Match, Android Keystore, Google Play App Signing.
Časté otázky
Přes CodePush/OTA: minuty. Přes Store: hodiny (Android), hodiny až dny (iOS review). Pro kritické bugy máme OTA cestu, pro native changes Store cestu s expedited review.
CodePush umožňuje aktualizovat JavaScript bundle React Native aplikace bez Store review. Ideální pro hotfixy, content changes, UI tweaky. Nelze použít pro nativní kód — to vyžaduje Store update.
Fastlane Match pro iOS — sdílené certifikáty a provisioning profiles v šifrovaném Git repu. Keystore management pro Android. Žádné 'nemůžu buildovat, nemám certifikát'.
Ano. Google Play staged rollout (1% → 10% → 50% → 100%) s automatickou evaluací crash rate. iOS phased release (7 dní). Rollback kdykoliv před 100%.