effidevFlutter · Cloudflare-Edge · Cloud-Kostenoptimierung
Deutsch

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

Illustration einer CI/CD Deployment-Pipeline mit App Store und Google Play Icons

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:

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:

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

  1. Auswahl der Mac-Umgebung: Sie müssen den macos-latest Runner für iOS-Builds verwenden. (Beachten Sie, dass die Abrechnungsraten höher sind als bei Linux-Runnern.)
  2. Flutter Build Optimierung: Für iOS kann der Befehl flutter build ipa alles 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.
  3. 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.