Automatisieren Sie Flutter iOS/Android Builds, Code Signing und App Store Deployments mit Fastlane + GitHub Actions

Die Entwicklung von Apps mit Flutter macht Spaß, aber der Prozess der Bereitstellung der fertigen App im App Store und Google Play Store verursacht bei Entwicklern oft erheblichen Stress. Die Verwaltung von Zertifikaten, das Zuweisen von Provisioning Profiles, das Erhöhen der Build-Version und das Hochladen in den Store erfordern viel zu viele manuelle Schritte.
In diesem Leitfaden wird erläutert, wie Sie Fastlane und GitHub Actions kombinieren können, um die iOS- und Android-Builds, das Code Signing und die Store-Bereitstellungsprozesse für Ihre Flutter-App vollständig zu automatisieren.
Warum brauchen wir CI/CD-Automatisierung?
Die folgenden Probleme treten beim manuellen Bereitstellungsprozess häufig auf:
- Menschliches Versagen: Fehler wie das falsche Zuweisen von Zertifikaten oder das Vergessen, die Build-Version zu erhöhen.
- Zeitverschwendung: Zeit, die mit Warten verbracht wird, während lokal archiviert und in den Store hochgeladen wird.
- Abhängigkeit: Der Bereitstellungsprozess ist von der lokalen Umgebung (insbesondere Mac) und den Konten eines bestimmten Entwicklers abhängig.
Durch die Verwendung von GitHub Actions und Fastlane können Sie all diese Prozesse sicher in der Cloud abwickeln, indem Sie einfach Code in den main- oder release-Branch pushen.
1. Fastlane Setup (Lokal)
Zuerst müssen Sie Fastlane in den Verzeichnissen android bzw. ios Ihres Flutter-Projekts initialisieren.
Android Fastlane Initialisierung
cd android
fastlane init
Während des Initialisierungsprozesses werden Sie nach dem Paketnamen und dem Pfad zum geheimen JSON-Schlüssel gefragt. Sie benötigen den JSON-Schlüssel für das Dienstkonto (Service Account), der von der Google Play Console ausgestellt wurde.
Beispiel für android/fastlane/Fastfile:
default_platform(:android)
platform :android do
desc "Submit a new Beta Build to Crashlytics"
lane :beta do
gradle(task: "clean bundleRelease")
upload_to_play_store(track: 'beta')
end
end
iOS Fastlane Initialisierung
Für die iOS-Bereitstellung ist die Verwaltung von Zertifikaten und Provisioning Profiles von entscheidender Bedeutung. Durch die Verwendung von Fastlanes match können Sie diesen Prozess über ein Git-Repository sicher mit Teammitgliedern teilen und problemlos in CI/CD laden.
cd ios
fastlane init
fastlane match init
Beispiel für ios/fastlane/Fastfile:
default_platform(:ios)
platform :ios do
desc "Push a new beta build to TestFlight"
lane :beta do
setup_ci
match(type: "appstore", readonly: true)
# Da Flutter-Builds in GitHub Actions durchgeführt werden, verarbeitet Fastlane die bereits erstellte App.
build_app(workspace: "Runner.xcworkspace", scheme: "Runner")
upload_to_testflight
end
end
[!IMPORTANT] Um iOS Code Signing in einer CI-Umgebung auszuführen, wird die Verwendung von Fastlane Match dringend empfohlen. Es ist viel sicherer und einfacher zu verwalten, als Zertifikate lokal zu exportieren und in die CI hochzuladen.
2. Konfiguration des GitHub Actions Workflows
Erstellen Sie nun eine Datei .github/workflows/deploy.yml im Stammverzeichnis des Repositorys.
Grundlegende Workflow-Struktur und Umgebungsvariablen
Sie müssen die folgenden Werte im Voraus in GitHub Secrets speichern:
MATCH_PASSWORD: Fastlane Match EntschlüsselungspasswortMATCH_GIT_BASIC_AUTHORIZATION: PAT (Personal Access Token) für den Zugriff auf das Match-RepositoryAPP_STORE_CONNECT_API_KEY_KEY_ID: App Store Connect API Key IDAPP_STORE_CONNECT_API_KEY_ISSUER_ID: App Store Connect API Issuer IDAPP_STORE_CONNECT_API_KEY_KEY: App Store Connect API Key (.p8 Inhalt)PLAY_STORE_CONFIG_JSON: Google Play Service Account JSON Inhalt
Vollständiges Workflow-Skript
name: Deploy to App Store & Google Play
on:
push:
tags:
- 'v*' # Wird beim Pushen von Tags wie v1.0.0 ausgeführt
jobs:
build-and-deploy:
runs-on: macos-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Java
uses: actions/setup-java@v3
with:
distribution: 'zulu'
java-version: '17'
- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
channel: 'stable'
- name: Install dependencies
run: flutter pub get
# --- iOS Deployment Pipeline ---
- name: Setup Ruby for Fastlane
uses: ruby/setup-ruby@v1
with:
ruby-version: '3.2'
bundler-cache: true
working-directory: ios
- name: Decode App Store Connect API Key
run: |
mkdir -p ~/.appstoreconnect/private_keys/
echo "${{ secrets.APP_STORE_CONNECT_API_KEY_KEY }}" > ~/.appstoreconnect/private_keys/AuthKey_${{ secrets.APP_STORE_CONNECT_API_KEY_KEY_ID }}.p8
- name: Build iOS App
run: flutter build ipa --release --export-options-plist=ios/ExportOptions.plist
- name: Deploy iOS to TestFlight
working-directory: ios
env:
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GIT_BASIC_AUTHORIZATION }}
run: bundle exec fastlane beta
# --- Android Deployment Pipeline ---
- name: Setup Ruby for Fastlane (Android)
uses: ruby/setup-ruby@v1
with:
ruby-version: '3.2'
bundler-cache: true
working-directory: android
- name: Decode Play Store JSON
run: echo "${{ secrets.PLAY_STORE_CONFIG_JSON }}" > android/play_store_config.json
- name: Build Android App
run: flutter build appbundle --release
- name: Deploy Android to Play Store
working-directory: android
run: bundle exec fastlane beta
Wichtige Überlegungen
- Auswahl der Mac-Umgebung: Sie müssen den
macos-latestRunner für iOS-Builds verwenden. (Beachten Sie, dass die Abrechnungsraten höher sind als bei Linux-Runnern.) - Flutter Build Optimierung: Für iOS kann der Befehl
flutter build ipaalles bis einschließlich der Archivierung verarbeiten. In diesem Fall ist es aus Geschwindigkeitsgründen von Vorteil, Fastlane so zu konfigurieren, dass es nur die Upload-Rolle übernimmt. - API Key Authentifizierung: Die traditionelle Apple ID/Passwort-Methode ist in CI-Umgebungen aufgrund von 2FA sehr schwierig zu verwenden. Stellen Sie sicher, dass Sie einen App Store Connect API Key ausstellen und verwenden.
Leitfaden zur Fehlerbehebung
| Symptom | Ursache und Lösung |
|---|---|
Missing private key for ... (iOS) |
Kein Zugriff auf das Fastlane Match-Repository möglich, oder das MATCH_PASSWORD ist falsch. Überprüfen Sie die Secret-Werte. |
Google Api Error: Invalid request - Invalid package name (Android) |
Tritt auf, wenn die App noch nie in der Google Play Console registriert wurde. Das allererste Deployment muss manuell als AAB hochgeladen werden. |
Code signing is required for product type 'Application' (iOS) |
Die Signierungseinstellung in der Xcode-Projektdatei (.pbxproj) ist auf ‘Automatic’ eingestellt, und das Provisioning Profile wird nicht injiziert. Ändern Sie die Projekteinstellungen so, dass Match verwendet wird. |
Fazit
Der Aufbau einer CI/CD-Pipeline kann einen halben Tag für die Ersteinrichtung in Anspruch nehmen, aber sobald sie etabliert ist, spart sie bei Dutzenden oder Hunderten von nachfolgenden Deployments enorm viel Zeit und Stress. Insbesondere bei der Teamentwicklung verändert sie die Entwicklungskultur positiv, indem sie die Sorge “Wer wird bereitstellen” beseitigt.
Führen Sie Fastlane und GitHub Actions jetzt in Ihr Projekt ein und schaffen Sie eine Umgebung, in der Sie sich ausschließlich auf die Entwicklung konzentrieren können.