Zum Hauptinhalt springen
CI/CD

Automatischer Capacitor IOS-Build mit GitHub-Aktionen mit Zertifikat

Wie Sie eine CI/CD-Pipeline für Ihre IOS-Ionic-App mit fastlane und GitHub Actions in 5 Minuten (2024) einrichten

Automatischer Capacitor IOS-Build mit GitHub-Aktionen mit Zertifikat

Die Einrichtung von CI/CD für Capacitor-Apps kann komplex und zeitaufwändig sein. Hier ist, was Sie wissen müssen:

Wir empfehlen nun die Verwendung Capgo-Build mit der Capgo CLI für native Capacitor-Bauten. Dieser Fastlane-Leitfaden wird für Teams aufrechterhalten, die bestehende GitHub-Actions-Pipelines weiterhin pflegen, aber neue iOS-Builds sollten die Capgo CLI verwenden, damit Sie Fastlane, Xcode-Runner, Zertifikate und Upload-Skripte nicht selbst pflegen müssen.

Capgo-Build für CI/CD durch Capgo

Vermeiden Sie die Pflege von Fastlane, Xcode-Runner, Zertifikaten, Berechtigungsprofilen und Upload-Skripten. Capgo-Build erstellt signierte native iOS-Builds aus Ihrem bestehenden CI/CD-Pipeline:

  • Funktioniert mit Ihrem PipelineTrigger Capgo Build von GitHub Actions, GitLab CI, Jenkins oder lokalen Skripten nach Ihrem Web-Build und npx cap sync.
  • Signieren aus CI-SchlüsselnHalten Sie App Store Connect-Schlüssel, -Zertifikate, -Profilprofile, -Passwörter und Team-IDs in Ihren eigenen CI-Secrets.
  • Keine native Runner-Pflege: Capgo Build bietet gepflegte Apple-Build-Umgebungen, sodass Sie macOS-Runner, Xcode-Bilder oder Fastlane-Linien nicht selbst verwalten müssen.
  • Kompontente und Einreichung: Herunterladen von signierten Artefakten für QA oder Einreichung von Release-Builds über die Capgo CLI.

Pricing

  • Capgo-Pläne beginnen bei 12 $/Monat
  • Enthält OTA-Updates und etwa 15 native Builds pro Monat.
  • Umfasst OTA-Updates und etwa 15 native Builds pro Monat

Einstellen Sie die Capgo-Build in CI/CD

Konfigurieren Sie __CAPGO_KEEP_0__ Build in CI/CD

Hier sind die erforderlichen Schritte:

Stetige Lieferung für iOS mit Fastlane und GitHub Aktionen und Zertifikat

Prerequisites

Bevor Sie mit der Anleitung fortfahren:

  • Bevor Sie mit dem Tutorial fortfahren: installiert auf Ihrem Entwicklungsmaschine.
  • Stellen Sie sicher, dass Sie Mitglied des iOS-Entwicklerprogramms sind.

Wichtige Informationen zum Preis

Preis GitHub Action

https://github.com/features/actions

Der Service ist ‘kostenlos’ bis zur Grenze, abhängig von der gewählten Maschine.
Wir werden eine macOS Maschine verwenden, Sie können im Screenshot ihren Preis und Grenzen (Preise zum Zeitpunkt der Erstellung des Tutorials, sie könnten sich in Zukunft ändern) sehen.

Nach Warnung über Anforderungen und Preise, fahren wir fort.

Hinweis: In diesem Beitrag gehe ich davon aus, dass Sie die App in App Store Connect erstellt haben. Die wichtigen Informationen werden von Fastlane kopiert!

Was werden Sie in diesem Tutorial lernen?

Schritte, die Sie in diesem Beitrag befolgen müssen.

  1. Verwendung von App Store Connect API mit Fastlane.
    • Anforderungen:
      • Erstellung eines App Store Connect API-Schlüssels.
      • Verwendung eines App Store Connect API-Schlüssels.
  2. Kopieren von Dateien von Fastlane
  3. Konfiguration von GitHub-Aktionen

1. Verwendung von App Store Connect API mit Fastlane

Ab Februar 2021 ist für alle Benutzer eine zweifaktorale Authentifizierung oder eine zweistufige Überprüfung erforderlich, um sich bei App Store Connect anzumelden. Diese zusätzliche Sicherheitsschicht für Ihr Apple-Konto hilft sicherzustellen, dass Sie der einzige Person sind, die Zugriff auf Ihr Konto haben.
Von Apple Support

Anforderungen

Um App Store Connect API verwenden zu können, müssen Sie die folgenden Informationen bereitstellen. Drei Dinge:

  1. Aussteller-ID
  2. Zertifikats-ID
  3. Zertifikat oder Zertifikatsinhalt

Erwerb eines App Store Connect API-Zertifikats

Um Zertifikate zu generieren, müssen Sie in App Store Connect Administratorrechte haben. Wenn Sie diese Berechtigung nicht haben, können Sie den relevanten Personen diesen Artikel empfehlen.

  1. Anmelden zu App Store Connect.

  2. Wählen Benutzer und Zugriff.

Zugriff auf App Store Connect-Benutzer

3 — Wählen Sie die Integrationsoption.

App Store Connect API-Integration

  1. Klicken Sie auf "Generate API Key" oder auf die (+) Taste.

App Store Connect API-Schlüssel erstellen

  1. Tragen Sie einen Namen für den Schlüssel ein. Der Name dient nur Ihrer Referenz und ist nicht Teil des Schlüssels selbst.

App Store Connect API-Schlüssel erstellen: Name

6 — Unter Zugriff wählen Sie die Rolle für den Schlüssel aus. Die für Schlüssel geltenden Rollen sind dieselben Rollen, die für Benutzer auf Ihrem Team gelten. Siehe Rollenberechtigungen. Wir empfehlen, auszuwählen App-Manager.

  1. Klicken Sie auf Generieren.

Ein Schlüssel von API kann nicht auf bestimmte Apps beschränkt werden.

Der Name des neuen Schlüssels, die Schlüssel-ID, ein Download-Link und weitere Informationen erscheinen auf der Seite.

App Store Connect-Download-Schlüssel

Hier können Sie alle drei notwendigen Informationen erhalten.
<1> Issue ID. (APPLE_ISSUER_ID geheim)
2. Schlüssel-ID. (APPLE_KEY_ID geheim)
3. Klicken Sie auf "Download API-Schlüssel" zum Herunterladen Ihres API-privaten Schlüssels. Der Download-Link erscheint nur, wenn der private Schlüssel noch nicht heruntergeladen wurde. Apple hält keinen Kopie des privaten Schlüssels. Sie können ihn also nur einmal herunterladen.

🔴 Speichern Sie Ihren privaten Schlüssel an einem sicheren Ort. Sie sollten Ihre Schlüssel niemals teilen, Schlüssel in einem code-Repository speichern oder Schlüssel in Client-Seiten code-Code einbetten.

Verwendung eines App Store Connect API-Schlüssels

Das API-Schlüssel-Datei (p8-Datei, die Sie herunterladen), die Schlüssel-ID und die Aussteller-ID sind erforderlich, um den JWT-Token für die Autorisierung zu erstellen. Es gibt mehrere Möglichkeiten, diese Informationen in Fastlane einzugeben. Ich habe mich dafür entschieden, die neue Aktion von Fastlane zu verwenden app_store_connect_api_keySie können andere Möglichkeiten in der Fastlane-Dokumentationerfahren. Ich zeige Ihnen diese Methode, weil ich glaube, dass sie die einfachste Möglichkeit ist, um mit den meisten CI auszukommen, bei denen Sie Umgebungsvariablen setzen können.

Bitte konvertieren Sie die heruntergeladene p8-Datei in Base64 und speichern Sie sie als Geheimnis (APPLE_KEY_CONTENT).

base64 -i APPLE_KEY_CONTENT.p8 | pbcopy

Jetzt können wir App Store Connect mit Fastlane über den API-Schlüssel verwalten, großartig!

2. Zertifikate

Öffnen Sie XCode und gehen Sie zu Einstellungen > Konten > Apple-ID > Teams und wählen Sie Ihr Team.

Code Signierungsidentitäten

Klicken Sie auf Zertifikate verwalten.

Wenn Sie noch kein Zertifikat erstellt haben, können Sie ein neues Zertifikat erstellen.

Klicken Sie auf + und wählen Sie Apple Distribution

Apple Distribution

Dann müssen Sie zum Schlüsselkarten-Manager gehen, um das Zertifikat als Datei herunterzuladen. .p12 file.

Um dies zu tun, müssen Sie zum Schlüsselkarten-Manager wechseln. login Schlüsselkette und dann die Registerkarte Meine Zertifikate.

Meine Zertifikate

Dann können Sie das Zertifikat auswählen, das Sie herunterladen möchten. (Suchen Sie nach dem Zertifikat nach dem Datum)

Dann klicken Sie mit der rechten Maustaste auf das private Schlüsselzertifikat und wählen Sie keychain.

Wählen Sie die Dateiformat PERSÖNLICHE INFORMATIONSAUSTAUSCH-DATEI (.p12).

Das wird das Zertifikat als Datei herunterladen. .p12 file.

Öffnen Sie das Datei in einem Terminal und verwenden Sie den folgenden Befehl, um es in Base64 umzuwandeln:

base64 -i BUILD_CERTIFICATE.p12 | pbcopy

Dies wird zu Ihrem BUILD_CERTIFICATE_BASE64 Geheimnis. Bitte geben Sie auch bei einer Anfrage das Passwort für das Zertifikat an. Dieses Passwort wird Ihr P12_PASSWORD secret.

3. Provisionierungsprofile

Open Apple Developer Wenn Sie fertig sind, klicken Sie auf "Open".

Erstellen Sie dann ein neues Profil, indem Sie auf +

Ein neues Profil erstellen

Und wählen Sie App Store Connect.

App Store Connect auswählen

Dann müssen Sie das richtige App auswählen, bitte beachten Sie, dass Sie keine Wildcard verwenden dürfen, sonst wird die Signierung fehlschlagen.

Die richtige App auswählen

Wählen Sie das richtige Zertifikat, das Sie vorher erstellt haben (suchen Sie nach dem Ablaufdatum, es sollte der gleiche Tag und Monat wie heute sein), und klicken Sie auf Weiter.

Das richtige Zertifikat auswählen

Geben Sie schließlich den Namen des Profils ein und klicken Sie auf Erstellen.

Der Name wird verwendet, um das Profil in Fastlane zu identifizieren, unter der Werte von APPLE_PROFILE_NAME.

Das Profil generieren

Sie können das Profil als .mobileprovision file.

Das Profil herunterladen

Bitte konvertieren Sie das Profil in Base64 und speichern Sie es als Geheimnis (BUILD_PROVISION_PROFILE_BASE64).

base64 -i BUILD_PROVISION_PROFILE.mobileprovision | pbcopy

4. Kopieren Sie die Fastlane-Dateien

Fastlane ist eine Ruby-Bibliothek, die zum Automatisieren von gängigen Aufgaben der mobilen Entwicklung erstellt wurde. Mit Fastlane können Sie benutzerdefinierte "Bahnen" konfigurieren, die eine Reihe von "Aktionen" enthalten, die Aufgaben ausführen, die Sie normalerweise mit Android Studio durchführen würden. Sie können viel mit Fastlane erreichen, aber für die Zwecke dieses Tutorials werden wir nur eine Handvoll grundlegender Aktionen verwenden.

Erstellen Sie das Fastlane-Verzeichnis am Root Ihres Capacitor/Ionic-Projekts und fügen Sie das Fastfile dort hin:

  • Verzeichnis: <project-root>/fastlane/
  • Datei: <project-root>/fastlane/Fastfile

Dies ist auf der gleichen Ebene wie package.json, capacitor.config.*, und das ios/ Ordner. Erstellen Sie ihn nicht innerhalb von ios/App/.

platform :ios do
  desc 'Export ipa and submit to TestFlight'
  lane :beta do
    keychain_info = { keychain_name: "ios-build-#{Time.now.to_i}.keychain", keychain_password: SecureRandom.uuid }
    
    begin
      setup_signing(keychain_info)
      bump_build_number
      build_app_with_signing(keychain_info)
      submit_to_testflight
    ensure
      cleanup_keychain(keychain_info)
    end
  end

  private_lane :setup_signing do |options|
    create_keychain(
      name: options[:keychain_name],
      password: options[:keychain_password],
      unlock: true,
      timeout: 0,
      lock_when_sleeps: false, 
      add_to_search_list: true
    )
    import_cert(options)
    install_profile
    update_project_settings
  end

  lane :bump_build_number do
		file = File.read('../package.json')
		data_hash = JSON.parse(file)
		api_key = app_store_connect_api_key(
      key_id: ENV['APPLE_KEY_ID'],
      issuer_id: ENV['APPLE_ISSUER_ID'],
      key_content: ENV['APPLE_KEY_CONTENT'],
      is_key_content_base64: true,
      duration: 1200,
      in_house: false
    )
		build_num = app_store_build_number(
      api_key: api_key,
			app_identifier: ENV['BUNDLE_IDENTIFIER'],
			live: false
    )
		build_num = build_num + 1
		UI.message("Bumped build number to #{build_num}")
		increment_build_number(
			build_number: build_num,
			xcodeproj: "./ios/App/App.xcodeproj",
			skip_info_plist: true
		)
	end

  private_lane :import_cert do |options|
    cert_path = "#{Dir.tmpdir}/build_certificate.p12"
    File.write(cert_path, Base64.decode64(ENV['BUILD_CERTIFICATE_BASE64']))
    import_certificate(
      certificate_path: cert_path,
      certificate_password: ENV['P12_PASSWORD'] || "",
      keychain_name: options[:keychain_name],
      keychain_password: options[:keychain_password],
      log_output: true
    )
    File.delete(cert_path)
  end  
  
  private_lane :cleanup_keychain do |options|
    delete_keychain(
      name: options[:keychain_name]
    )
  end  

  private_lane :install_profile do
    profile_path = "#{Dir.tmpdir}/build_pp.mobileprovision"
    File.write(profile_path, Base64.decode64(ENV['BUILD_PROVISION_PROFILE_BASE64']))
    UI.user_error!("Failed to create provisioning profile at #{profile_path}") unless File.exist?(profile_path)
    ENV['PROVISIONING_PROFILE_PATH'] = profile_path
    install_provisioning_profile(path: profile_path)
    File.delete(profile_path)
  end

  private_lane :update_project_settings do
    update_code_signing_settings(
      use_automatic_signing: false,
      path: "./ios/App/App.xcodeproj",
      code_sign_identity: "iPhone Distribution",
      profile_name: ENV['APPLE_PROFILE_NAME'],
      bundle_identifier: ENV['BUNDLE_IDENTIFIER'],
      team_id: ENV['APP_STORE_CONNECT_TEAM_ID']
    )
    update_project_team(
      path: "./ios/App/App.xcodeproj",
      teamid: ENV['APP_STORE_CONNECT_TEAM_ID']
    )
  end

  private_lane :build_app_with_signing do |options|
    unlock_keychain(
      path: options[:keychain_name],
      password: options[:keychain_password],
      set_default: false
    )
    build_app(
      workspace: "./ios/App/App.xcworkspace",
      scheme: "App",
      configuration: "Release",
      export_method: "app-store",
      output_name: "App.ipa",
      export_options: {
        provisioningProfiles: {
          ENV['BUNDLE_IDENTIFIER'] => ENV['APPLE_PROFILE_NAME']
        }
      },
      xcargs: "-verbose",
      buildlog_path: "./build_logs",
      export_xcargs: "-allowProvisioningUpdates",
    )
  end   

  private_lane :submit_to_testflight do
    api_key = app_store_connect_api_key(
      key_id: ENV['APPLE_KEY_ID'],
      issuer_id: ENV['APPLE_ISSUER_ID'],
      key_content: ENV['APPLE_KEY_CONTENT'],
      is_key_content_base64: true,
      duration: 1200,
      in_house: false
    )
    pilot(
      api_key: api_key,
      skip_waiting_for_build_processing: true,
      skip_submission: true,
      distribute_external: false,
      notify_external_testers: false,
      ipa: "./App.ipa"
    )
  end
end

5. Einstellungen für Geheimnisse

GitHub Actions verwendet die Repository-Secrets, die Sie in dem nächsten Schritt konfigurieren. Sie benötigen nur ein lokales .env Wenn Sie Fastlane von Ihrem eigenen Computer aus ausführen oder testen möchten.

Für lokale Tests erstellen <project-root>/fastlane/.env nächstes FastfileFügen Sie diesen Datei nicht hinzu. Fügen Sie mit Add. fastlane/.env zu deinem .gitignore Ermitteln Sie die APP_STORE_CONNECT_TEAM_ID

APP_STORE_CONNECT_TEAM_ID=UVTJ336J2D
BUNDLE_IDENTIFIER=ee.forgr.testfastlane
# See previous section for these secrets
BUILD_CERTIFICATE_BASE64=
BUILD_PROVISION_PROFILE_BASE64=
APPLE_KEY_ID=
APPLE_ISSUER_ID=
APPLE_KEY_CONTENT=
P12_PASSWORD=
APPLE_PROFILE_NAME=

Getting the APP_STORE_CONNECT_TEAM_ID

Gehe zu Entwickler-Zentrum und scrollen Sie nach unten bis zur Membership details Abschnitt. Team ID ist der Wert, den Sie in der APP_STORE_CONNECT_TEAM_ID secret.

app-store-connect-team-id

Getting the BUNDLE_IDENTIFIER

  1. Öffnen Sie Xcode
  2. BUNDLE_IDENTIFIER erhalten App im Projektnavigator
  3. Doppelklicken Sie auf den Signing and Capabilities
  4. in der Projektnavigatorleiste Bundle identifier. Dies ist der Wert, den Sie in der BUNDLE_IDENTIFIER . Geheimnis.
bundle-identifier-xcode

6. Buildverarbeitung

In GitHub Aktionen, Sie werden nach den Minuten abgerechnet. die Sie für die Ausführung Ihres CI/CD-Workflows verwendet haben. Aus meiner Erfahrung dauert es etwa 10–15 Minuten, bevor ein Build in App Store Connect bearbeitet werden kann.

Für private Projekte kann die geschätzte Kosten pro Build bis zu $0,08/min x 15 min = $1,2, oder mehr, je nach Konfiguration und Abhängigkeiten Ihres Projekts.

Wenn Sie sich um die Kosten für private Projekte Sorgen, können Sie skip_waiting_for_build_processing setzen. trueDies wird die Buildzeit um Minuten reduzieren, indem man auf die Verarbeitung der Build durch App Store Connect wartet.

Es gibt jedoch einen Kompromiss - Sie müssen die Compliance-Informationen Ihrer App in App Store Connect manuell aktualisieren, bevor Sie die Build an Benutzer verteilen können.

This optimization is mainly useful for private projects where build minutes cost money. For public/free projects, the build minutes are free so there’s no need to enable this setting. See GitHub’s Preisseite für weitere Details.

7. Konfiguration von GitHub-Aktionen

Konfiguration von GitHub-Geheimnissen

Wenn Sie die Geheimnisse aus dem .env Datei kopieren und in die GitHub-Repository-Geheimnisse einfügen.

Gehe zu Einstellungen &gt; Geheimnisse und Variablen &gt; Aktionen &gt; Neuer Repository-Schlagwort

github-geheimnisse

2. BUILD_CERTIFICATE_BASE64 - Zertifikat im Base64-Code.

3. BUILD_PROVISION_PROFILE_BASE64 - Zertifikat für die Bereitstellung im Base64-Code.

4. BUNDLE_IDENTIFIER - Die App-Bundle-Identifikation.

5. APPLE_KEY_ID — App Store Connect API-Schlüssel 🔺Schlüssel-ID.

6. APPLE_ISSUER_ID — App Store Connect API-Schlüssel 🔺Aussteller-ID.

7. APPLE_KEY_CONTENT — App Store Connect API-Schlüssel 🔺Inhalt des Schlüssels. .p8, probieren Sie es

8. Konfigurieren Sie das GitHub Workflow-File.

Erstellen Sie ein GitHub Workflow-Verzeichnis.

cd .github/workflows

Drinnen im workflow Ordner erstellen Sie ein Datei mit dem Namen build-upload-ios.ymlund fügen Sie folgendes hinzu.

name: Build source code on ios

on:
  push:
    tags:
      - '*'

jobs:
  build_ios:
    runs-on: macOS-latest
    steps:
      - uses: actions/checkout@v6
      - name: Set Node.js
        uses: actions/setup-node@v6
        with:
          node-version: 24
          cache: npm
      - name: Install dependencies
        id: install_code
        run: npm ci
      - name: Build
        id: build_code
        run: npm run build
      - uses: actions/cache@v5
        with:
          path: ios/App/Pods
          key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }}
          restore-keys: |
            ${{ runner.os }}-pods-
      - name: Sync
        id: sync_code
        run: npx cap sync
      - uses: ruby/setup-ruby@v1
        with:
          ruby-version: '3.0'
          bundler-cache: true
      - uses: maierj/fastlane-action@v3.1.0
        env:
          APP_STORE_CONNECT_TEAM_ID: ${{ secrets.APP_STORE_CONNECT_TEAM_ID }}
          BUNDLE_IDENTIFIER: ${{ secrets.BUNDLE_IDENTIFIER }}
          BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
          BUILD_PROVISION_PROFILE_BASE64: ${{ secrets.BUILD_PROVISION_PROFILE_BASE64 }}
          APPLE_KEY_ID: ${{ secrets.APPLE_KEY_ID }}
          APPLE_ISSUER_ID: ${{ secrets.APPLE_ISSUER_ID }}
          APPLE_KEY_CONTENT: ${{ secrets.APPLE_KEY_CONTENT }}
          P12_PASSWORD: ${{ secrets.P12_PASSWORD }}
          APPLE_PROFILE_NAME: ${{ secrets.APPLE_PROFILE_NAME }}
        with:
          lane: ios beta
      - name: Upload release bundle
        uses: actions/upload-artifact@v6
        with:
          name: ios-release
          path: ./App.ipa
          retention-days: 10

Dieses Workflow sollte nach jedem GitHub tagWenn Sie die Automatisierung von Tags benötigen, beziehen Sie sich auf Automatisches Build und Release mit GitHub Aktionen zuerst.

Dann wird diese Workflow deine NodeJS-Abhängigkeiten ziehen, installieren und deine JavaScript-Anwendung bauen.

Jedes Mal, wenn du einen neuen Commit sendest, wird in TestFlight eine Release erstellt.

Deine App muss nicht unbedingt Ionic verwenden, nur die Capacitor-Basis ist erforderlich. Sie kann alte Cordova-Module haben, aber Capacitor-JS-Plugin wird bevorzugt.

8. Auslösen Sie die Workflow

Erstellen Sie einen Commit

Erstelle ein commit, du solltest den aktiven Workflow im Repository sehen.

Auslösen Sie die Workflow

Schieben Sie die neuen Commits in die Zweig main oder development um den Workflow auszulösen.

Mit Commit gestartet

Nach einigen Minuten sollte das Build in Ihrem App Store Connect-Dashboard verfügbar sein.

Testflug-Dashboard

Kann ich von meinem lokalen Computer bereitstellen?

Ja, das geht und ist einfach.

Sie können Xcode verwenden, um Ihre App zu bauen und zu signieren, wie immer.

CI/CD-Einrichtungsleitfäden

Alternative CI/CD-Plattformen

Live-Updates und Bereitstellung

Danke

Dieser Blog basiert auf den folgenden Artikeln:

Fahre fort von der automatischen Capacitor-IOS-Build mit GitHub-Aktionen mit Zertifikat

Wenn du __CAPGO_KEEP_0__ verwendest Automatische Capacitor-IOS-Build mit GitHub-Aktionen mit Zertifikat um CI/CD-Automatisierung zu planen, verbinde es mit Capgo CI/CD zur Produktworkflow in Capgo CI/CD Capgo nativee Build zur Produktworkflow in Capgo Native Builds Capgo Integrations zur Produktworkflow in Capgo Integrations CI/CD-Integration zur Implementierungsdetail in CI/CD-Integration und GitHub Actions-Integration zur Implementierungsdetail in GitHub Actions-Integration

Live-Updates für Capacitor-Apps

Wenn ein Web-Schicht-Bug live ist, schicken Sie die Reparatur über Capgo anstatt Tage zu warten, bis die App-Store-Zulassung genehmigt ist. Die Benutzer erhalten die Aktualisierung im Hintergrund, während native Änderungen im normalen Review-Verfahren bleiben.

Neueste von unserem Blog

Capgo gibt Ihnen die besten Einblicke, die Sie benötigen, um ein wirklich professionelles Mobiltelefon-App zu erstellen.