La mise en place de CI/CD pour les applications Capacitor peut être complexe et chronophage. Voici ce que vous devez savoir :
Recommandé pour les nouvelles constructions : Utilisez la construction Capgo
Nous recommandons maintenant d'utiliser la construction Capgo avec le Capgo CLI pour les builds natifs Capacitor. Cet article de Fastlane est conservé pour les équipes qui maintiennent des pipelines d'actions GitHub existants, mais les nouveaux builds iOS devraient utiliser le Capgo CLI afin que vous ne deviez pas maintenir Fastlane, les exécutants Xcode, les certificats et les scripts d'envoi vous-même.
Capgo Build pour CI/CD par Capgo
Évitez la maintenance de Fastlane, de l'exécuteur Xcode, du certificat, du profil de provisionnement et du script d'envoi. Capgo Build exécute des builds iOS signés natifs à partir de votre pipeline CI/CD existant :
- Fonctionne avec votre pipeline: Déclenchez le Capgo Build à partir d'actions GitHub, de GitLab CI, de Jenkins ou de scripts locaux après votre build web et
npx cap sync. - Signature à partir de secrets CI: Conservez les clés App Store Connect, les certificats, les profils de provisionnement, les mots de passe et les identifiants d'équipe dans vos propres secrets CI.
- Aucune maintenance de l'exécuteur natif: Le Capgo Build fournit des environnements de build Apple maintenus, afin que vous ne deviez pas gérer les exécutants macOS, les images Xcode ou les voies Fastlane.
- Artificats et soumission: Téléchargez les artefacts signés pour la QA ou soumettez les builds de version à travers le Capgo CLI.
Prix
- Les plans Capgo commencent à 12 $/mois
- Comprennent les mises à jour OTA et environ 15 builds natifs par mois
- Les minutes de build supplémentaires sont facturées par minute à l'aide de crédits
Configurez Capgo Build dans CI/CD
Guide de configuration manuelle
Ici est ce que vous devez faire :
La livraison continue pour iOS à l'aide de Fastlane et des GitHub Actions et du certificat
Prérequis
Avant de continuer avec le tutoriel :
- Vérifiez que vous avez Fastlane installé sur votre machine de développement.
- Assurez-vous d'être membre du programme de développeur iOS.
Informations importantes sur le prix

https://github.com/features/actions
Le service est ‘gratuit’ jusqu'à la limite, en fonction de la machine choisie.
Nous allons utiliser un macOS Vous pouvez voir dans l'écran d'écran son prix et ses limites (tarifs au moment de la création du tutoriel, ils pourraient subir des changements à l'avenir)
Une fois averti des exigences et des tarifs, continuons.
Remarque : Dans l'article, je suppose que vous avez créé l'application dans App Store Connect. L'information importante sera copiée par Fastlane !
Qu'est-ce que vous allez apprendre dans le tutoriel
Étapes à suivre dans l'article
- Utilisation d'App Store Connect API avec Fastlane
- Exigences :
- Création d'une clé App Store Connect API
- Utilisation d'une clé App Store Connect API
- Exigences :
- Copie des fichiers Fastlane
- Configuration des actions GitHub
1. Utilisation d'App Store Connect API avec Fastlane
À compter de février 2021, l'authentification à deux facteurs ou la vérification à deux étapes est obligatoire pour tous les utilisateurs pour se connecter à App Store Connect. Cette couche supplémentaire de sécurité pour votre ID Apple vous aide à vous assurer que vous êtes la seule personne qui peut accéder à votre compte.
De Support Apple
Exigences
Pour que Fastlane puisse utiliser App Store Connect API pour télécharger votre application, vous devez fournir les éléments suivants : trois choses :
- Identifiant émetteur
- Identifiant de clé
- Fichier de clé ou contenu de clé
Obtention d'une clé App Store Connect API
Générez des clés, vous devez avoir un droit d'administrateur dans App Store Connect. Si vous n'avez pas ce droit, vous pouvez diriger la personne concernée à cet article.
-
Se connecter à App Store Connect.
-
Sélectionnez Utilisateurs et accès.

3 — Sélectionnez l'onglet Intégration.

- Cliquez sur Générer la clé API ou le bouton Ajouter (+).

- Entrez un nom pour la clé. Le nom est uniquement à des fins de référence et n'est pas partie de la clé elle-même.

6 — Dans l'onglet Accès, sélectionnez le rôle pour la clé. Les rôles qui s'appliquent aux clés sont les mêmes rôles qui s'appliquent aux utilisateurs de votre équipe. Voir permissions d'accèsNous vous recommandons de sélectionner gestionnaire d'application.
- Cliquez sur Générer.
Une clé API ne peut pas avoir son accès limité à des applications spécifiques.
Les informations de la nouvelle clé, son ID, un lien de téléchargement et d'autres informations apparaissent sur la page.

Vous pouvez récupérer les trois informations nécessaires ici.
1. ID de l'incident. (APPLE_ISSUER_ID secret)
2. ID de la clé. (APPLE_KEY_ID secret)
Clicker sur « Télécharger la clé API » pour télécharger votre clé API privée. Le lien de téléchargement n'apparaît que si la clé privée n'a pas encore été téléchargée. Apple ne garde pas une copie de la clé privée. Vous pouvez donc la télécharger qu'une seule fois.
🔴 Stockez votre clé privée dans un endroit sûr. Vous ne devriez jamais partager vos clés, stocker des clés dans un code de dépôt, ou inclure des clés dans un code côté client.
Utilisation d'une clé API de Connect App Store
Le fichier de clé API (fichier p8 que vous téléchargez), l'ID de clé et l'ID de l'émetteur sont nécessaires pour créer le jeton JWT d'autorisation. Il existe plusieurs façons de passer ces informations dans Fastlane. J'ai choisi d'utiliser l'action de Fastlane nouvelle app_store_connect_api_key. Vous pouvez apprendre d'autres façons dans documentation de Fastlane. Je montre cette méthode car je pense qu'elle est la plus facile à utiliser avec la plupart des CI, où vous pouvez définir des variables d'environnement.
Veuillez convertir le fichier p8 que vous téléchargez en Base64 et le stocker en tant que secret (APPLE_KEY_CONTENT).
base64 -i APPLE_KEY_CONTENT.p8 | pbcopy
Maintenant, nous pouvons gérer le Connect App Store avec Fastlane à l'aide de la clé API, c'est génial !
2. Certificats
Ouvrez XCode et allez dans Réglages > Comptes > Identifiant Apple > Équipes et sélectionnez votre équipe.

Cliquez sur Gérer les certificats.
Si vous n'avez pas déjà créé un certificat, vous pouvez créer un nouveau certificat.
Cliquez sur + et sélectionnez Distribution Apple

Ensuite, vous devez aller dans la clé de chiffrement pour télécharger le certificat sous forme de .p12 fichier.
Pour ce faire, vous devez aller dans la clé de chiffrement, passer à la clé de chiffrement de connexion et puis l’onglet Clés de connexion Clés de connexion Ensuite, vous pouvez sélectionner le certificat que vous souhaitez télécharger. (Recherchez par la date du certificat).

Clés de mon certificat
Clés de mon certificat Export.
Choisissez le format de fichier Échange d'informations personnelles (.p12).
Cela téléchargera le certificat sous la forme d'un .p12 fichier.
Veuillez ouvrir le fichier dans un terminal et utilisez la commande suivante pour le convertir en Base64 :
base64 -i BUILD_CERTIFICATE.p12 | pbcopy
Cela deviendra votre BUILD_CERTIFICATE_BASE64 secret. Il est également demandé de fournir le mot de passe du certificat. Ce mot de passe sera votre P12_PASSWORD secret.
3. Profils de provisionnement
Ouvrir Apple Developer et sélectionnez l'équipe appropriée.
Créez ensuite un nouveau profil en cliquant sur +

Et sélectionnez App Store Connect.

Vous devez ensuite sélectionner l'application appropriée, soyez prudent, vous ne pouvez pas utiliser des wildcards sinon la signature échouera.

Sélectionnez le certificat approprié que vous avez créé précédemment (cherchez la date d'expiration, elle doit être la même journée et mois que aujourd'hui) et cliquez sur Continuez.

Entrez enfin le nom du profil et cliquez sur Créer.
Le nom sera utilisé pour identifier le profil dans Fastlane, sous la valeur de
APPLE_PROFILE_NAME.

Vous pouvez télécharger le profil sous la forme d'un .mobileprovision fichier.

Veuillez convertir le profil en Base64 et le stocker sous forme de secret (BUILD_PROVISION_PROFILE_BASE64).
base64 -i BUILD_PROVISION_PROFILE.mobileprovision | pbcopy
4. Copier les fichiers Fastlane
Fastlane est une bibliothèque Ruby créée pour automatiser les tâches de développement mobile courantes. En utilisant Fastlane, vous pouvez configurer des « voies » personnalisées qui rassemblent une série d'« actions » qui exécutent des tâches que vous feriez normalement à l'aide d'Android Studio. Vous pouvez faire beaucoup de choses avec Fastlane, mais pour les besoins de ce tutoriel, nous utiliserons uniquement une poignée d'actions clés.
Créer le dossier Fastlane à la racine de votre projet Capacitor/Ionic et y ajouter le fichier Fastfile :
- Dossier :
<project-root>/fastlane/ - Fichier :
<project-root>/fastlane/Fastfile
Ce niveau est le même que package.json, capacitor.config.*, et le ios/ dossier. N'en créez pas à l'intérieur 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. Configuration des secrets
GitHub Les actions utilisent les secrets de votre référentiel que vous configurez dans l'étape suivante. Vous n'avez besoin d'un fichier local que si vous souhaitez exécuter ou tester Fastlane à partir de votre propre machine. .env Pour les tests locaux, créez
à côté de <project-root>/fastlane/.env . N'oubliez pas de ne pas le commiter. Ajoutez Fastfileà votre fastlane/.env premier (ou vérifiez qu'il est déjà ignoré). Voici un exemple : .gitignore Récupérer l'ID d'équipe d'APP_STORE_CONNECT
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=
__CAPGO_KEEP_0__
Allez à Centre de développement et faites défiler jusqu'à la Membership details section.
La Team ID est la valeur que vous devez définir dans le APP_STORE_CONNECT_TEAM_ID secret.
Obtenir l'IDENTIFIANT_DE_BUNDLE
- Ouvrez Xcode
- Dédoublez sur le
Appdans le navigateur de projet - Ensuite, cliquez sur l'onglet
Signing and Capabilities - copiez la valeur de
Bundle identifier. C'est la valeur que vous devez saisir dans leBUNDLE_IDENTIFIERsecret.
6. Traitement de la mise à jour
En GitHub Actions, vous êtes facturé en fonction des minutes que vous avez utilisées pour exécuter votre workflow CI/CD. D'après mon expérience, il faut environ 10-15 minutes avant que la mise à jour ne soit traitée dans App Store Connect. Pour les projets privés, le coût estimé par build peut aller jusqu'à
$0.08/min x 15 mins = $1.2 , ou plus, en fonction de la configuration et des dépendances de votre projet.Si vous vous inquiétez des coûts pour les projets privés, vous pouvez configurer
__CAPGO_KEEP_0__ pour utiliser un plan gratuit. skip_waiting_for_build_processing vers trueCe processus économisera des minutes de build en ne faisant pas attendre App Store Connect pour terminer le traitement de la build.
Cependant, il y a un compromis - vous devrez mettre à jour manuellement les informations de conformité de votre application dans App Store Connect avant de pouvoir distribuer la build aux utilisateurs.
Cette optimisation est principalement utile pour les projets privés où les minutes de build coûtent de l'argent. Pour les projets publics/gratuits, les minutes de build sont gratuites, il n'y a donc pas besoin d'activer cette fonctionnalité. Consultez la page de tarification de GitHub pour plus de détails. 7. Configurer les __CAPGO_KEEP_0__ Actions
Configurer les secrets GitHub
Configure GitHub secrets
fichier et les coller dans les secrets du repository __CAPGO_KEEP_0__. .env file and paste them into the GitHub repository secrets.
Paramètres to > Secrets et variables > Actions > Nouveau secret de repository
2. BUILD_CERTIFICATE_BASE64 - Le certificat encodé en Base64.
3. BUILD_PROVISION_PROFILE_BASE64 - Le profil de provisioning encodé en Base64.
4. BUNDLE_IDENTIFIER - L'identifiant de bundle de votre application.
5. APPLE_KEY_ID — Clé App Store Connect API 🔺 ID de clé.
6. APPLE_ISSUER_ID — Clé App Store Connect API 🔺 ID émetteur.
7. APPLE_KEY_CONTENT App Store Connect API Clé 🔺 Contenu de la clé .p8, Vérifiez-le
8. Configurez le fichier de flux de travail GitHub
Créez un répertoire de flux de travail GitHub
cd .github/workflows
Dans le répertoire, créez un fichier nommé workflow et ajoutez les éléments suivants. build-upload-ios.ymlCe flux de travail doit être déclenché après chaque __CAPGO_KEEP_0__
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
This workflow should be triggered after each GitHub s'il vous plaît, si vous avez besoin d'automatiser les étiquettes, référez-vous àAutomatic build and release avec __CAPGO_KEEP_0__ actions Automatic build and release with GitHub actions Premièrement.
Ensuite, ce workflow récupérera vos dépendances NodeJS, les installera et construira votre application JavaScript.
Chaque fois que vous envoyez un nouveau commit, une mise à jour sera construite dans TestFlight.
Votre application n'a pas besoin d'utiliser Ionic, seul le Capacitor de base est obligatoire. Elle peut avoir des anciens modules Cordova, mais le Capacitor plugin JavaScript est préféré.
8. Déclenchez le workflow.
Créez un Commit.
Faites un commit, vous devriez voir le workflow actif dans le dépôt.
Déclenchez le workflow.
Envoi les nouveaux commits vers la branche main ou development pour déclencher le flux de travail.

Après quelques minutes, la build devrait être disponible dans votre tableau de bord App Store Connect.

9. Puis-je déployer depuis la machine locale ?
Oui, vous pouvez, et cela est facile.
Vous pouvez utiliser Xcode pour construire et signer votre application, comme toujours.
Articles liés
Guides de configuration CI/CD
- Automatic Capacitor Android Build with GitHub Actions - Configuration complète de CI/CD Android
- Build et lancement automatiques avec des actions GitHub - Tutoriel complet de pipeline CI/CD
- Gérer les builds Dev et Prod avec les actions GitHub - Gestion des environnements
- Build automatique de l'Capacitor iOS avec Match - Alternative utilisant Fastlane Match
Plateformes CI/CD alternatives
- Build avec GitLab CI - Alternative GitLab
- Build avec CodeMagic - Guide de configuration de CodeMagic
Mises à jour en temps réel & déploiement
- Capgo Documentation des mises à jour en temps réel - Ajoutez des mises à jour OTA à votre application
- CI/CD Integration with Capgo - Intégrez les mises à jour en temps réel dans votre pipeline
Merci
Cet article est basé sur les articles suivants :
- Continuous delivery for IOS using Fastlane and GitHub actions
- Documentation Fastlane
- This GitHub message from @mrogunlana
- This GitHub documentation
Keep going from Automatic Capacitor IOS build with GitHub actions with certificate
Si vous utilisez Automatic Capacitor IOS build with GitHub actions with certificate pour planifier l'automatisation de la CI/CD, la connecter à Capgo CI/CD pour le flux de travail du produit dans Capgo CI/CD, Capgo Builds natifs pour le flux de travail du produit dans Capgo Builds natifs, Capgo Intégrations pour le flux de travail du produit dans Capgo Intégrations, Intégrations Intégration CI/CD GitHub Actions Integration GitHub Intégration d'actions