CI/CD & Distribution
Release in Minuten. Hotfix in Stunden.
Fastlane, CodePush, OTA-Updates. Automatisierte Release-Pipeline fuer mobile Apps — vom Commit zum Store.
Warum automatisiertes mobiles CI/CD¶
Ein mobiler Release ist nicht wie ein Web-Deploy. Sie koennen ein Deployment nicht in Sekunden zurueckrollen. App Store Review dauert Stunden bis Tage. Signing Certificates, Provisioning Profiles, Keystores — jeder manuelle Schritt ist ein potenzieller Fehlerpunkt.
Ohne Automatisierung ist der Release ein schmerzhafter Prozess, den das Team immer wieder aufschiebt. Features stauen sich im Develop-Branch, Releases passieren einmal im Monat, Hotfixes kommen „mit dem naechsten Release.” Ergebnis: langsame Feedback-Schleife, frustrierte Nutzer, unglueckliche Entwickler.
Automatisierte Pipeline: Merge in main → automatischer Build → Tests → Signing → Upload in den Store → Team-Benachrichtigung. Der gesamte Prozess mit einem Klick (oder null Klicks mit Auto-Deploy).
Fastlane Pipeline¶
Fastlane ist der De-facto-Standard fuer die Automatisierung von mobilem CI/CD. Eine Ruby-basierte Toolchain, die den gesamten Release-Prozess orchestriert.
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 fuer Zertifikatsverwaltung: Provisioning Profiles und Signing Certificates in einem verschluesselten Git-Repository gespeichert. Jeder Entwickler und CI-Rechner teilt dieselben Credentials. Kein „Ich kann nicht builden” — fastlane match laedt alles Noetige herunter und installiert es.
Metadata as Code: App Store Metadaten (Screenshots, Beschreibungen, Release Notes, Keywords) versioniert in Git. Lokalisierung fuer mehrere Sprachen. Review-Screenshots automatisch aus UI-Tests generiert (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 im Secure Storage (CI Secrets, Vault). Upload Key vs. App Signing Key getrennt (Google Play App Signing).
Bundle vs APK: Android App Bundle (AAB) als Standard — Google Play generiert optimiertes APK pro Geraet. Kleinerer Download, schnellere Installation.
CI/CD-Infrastruktur¶
Build Server¶
- GitHub Actions: Self-hosted macOS Runner fuer iOS-Builds. Linux Runner fuer Android. Matrix Build fuer mehrere SDK-Versionen.
- Bitrise: Managed CI fuer mobile Entwicklung. macOS-Maschinen fuer iOS, Docker fuer Android. Integriert mit Fastlane.
- Xcode Cloud: Apples CI/CD. Integriert mit App Store Connect. Einschraenkung: nur iOS/macOS.
Pipeline-Stufen¶
- Lint & Static Analysis — SwiftLint, Detekt, ktlint. Automatische Code-Style-Durchsetzung.
- Unit Tests — Schnell, isoliert. Laeuft bei jedem Push. Fehlschlag = blockierter Merge.
- Integration Tests — API-Contract-Tests, Datenbank-Tests. Laeuft bei PR-Merge.
- UI Tests — E2E-Flows auf Simulator/Emulator. Laeuft bei PR-Merge und naechtlich.
- Build — Debug fuer PR, Release fuer Main/Release-Branch.
- Sign — Automatisches Signing mit Match (iOS) / Keystore (Android).
- Upload — TestFlight/Firebase App Distribution fuer Beta, Store fuer Release.
- Notify — Slack/Teams-Benachrichtigungen mit Build-Status und QR-Code zur Installation.
Parallelisierung: iOS- und Android-Builds laufen parallel. Tests parallelisiert (Sharded). Gesamte Pipeline unter 15 Minuten.
Beta-Distribution¶
TestFlight (iOS)¶
Apples offizielle Beta-Testing-Plattform:
- Internes Testing: Build sofort verfuegbar fuer das Team (bis zu 100 Tester)
- Externes Testing: App Store Connect Review (typischerweise <24h), bis zu 10.000 Tester
- Automatischer Build-Upload nach Merge in Develop
- Feedback direkt in der App — Screenshot + Annotation + Device-Info
Firebase App Distribution (Android + iOS)¶
- Distribution ausserhalb des Stores — direkter Download ueber Link oder QR-Code
- Tester-Gruppen — QA, Stakeholder, Beta-Nutzer
- Release Notes pro Build
- SDK fuer In-App-Feedback
In-App-Feedback¶
Tester schuettelt das Telefon (Shake Gesture) → Feedback-Formular oeffnet sich:
- Screenshot mit Annotationsmoeglichkeit (Pfeile, Rechtecke, Text)
- Automatisch angehaengt: Device-Info, OS-Version, App-Version, Netzwerkstatus, Logs
- Uebermittlung an Jira/Linear/GitHub Issues
- Deutlich schnellere Feedback-Schleife als „schick mir einen Screenshot per E-Mail”
OTA-Updates (CodePush)¶
Wann OTA¶
Fuer React Native und Flutter-Anwendungen: JavaScript/Dart-Bundle-Update ohne Store Review. Hotfix in Produktion in Minuten, nicht Tagen.
Was OTA kann: UI-Aenderungen, Business-Logik in JS/Dart, Content-Updates, Bugfixes in Managed Code.
Was OTA nicht kann: Nativer Code (Swift/Kotlin-Module), neue Native Dependencies, Native SDK-Updates.
Staged Rollout¶
Wir rollen ein OTA-Update niemals auf 100% der Nutzer gleichzeitig aus:
- Canary (1-5%) — Minimale Gruppe, Monitoring von Crash-Rate und Fehlerrate
- Early Adopters (10-20%) — Breitere Validierung, Business-Metriken
- General Availability (100%) — Nach Bestaetigung der Stabilitaet
Automatischer Rollback: Wenn die Crash-Rate um >X% gegenueber der Baseline steigt, wird das OTA-Update automatisch zurueckgezogen und Nutzer erhalten die vorherige Version.
Store Staged Rollout¶
- Google Play: Prozentualer Rollout (0,1% → 1% → 5% → 20% → 50% → 100%). Monitoring der Crash-free Rate in der Google Play Console. Halt und Rollback jederzeit.
- iOS Phased Release: 7-taegiger schrittweiser Rollout (1% → 2% → 5% → 10% → 20% → 50% → 100%). Halt jederzeit. Sofortige Veroeffentlichung fuer kritische Updates.
Post-Release-Monitoring¶
Release endet nicht mit dem Upload in den Store. Post-Release-Monitoring ist kritisch:
Crash Reporting¶
- Crashlytics (Firebase): Echtzeit-Crash-Reporting mit Stack Traces, Device-Info, Breadcrumbs. Automatische Gruppierung aehnlicher Crashes. Alerting bei Spikes.
- Sentry: Detaillierteres Error Tracking mit Custom Context. Performance Monitoring (Transaction Tracing). Release Health Dashboard.
Performance Monitoring¶
- Startzeit: Cold Start, Warm Start. Trend ueber Versionen.
- Frame-Rendering: Frozen Frames, Slow Frames. Jank-Erkennung.
- Netzwerk: API-Latenz, Fehlerrate, Payload-Groesse pro Endpunkt.
- Batterie und Speicher: Uebermassiger Batterieverbrauch, Memory Leaks, Festplattennutzung.
Erzwungenes Update¶
Fuer kritische Sicherheitspatches — die App zeigt einen Dialog: „Bitte aktualisieren Sie auf die neueste Version.” Konfigurierbar: Soft Update (Abbrechen moeglich) vs. Hard Update (blockiert Nutzung). Mindestversions-Check bei jedem App-Start.
Technologie-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.
Häufig gestellte Fragen
MVP in 6-8 Wochen. Vollstaendige App mit Offline-Modus, Integration und CI/CD: 3-6 Monate. Abhaengig vom Umfang — ein Discovery-Workshop hilft, Umfang und Zeitplan zu klaeren.
Swift (iOS), Kotlin (Android) fuer native Entwicklung. React Native/Flutter fuer Cross-Platform. Wir waehlen basierend auf Anforderungen, nicht auf Ideologie.