Die Einrichtung von CI/CD für Capacitor-Anwendungen kann komplex und zeitaufwändig sein. Hier ist, was Sie wissen müssen:
Empfohlen für Neubauten: Verwenden Sie Capgo-Build
Wir empfehlen nun die Verwendung von Capgo-Build mit der Capgo CLI für native Capacitor-Bauten. Dieses Fastlane-Leitfaden wird für Teams, die bestehende GitHub-Actions-Pipelines weiterhin unterhalten, beibehalten, aber neue iOS-Bauten sollten die Capgo CLI verwenden, damit Sie keine Fastlane, Xcode-Runner, Zertifikate, Berechtigungsprofile und Upload-Skripte selbst unterhalten müssen.
Capgo-Build für CI/CD durch Capgo
Vermeiden Sie die Wartung von Fastlane, Xcode-Runner, Zertifikaten, Berechtigungsprofilen und Upload-Skripten. Capgo-Build führt signierte native iOS-Bauten von Ihrem bestehenden CI/CD-Pipeline aus:
- Arbeitet mit Ihrer Pipeline: Auslösen Sie Capgo-Build von GitHub Actions, GitLab CI, Jenkins oder lokalen Skripten nach Ihrem Web-Bau und
npx cap sync. - Signierung aus CI-Schlüsseln: Halten Sie App Store Connect-Schlüssel, Zertifikate, Provisioning-Profile, Passwörter und Team-IDs in Ihren eigenen CI-Schlüsseln.
- Keine native Runner-Vereinbarung: Capgo Build bietet gepflegte Apple-Build-Umgebungen, sodass Sie macOS-Runner, Xcode-Bilder oder Fastlane-Linien nicht verwalten müssen.
- Artikel und Einreichung: Laden Sie signierte Artikel für QA oder einreichen Sie Release-Builds über den Capgo CLI.
Preise
- Capgo-Pläne beginnen bei 12 $/Monat
- Inklusive OTA-Updates und etwa 15 native Builds pro Monat
- Zusätzliche Build-Minuten werden durch Minuten über Kredite abgerechnet
Einrichten Sie Capgo Build in CI/CD
Manuelle Einrichtungsanleitung
Hier ist, was Sie tun müssen:
Kontinuierliche Lieferung für iOS mit Fastlane und GitHub Aktionen und Zertifikat
Voraussetzungen
Bevor Sie mit dem Tutorial fortfahren:
- Stellen Sie sicher, dass Sie Fastlane installiert haben auf Ihrem Entwicklungsrechner.
- Stellen Sie sicher, dass Sie Mitglied des iOS-Entwicklerprogramms sind.
Wichtige Informationen zur Preisgestaltung

https://github.com/features/actions
Der Service ist ‘kostenlos bis zur Grenze, je nach gewählter 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.
Nachdem Sie über Anforderungen und Preise gewarnt wurden, können wir fortfahren.
Hinweis: In dem 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 dem Tutorial lernen
Schritte, die Sie in dem Beitrag befolgen
- Verwendung von App Store Connect API mit Fastlane
- Anforderungen:
- Erstellung eines App Store Connect API-Schlüssels
- Mit einem App Store Connect API-Schlüssel verwenden
- Anforderungen:
- Fastlane-Dateien kopieren
- GitHub-Aktionen konfigurieren
1. App Store Connect API mit Fastlane verwenden
Ab Februar 2021 ist für alle Benutzer eine zweifaktorale Authentifizierung oder eine zweistufige Verifizierung erforderlich, um sich bei App Store Connect anzumelden. Diese zusätzliche Sicherheitsschicht für Ihren Apple-ID hilft sicherzustellen, dass Sie der einzige Person sind, die Zugriff auf Ihr Konto hat.
Von Apple Support
Anforderungen
Um sicherzustellen, dass Fastlane App Store Connect API verwenden kann, um Ihre App hochzuladen, müssen Sie die folgenden drei Dinge bereitstellen:
- Aussteller-ID
- Key ID
- Sicherheitschlüssel Datei oder Key Inhalt
Erwerb eines App Store Connect API-Schlüssels
Um Schlüssel zu generieren, müssen Sie in App Store Connect die Administratorrechte haben. Wenn Sie diese Berechtigung nicht haben, können Sie den relevanten Personen diesen Artikel empfehlen.
-
Anmelden bei App Store Connect.
-
Auswählen Benutzer und Zugriff.

3 — Wählen Sie die Integrationsoption.

- Klicken Sie auf Erstellen von API-Schlüssel oder auf die (+) Taste.

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

6 — Unter Zugriff wählen Sie die Rolle für den Schlüssel aus. Die Rollen, die auf Schlüssel angewendet werden, sind dieselben Rollen, die auf Benutzer auf Ihrem Team angewendet werden. Siehe Benutzerrechte. Wir empfehlen, die Rolle App-Manager.
- Klicken Sie auf Generieren.
Ein API-Schlüssels Zugriff 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.

Hier können Sie alle drei notwendigen Informationen abrufen.
<1> Issue-ID. (APPLE_ISSUER_ID Geheimcode)
<2> Schlüssel-ID. (APPLE_KEY_ID Geheimcode)
<3> Klicken Sie auf "Herunterladen API-Schlüssel" zum Herunterladen Ihres API-Sicherheitsschlüssels. Der Download-Link erscheint nur, wenn der Sicherheitsschlüssel noch nicht heruntergeladen wurde. Apple hält keinen Kopie des Sicherheitsschlüssels. Daher können Sie ihn nur einmal herunterladen.
🔴 Speichern Sie Ihren Sicherheitsschlü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 einbeziehen.
Verwendung eines App-Store-Connect-Schlüssels API
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 Fastlane-Dokumentationerfahren. Ich zeige diese Methode an, weil ich sie für die einfachste Möglichkeit halte, 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 Geheimcode abAPPLE_KEY_CONTENT).
base64 -i APPLE_KEY_CONTENT.p8 | pbcopy
Jetzt können wir den App Store Connect mit Fastlane über die 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.

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

Dann müssen Sie zum Schlüsselkarten-Manager gehen, um das Zertifikat als .p12 Datei herunterzuladen.
Um dies zu tun, müssen Sie zum Schlüsselkarten-Manager gehen, auf die Login Schlüsselkarte umschalten und dann die Registerkarte Meine Zertifikate.

Dann können Sie das Zertifikat auswählen, das Sie herunterladen möchten. (Suchen Sie nach dem Datum des Zertifikats)
Dann klicken Sie mit der rechten Maustaste auf das private Schlüsselzertifikat und wählen Sie __CAPGO_KEEP_0__.
Wählen Sie das Dateiformat Persönliche Informationen austauschen (.p12).
Das wird das Zertifikat als .p12 Datei herunterladen.
Öffnen Sie die Datei in einem Terminal und verwenden Sie den folgenden Befehl, um sie in Base64 umzuwandeln:
base64 -i BUILD_CERTIFICATE.p12 | pbcopy
Das wird Ihr BUILD_CERTIFICATE_BASE64 Geheimnis. Geben Sie auch, wenn gefragt, das Passwort des Zertifikats an. Dieses Passwort wird Ihr P12_PASSWORD Geheimnis.
3. Provisionierungsprofile
Öffnen Apple Developer und wählen Sie das richtige Team.
Klicken Sie dann auf +

Und wählen Sie App Store Connect.

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

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

Schließlich geben Sie den Namen des Profils ein und klicken Sie auf Erstellen.
Der Name wird zum Identifizieren des Profils in Fastlane verwendet, unter der Werte von
APPLE_PROFILE_NAME.

Sie können das Profil als .mobileprovision Datei herunterladen.

Bitte konvertieren Sie das Profil in Base64 und speichern Sie es als ein 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. Mit Fastlane können Sie viel 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 hinzu:
- Ordner:
<project-root>/fastlane/ - Datei:
<project-root>/fastlane/Fastfile
Dies ist auf der gleichen Ebene wie package.json, capacitor.config.*, und das ios/ Verzeichnis. Erstelle es 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. Einrichtung von Geheimnissen
GitHub Actions verwendet die Repository-Secrets, die du in dem nächsten Schritt einrichtest. Du benötigst nur eine lokale .env Datei, wenn du Fastlane von deinem eigenen Rechner aus ausführen oder testen möchtest.
Für lokale Tests erstelle <project-root>/fastlane/.env nächstens dem Fastfile. Erstelle diese Datei nicht. Füge fastlane/.env zu deinem .gitignore ersten (oder überprüfe, ob es bereits ignoriert ist). Hier ist ein Beispiel:
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=
APP_STORE_CONNECT_TEAM_ID erhalten
Gehe zu Entwickler-Zentrum und scrollen Sie nach unten zur Membership details Abschnitt.
Team ID ist der Wert, den Sie in der APP_STORE_CONNECT_TEAM_ID Geheimzahl einstellen müssen.
BUNDLE_IDENTIFIER erhalten
- Öffne Xcode
- Doppelklicken Sie auf das
Appin der Projektnavigator - Dann klicken Sie auf die Registerkarte
Signing and Capabilities - Kopieren Sie den Wert von dem
Bundle identifierDies ist der Wert, den Sie in demBUNDLE_IDENTIFIERGeheimnis.
6. Verarbeitung von Aufgaben
In GitHub Aktionen, Sie werden auf die 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 verarbeitet 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.Sie werden auf die Minuten abgerechnet, die Sie für die Ausführung Ihres CI/CD-Workflows verwendet haben.
If Sie sich um die Kosten für private Projekte sorgen, können Sie dies skip_waiting_for_build_processing zum true. Dies wird die Build-Minuten sparen, indem Sie nicht auf App Store Connect warten, bis die Build abgeschlossen ist.
Es gibt jedoch einen Kompromiss - Sie müssen die Compliance-Informationen Ihres Apps in App Store Connect manuell aktualisieren, bevor Sie die Build an die 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 Bei öffentlichen/ kostenlosen Projekten sind die Build-Minuten kostenlos, daher ist es nicht notwendig, diese Einstellung zu aktivieren. Siehe __CAPGO_KEEP_0__’s
7. Setup GitHub Actions
Configure GitHub secrets
7. Einrichten von __CAPGO_KEEP_0__ Aktionen .env Konfigurieren von GitHub Geheimnissen
Bitte kopieren Sie die Geheimnisse aus dem Einstellungen > Geheimnisse und Variablen > Aktionen > Neuer Repository-Schlüssel
2. BUILD_CERTIFICATE_BASE64 - Base64-codiertes Zertifikat.
3. BUILD_PROVISION_PROFILE_BASE64 - Base64-codiertes Provisionierungsprofil.
4. BUNDLE_IDENTIFIER - Ihr Apps-Bundle-Identifier.
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 🔺Schlüsselinhalt .p8, prüfen Sie es
8. Konfigurieren Sie das GitHub-Workflow-File
Erstellen Sie einen GitHub-Workflow-Ordner.
cd .github/workflows
Drinnen im workflow Ordner, erstellen Sie eine Datei mit dem Namen build-upload-ios.ymlund fügen Sie die folgenden Zeilen 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
Diese Workflow sollte nach jedem GitHub-Tag ausgelöst werden. , wenn Sie ein automatisches Tag-System benötigen, zitieren Sie bitteAutomatisches Bauen und Freigeben mit __CAPGO_KEEP_0__-Aktionen Automatic build and release with GitHub actions Dann wird dieser Workflow Ihre NodeJS-Abhängigkeiten ziehen, sie installieren und Ihr JavaScript-Anwendungsprogramm bauen.
Ordner
Jedes Mal, wenn Sie einen neuen Commit senden, wird ein Release in TestFlight erstellt.
Ihre App muss Ionic nicht verwenden, nur die Capacitor-Basis ist erforderlich. Sie kann alte Cordova-Module haben, aber das Capacitor-JS-Plugin wird empfohlen.
8. Auslösen Sie die Workflow-Aufgabe
Erstellen Sie einen Commit
Machen Sie einen commitSie sollten das aktive Workflow in der Repository sehen.
Auslösen Sie die Workflow-Aufgabe
Schieben Sie die neuen Commits in die Zweig main oder development um die Workflow-Aufgabe auszulösen.

Nach wenigen Minuten sollte die Veröffentlichung in Ihrem App Store Connect-Dashboard verfügbar sein.

9. Kann ich von meinem lokalen Computer aus deployen?
Ja, das kannst du, und es ist einfach.
Du kannst Xcode verwenden, um deine App zu bauen und zu signieren, wie immer.
Verwandte Artikel
CI/CD-Einrichtungsleitfäden
- Automatische Capacitor Android-Veröffentlichung mit GitHub Aktionen - Vollständige Android-CI/CD-Einrichtung
- Automatische Veröffentlichung und Freigabe mit GitHub Aktionen - Vollständiger CI/CD-Pipeline-Leitfaden
- Verwaltung von Entwicklungs- und Produktiv-Veröffentlichungen mit GitHub Aktionen - Umgebungsverwaltung
- Automatische Capacitor iOS-Build mit Match - Alternative mit Fastlane Match
Alternative CI/CD-Plattformen
- Mit GitLab CI bauen - GitLab-Alternative
- Mit CodeMagic bauen - CodeMagic-Einrichtungshandbuch
Live-Updates und Bereitstellung
- Capgo Live-Updates-Dokumentation - OTA-Updates zu Ihrer App hinzufügen
- CI/CD-Integration mit Capgo - Live-Updates in Ihrem Pipeline integrieren
Vielen Dank
Dieser Blog basiert auf den folgenden Artikeln:
- Kontinuierliche Lieferung für IOS mit Fastlane und GitHub Aktionen
- Fastlane-Dokumentation
- Dieses GitHub-Nachricht von @mrogunlana
- Dieses GitHub-Dokumentation
Bleiben Sie bei der automatischen Capacitor-IOS-Build mit GitHub-Aktionen mit Zertifikat
Wenn Sie CI/CD-Automatisierung planen und es mit Automatische Capacitor-IOS-Build mit GitHub-Aktionen mit Zertifikat verbinden möchten, um es mit Capgo-CI/CD für den Produktworkflow in Capgo CI/CD, Capgo Native Builds für den Produktworkflow in Capgo Native Builds, Capgo Integrations für den Produktworkflow in Capgo Integrations, CI/CD-Integration für die Implementierungsdetails in CI/CD-Integration, und GitHub Actions-Integration für die Implementierungsdetails in GitHub Actions-Integration.