Skip to main content

Installation d’un certificat Apple sur des exécuteurs macOS pour le développement Xcode

Vous pouvez signer les applications Xcode dans votre workflow d’intégration continue (CI) en installant un certificat de signature de code Apple sur les exécuteurs GitHub Actions.

Introduction

Ce guide vous montre comment ajouter une étape à votre workflow d’intégration continue (CI) pour installer un certificat de signature de code Apple et un profil de provisionnement sur les exécuteurs GitHub Actions. Cela vous permettra de signer vos applications Xcode pour la publication sur l’Apple App Store ou de la distribuer aux groupes de test.

Prérequis

Vous devez être familiarisé avec YAML et la syntaxe GitHub Actions. Pour plus d'informations, consultez les pages suivantes :

Vous devez comprendre la création et la signature d’applications Xcode. Pour plus d’informations, consultez la documentation pour développeurs Apple.

Création de secrets pour votre certificat et votre profil de provisionnement

Le processus de signature implique de stocker des certificats et des profils de provisionnement, de les transférer vers l’exécuteur, de les importer dans le trousseau de l’exécuteur et de les utiliser dans votre build.

Pour utiliser votre certificat et votre profil de provisionnement sur un exécuteur, nous vous recommandons vivement d’utiliser des secrets GitHub. Pour plus d’informations sur la création de secrets et leur utilisation dans un workflow, consultez « Utilisation de secrets dans GitHub Actions ».

Créez des secrets dans votre dépôt ou votre organisation pour les éléments suivants :

  • Votre certificat de signature Apple.

    • Il s’agit de votre fichier de certificat p12. Pour plus d’informations sur l’exportation de votre certificat de signature à partir de Xcode, consultez la documentation Xcode.

    • Vous devez convertir votre certificat en Base64 quand vous l’enregistrez en tant que secret. Dans cet exemple, le secret est nommé BUILD_CERTIFICATE_BASE64.

    • Utilisez la commande suivante pour convertir votre certificat en Base64 et le copier dans le Presse-papiers :

      base64 -i BUILD_CERTIFICATE.p12 | pbcopy
      
  • Mot de passe de votre certificat de signature Apple.

    • Dans cet exemple, le secret est nommé P12_PASSWORD.
  • Votre profil de provisionnement Apple.

    • Pour plus d’informations sur l’exportation de votre profil de provisionnement à partir de Xcode, consultez la documentation Xcode.

    • Vous devez convertir votre profil de provisionnement en Base64 quand vous l’enregistrez en tant que secret. Dans cet exemple, le secret est nommé BUILD_PROVISION_PROFILE_BASE64.

    • Utilisez la commande suivante pour convertir votre profil de provisionnement en Base64 et le copier dans le Presse-papiers :

      base64 -i PROVISIONING_PROFILE.mobileprovision | pbcopy
      
  • Un mot de passe de trousseau.

    • Un nouveau trousseau est créé sur l’exécuteur. Ainsi, le mot de passe du nouveau trousseau peut être n’importe quelle nouvelle chaîne aléatoire. Dans cet exemple, le secret est nommé KEYCHAIN_PASSWORD.

Ajouter une étape à votre workflow

Cet exemple de workflow inclut une étape qui importe le profil de provisionnement et le certificat Apple à partir des secrets GitHub et les installe sur l’exécuteur.

YAML
name: App build
on: push

jobs:
  build_with_signing:
    runs-on: macos-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
      - name: Install the Apple certificate and provisioning profile
        env:
          BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
          P12_PASSWORD: ${{ secrets.P12_PASSWORD }}
          BUILD_PROVISION_PROFILE_BASE64: ${{ secrets.BUILD_PROVISION_PROFILE_BASE64 }}
          KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
        run: |
          # create variables
          CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12
          PP_PATH=$RUNNER_TEMP/build_pp.mobileprovision
          KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db

          # import certificate and provisioning profile from secrets
          echo -n "$BUILD_CERTIFICATE_BASE64" | base64 --decode -o $CERTIFICATE_PATH
          echo -n "$BUILD_PROVISION_PROFILE_BASE64" | base64 --decode -o $PP_PATH

          # create temporary keychain
          security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
          security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
          security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH

          # import certificate to keychain
          security import $CERTIFICATE_PATH -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
          security set-key-partition-list -S apple-tool:,apple: -k "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
          security list-keychain -d user -s $KEYCHAIN_PATH

          # apply provisioning profile
          mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
          cp $PP_PATH ~/Library/MobileDevice/Provisioning\ Profiles
      - name: Build app
        ...

Remarque : Pour les cibles de build iOS, votre profil de provisionnement doit avoir l’extension .mobileprovision. Pour les cibles de build macOS, l’extension doit être .provisionprofile. L’exemple de workflow ci-dessus doit être mis à jour pour refléter votre plateforme cible.

Nettoyage requis sur les exécuteurs auto-hébergés

Les exécuteurs hébergés sur GitHub sont des machines virtuelles isolées qui sont automatiquement détruites à la fin de l’exécution du travail. Cela signifie que les certificats et le profil de provisionnement utilisés sur l’exécuteur pendant le travail seront détruits avec l’exécuteur lorsque le travail sera terminé.

Sur les exécuteurs auto-hébergés, le répertoire $RUNNER_TEMP est nettoyé à la fin de l’exécution du travail, mais le trousseau et le profil de provisionnement peuvent encore exister sur l’exécuteur.

Si vous utilisez des exécuteurs auto-hébergés, vous devez ajouter une étape finale à votre workflow pour vous assurer que ces fichiers sensibles sont supprimés à la fin du travail. L’étape de workflow indiquée ci-dessous est un exemple de procédure à suivre.

- name: Clean up keychain and provisioning profile
  if: ${{ always() }}
  run: |
    security delete-keychain $RUNNER_TEMP/app-signing.keychain-db
    rm ~/Library/MobileDevice/Provisioning\ Profiles/build_pp.mobileprovision