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 l’article suivant :
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
.
- Dans cet exemple, le secret est nommé
-
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
.
- 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é
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.
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 # ...
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
# ...
Note
Pour les cibles de construction 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