Allez directement au contenu principal
CD/CI

Automatic Capacitor IOS build with GitHub actions with certificate

Comment configurer une chaîne d'intégration/continu (CI/CD) pour votre application IOS Ionic en utilisant Fastlane et des Actions GitHub en 5 minutes (2024)

Martin Donadieu

Martin Donadieu

Valeria

Relecteur

Reviewer

Jordan

Éditeur

Automatiser la construction Capacitor IOS avec des actions GitHub avec certificat

La mise en place de CI/CD pour les applications Capacitor peut être complexe et fastidieuse. Voici ce qu'il faut savoir :

Nous recommandons désormais d'utiliser la construction Capgo avec le Capgo CLI pour les constructions natives Capacitor. Cette guide Fastlane est conservée pour les équipes qui maintiennent des pipelines d'actions GitHub existants, mais les nouvelles constructions iOS devraient utiliser le Capgo CLI afin que vous ne deviez pas maintenir Fastlane, les exécutants Xcode, les certificats, les profils de provisionnement et les scripts d'envoi.

la construction Capgo pour CI/CD par Capgo

Évitez la gestion de Fastlane, Xcode runner, certificat, profil de provisionnement et script d'upload. Capgo Build exécute des builds natifs iOS signés à partir de votre pipeline CI/CD existante :

  • Fonctionne avec votre pipeline: Déclenchez la Capgo Build à partir de GitHub Actions, GitLab CI, Jenkins ou scripts locaux après votre build web et npx cap sync.
  • Signage à partir de secrets CIConservez vos clés App Store Connect, certificats, profils de provisioning, mots de passe et identifiants d'équipe dans vos secrets CI propres.
  • Aucune maintenance de l'exécuteur natif: Capgo Build fournit des environnements de build Apple maintenus, vous n'avez donc pas à gérer les exécutants macOS, les images Xcode ou les voies Fastlane.
  • Artéfacts et soumission: Téléchargez les artefacts signés pour les tests ou soumettez les builds de lancement à travers le Capgo CLI.

Tarification

  • Les plans Capgo commencent à 12$/mois
  • Inclut les mises à jour OTA et environ 15 builds natifs par mois.
  • Les minutes de build supplémentaires sont facturées par minute en crédits

Configurez Capgo Build dans CI/CD

Guide de configuration manuelle

Voici ce que vous devez faire :

Livraison Continue pour iOS en utilisant Fastlane et GitHub Actions et certificat

Prerequisites

Avant de poursuivre 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

Coût GitHub Action

https://github.com/features/actions

Le service est ‘gratuit’ selon la limite, en fonction de la machine choisie.
Nous allons utiliser une machine macOS Vous pouvez voir dans l'écran d'aperçu son prix et ses limites (tarifs valables à la création de ce tutoriel, ils pourraient subir des changements à l'avenir)

Une fois averti des exigences et des prix, continuons.

Remarque : Dans cet 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 ce tutoriel

Étapes à suivre dans cet article

  1. Utilisation de App Store Connect API avec Fastlane
    • Exigences :
      • Création d'une clé App Store Connect API
      • Utilisation d'une clé App Store Connect API
  2. Copier les fichiers Fastlane
  3. Configurer les actions GitHub

1. Utilisation d'App Store Connect API avec Fastlane

À partir de février 2021, la deuxième authentification à deux facteurs ou la vérification à deux étapes est requise pour tous les utilisateurs pour se connecter à App Store Connect. Cette couche supplémentaire de sécurité pour votre identifiant 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 :

  1. ID d'émetteur
  2. ID de clé
  3. Clé de fichier ou contenu de clé

Obtenir une clé d'App Store Connect API

Pour générer des clés, vous devez avoir la permission d'administrateur dans App Store Connect. Si vous n'avez pas cette permission, vous pouvez diriger la personne concernée vers cet article.

  1. Se connecter à App Store Connect.

  2. Sélectionner Utilisateurs et Accès.

Accès utilisateur App Store Connect

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

App Store Connect API Intégration

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

Les clés App Store Connect API créent

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

App Store Connect API clés créent nom

6 — Dans l'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 de rôle. Nous recommandons de sélectionner App manager.

  1. Cliquez sur Générer.

Une clé API ne peut pas être limitée à des applications spécifiques.

Le nom de la clé, son ID, un lien de téléchargement et d'autres informations s'affichent sur la page.

Téléchargement de clés App Store Connect

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)
<3> Cliquez sur « Télécharger la clé API » pour télécharger votre clé privée API . 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 conserve pas de 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 App Store Connect

Le fichier de clé API (fichier p8 que vous téléchargez), l'ID de la 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_keyVous pouvez apprendre d'autres façons dans Documentation de FastlaneJe montre cette méthode parce que je pense qu'il s'agit de la façon la plus facile de travailler 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 comme un secret (APPLE_KEY_CONTENT).

base64 -i APPLE_KEY_CONTENT.p8 | pbcopy

Maintenant, nous pouvons gérer l'App Store Connect avec Fastlane à l'aide de la clé API, c'est génial!

2. Certificats

Ouvrez XCode et allez à Paramètres > Comptes > Apple ID > Equipes et sélectionnez votre équipe.

Code identités de signature

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

Distribution Apple

Ensuite, vous devez aller dans le cléchain pour télécharger le certificat sous forme de .p12 fichier.

Allez dans la clé de chaîne et basculez vers login clé de chiffrement et puis la section Mes certificats.

Mes certificats

Vous pouvez ensuite sélectionner le certificat que vous souhaitez télécharger. (Recherchez par la date du certificat)

Et puis cliquez avec le bouton droit sur la clé privée du certificat et sélectionnez Exporter.

Choisissez le format de fichier Échange d'informations personnelles (.p12).

Cela téléchargera le certificat sous forme de .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 votre mot de passe. Fournissez également le mot de passe du certificat lorsque demandé. Ce mot de passe sera votre P12_PASSWORD secret.

3. Profils de provisionnement

Ouvrez Apple Developer et sélectionnez l'équipe appropriée.

Créez ensuite un nouveau profil en cliquant sur +

Créer un nouveau profil

Et sélectionnez App Store Connect.

Choisissez App Store Connect

Choisissez ensuite l'application appropriée, soyez prudent, car vous ne pouvez pas utiliser des wildcards sinon la signature échouera.

Choisissez l'application appropriée

Sélectionnez le bon certificat que vous avez créé avant (cherchez la date d'expiration, elle doit être le même jour et mois que la date actuelle) et cliquez sur Continuer.

Choisissez le bon certificat

Enfin, entrez le nom du profil et cliquez sur Générer.

Le nom sera utilisé pour identifier le profil dans Fastlane, sous la valeur de APPLE_PROFILE_NAME.

Générer le profil

Vous pouvez télécharger le profil sous forme de .mobileprovision fichier.

Téléchargez le profil

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. Copiez 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 effectueriez normalement à l'aide d'Android Studio. Vous pouvez faire beaucoup avec Fastlane, mais pour les besoins de ce tutoriel, nous utiliserons uniquement une poignée d'actions de base.

Créez le dossier Fastlane au niveau de racine de votre projet Capacitor/Ionic et ajoutez-y le fichier Fastfile:

  • Dossier : <project-root>/fastlane/
  • Fichier : <project-root>/fastlane/Fastfile

C'est au même niveau 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 Actions utilise les secrets de repository que vous configurez dans l'étape suivante. Vous n'avez besoin que d'un secret local .env Si vous souhaitez exécuter ou tester Fastlane à partir de votre propre machine.

Pour les tests locaux, créez <project-root>/fastlane/.env à côté de Fastfile. N'oubliez pas de ne pas le commiter. Ajoutez fastlane/.env à votre .gitignore totalement (ou vérifiez s'il est déjà ignoré). Voici un exemple :

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=

Obtenir l'ID d'équipe d'APP_STORE_CONNECT

Allez à Centre de développement et descendez jusqu'à Membership details La section. Team ID c'est la valeur que vous devez définir dans le APP_STORE_CONNECT_TEAM_ID secret.

app-store-connect-team-id

Obtenir l'identifiant de l'application

  1. Ouvrir Xcode
  2. Double-cliquez sur le App dans le navigateur de projet
  3. Cliquez ensuite sur l'onglet Signing and Capabilities
  4. Copiez la valeur de la Bundle identifierC'est la valeur que vous devez définir dans la BUNDLE_IDENTIFIER secret.
identifiant-de-bundle-xcode

6. Traitement de construction

Dans les GitHub Actions, Vous êtes facturé en fonction des minutes que vous avez utilisées pour exécuter votre flux de CI/CD. D'après mon expérience, il faut environ 10-15 minutes avant que le build ne puisse être traité dans App Store Connect.

Pour les projets privés, le coût estimé par build peut aller jusqu'à $0,08/min x 15 min = $1,2, ou plus, en fonction de la configuration et des dépendances de votre projet.

Si vous vous souciez des coûts pour les projets privés, vous pouvez configurer skip_waiting_for_build_processing pour trueCela économisera des minutes de build en ne faisant pas attendre la fin du traitement par App Store Connect.

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 le build aux utilisateurs.

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 page de tarification de __CAPGO_KEEP_0__ Détails supplémentaires.

7. Paramétrage des GitHub Actions

Configuration des GitHub secrets

Copiez les secrets de la .env file et collez-les dans les secrets du GitHub.

Paramètres &gt; &gt; Variables et secrets &gt; Settings &gt; Répertoire de nouvelle clé

github-clés

2. BUILD_CERTIFICATE_BASE64 - Certificat encodé en Base64.

3. BUILD_PROVISION_PROFILE_BASE64 - Profil de provisionnement encodé en Base64.

4. BUNDLE_IDENTIFIER - identifiant de l'application.

5. APPLE_KEY_ID — Clé API de App Store Connect 🔺ID de la clé.

6. APPLE_ISSUER_ID — Clé API de App Store Connect 🔺ID de l'émetteur.

7. APPLE_KEY_CONTENT — Clé API de App Store Connect 🔺Contenu de la clé. .p8, vérifiez-le

Configurez le fichier de workflow GitHub.

Créez un répertoire de flux de travail GitHub.

cd .github/workflows

À l'intérieur du workflow répertoire, créez un fichier nommé build-upload-ios.ymlet ajoutez le contenu suivant.

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

Ce workflow devrait être déclenché après chaque GitHub tagSi vous avez besoin d'automatiser les tags, veuillez vous référer à Construction automatique et publication avec des actions GitHub actions

Ensuite, ce workflow récupérera vos dépendances NodeJS, les installera et bâtira votre application JavaScript.

Chaque fois que vous envoyez un nouveau commit, une mise à jour sera construite dans TestFlight.

Your App doesn’t need to use Ionic, only Capacitor base is mandatory., it can have old Cordova module, but Capacitor JS plugin should be preferred.

8. Déclenchez le flux de travail

Créer un Commit

Faites un commitVous devriez voir le flux de travail actif dans le dépôt.

Déclenchez le flux de travail

Poussez les nouveaux commits vers la branche main ou development Pour déclencher le flux de travail.

Démarré avec le commit

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

Tableau de bord Testflight

9. Puis-je déployer depuis la machine locale ?

Oui, vous pouvez, et cela est facile.

You can use Xcode to build and sign your app, as always.

Guides de configuration CI/CD

Plateformes CI/CD Alternatives

Mises à jour en temps réel &amp; Déploiement

Merci

Cet article est basé sur les articles suivants :

Continuez de l'Automatic Capacitor IOS build avec des GitHub actions avec certificat

Si vous utilisez La livraison automatique IOS Capacitor avec des actions GitHub et de certificat pour planifier l'automatisation CI/CD, connectez-l’avec 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, Intégrations Capgo pour le flux de travail du produit dans Capgo Intégrations Intégration CI/CD pour les détails d'implémentation dans Intégration CI/CD, et GitHub Intégrations d'actions pour les détails d'implémentation dans GitHub Intégrations d'actions.

Mises à jour instantanées pour les applications Capacitor

When a web-layer bug is live, ship the fix through Capgo instead of waiting days for app store approval. Users get the update in the background while native changes stay in the normal review path.

Soutien humain de Martin

Commencez Maintenant

Dernières actualités

Capgo vous offre les meilleures informations dont vous avez besoin pour créer une application mobile vraiment professionnelle.