- Azure
- Azure DevOps
- iOS
Lors du développement d’une application mobile, vous devez distribuer un package régulièrement, par exemple lorsque vous souhaitez mettre à jour votre application sur l’App Store.
Pour faire cela pour une application iOS, vous devez suivre quelques étapes:
.ipa
Bien sûr, vous pouvez faire toutes ces étapes manuellement mais :
Dans ce tutoriel, je vais vous montrer comment builder et signer automatiquement votre application iOS. Alors, commençons!
L’idée est d’automatiser ce processus à l’aide de Azure DevOps, son intérêt étant de pouvoir:
À la fin de ce tutoriel, nous disposerons d’un pipeline qui vous permettra de générer votre ipa
en un seul clic.
Commençons donc par aller sur Azure DevOps!
Dans l’onglet Pipelines, créez un New pipeline et suivez les 4 étapes pour obtenir le code source à partir du repository approprié. Azure DevOps créera automatiquement un nouveau fichier azure-pipelines.yml
à la racine du dossier de votre projet. C’est à cet endroit que la définition du job sera définie et ensuite interprétée par Azure DevOps.
Nous compilerons notre application iOS à l’aide de la dernière version de mac disponible sur Azure DevOps: 10.14
. Cela nous permettra de compiler pour iOS 13.1
.
Définissons la version de l’agent mac au-dessus du fichier azure-pipelines.yml
comme suit:
pool:
vmImage: 'macos-10.14'
Ce job nécessitera plusieurs variables telles que le chemin du dossier, des variables d’environnements et des mots de passes. Donc, pour gérer tout cela, créons un variable group. Si vous n’êtes pas familier avec cela, vous pouvez consulter mon précédent tutoriel à ce sujet.
Pour ce tutoriel, le groupe de variables s’appellera ios-pipeline
, chargez-le en l’ajoutant juste en dessous de la définition de l’agent, comme suit:
variables:
- group: ios-pipeline
Pour signer votre application, vous aurez besoin d’un provisioning profile et d’un accès à un certificat de distribution iOS.
Il existe quelques types de certificats Apple:
Avec cela en tête, choisissez le bon en fonction de vos besoins.
Avec votre certificat et votre provisioning profile prêts, vous devez maintenant les uploader dans le Secure File
. Pour ce faire, accédez à Pipelines > Library > Secure files. Pour ce tutoriel, mon provisioning profile s’appellera My_Demo_Application_AdHoc_Distribution.mobileprovision
.
Lorsque votre certificat de distribution est prêt, vous devez en exporter la clé publique. Pour ce faire, ajoutez-le à votre Keychain
sur votre mac, puis faites un clic droit dessus et exportez-le en tant que fichier .p12
, vous pourrez ensuite l’uploader dans la section des Secure File
. N’oubliez pas d’ajouter le mot de passe associé au groupe de variables.
À ce stade, vos groupes de variables devraient ressembler à ceci:
Ceci fait, nous pouvons ajouter deux tâches à notre azure-pipelines.yml
:
Premièrement, installez le certificat Apple précédemment uploadé, nous allons signer l’ipa
avec:
- task: InstallAppleCertificate@2
inputs:
certSecureFile: '$(p12FileName)'
certPwd: '$(p12Password)'
keychain: 'temp'
deleteCert: true
Ajoutez ensuite une nouvelle tâche pour installer le provisioning profile associé à votre application, comme suit:
- task: InstallAppleProvisioningProfile@1
inputs:
provisioningProfileLocation: 'secureFiles'
provProfileSecureFile: '$(provisioningProfile)'
removeProfile: true
Avec ces tâches, l’agent mac est prêt à builder et à signer votre projet.
Il est temps de builder notre application. Commençons par restaurer les packages Cocoapods de notre projet en ajoutant cette tâche:
- task: CocoaPods@0
inputs:
forceRepoUpdate: false
Si vous n’avez pas de Pods dans votre projet, ignorez cette tâche.
Avant d’ajouter la tâche de build Xcode@5
, ajoutez deux variables: configuration
et iphoneos
, définissez-les comme suit:
variables:
- group: ios-pipeline
- name: configuration
value: 'Release'
- name: sdk
value: 'iphoneos'
Nous compilons notre application en mode Release
et nous utilisons le sdk iphoneos
. Prochaine étape, ajouter la tâche de build:
- task: Xcode@5
inputs:
actions: 'build'
scheme: 'iOSPipeline'
sdk: '$(sdk)'
configuration: '$(configuration)'
xcWorkspacePath: '**/iOSPipeline.xcworkspace'
xcodeVersion: 'default'
packageApp: true
signingOption: 'manual'
signingIdentity: '$(APPLE_CERTIFICATE_SIGNING_IDENTITY)'
provisioningProfileUuid: '$(APPLE_PROV_PROFILE_UUID)'
Expliquons ce que la tâche Xcode@5
fait. Nous avons choisi une configuration Release
et le sdk iphoneos
comme précédemment déclaré dans les variables et nous avons activé la génération d’un package pour l’application: un ipa
.
Le compilateur a également besoin de savoir quel scheme
utiliser dans votre projet pour builder votre application. Si vous ne savez pas quel régime vous avez dans votre projet, ouvrez un terminal sur votre mac et lancez cette ligne si vous avez un fichier d’espace de travail .xcworkspace
:
xcodebuild -workspace /path/to/your/.xcworkspace -list
Ou celui-ci si vous avez juste un fichier de projet .xcodeproj
:
xcodebuild -project /path/to/your/ -list
Ceci listera tout les schemes
disponible sur votre projet et vous n’aurez plus qu’à prendre le bon. Si vous ne configurez pas cette valeur et que vous utilisez un .xcworkspace
vous obtiendrez ce genre d’erreur:
xcodebuild: error: If you specify a workspace then you must also specify a scheme. Use -list to see the schemes in this workspace
La variable $ (APPLE_CERTIFICATE_SIGNING_IDENTITY)
correspond à la tâche ‘Install Apple Certificate’ que nous avons précédemment éffectué et est définie automatiquement.
La variable $(APPLE_PROV_PROFILE_UUID)
est quand à elle automatiquement définie par la tâche ‘Install Apple Provisioning Profile’ et est lié au provisioning profile précédement défini.
Maintenant, si vous exécutez votre build pour la première fois, vous recevrez un message d’erreur vous demandant de donner accès à vos groupes de variables et à vos fichiers sécurisés. Acceptez-le en cliquant sur Authorize resources
, redémarrez le build et tout sera bon.
Si vous utilisez des Pods, vous aurez probablement une erreur comme celle-ci:
error: Pods-ProjectName does not support provisioning profiles, but provisioning profile TheNameOfYourProfile has been manually specified.
En effet, vous essayez de signer les Pods mais vous ne voulez pas le faire, il vous suffit de signer le code de votre application. Pour résoudre ce problème, ouvrez simplement votre Podfile
et ajoutez les lignes ci-dessous pour indiquer que vous n’avez pas besoin de signer les Pods.
post_install do |installer|
installer.pods_project.build_configurations.each do |config|
config.build_settings['CODE_SIGNING_REQUIRED'] = "NO"
config.build_settings['CODE_SIGNING_ALLOWED'] = "NO"
end
end
Nous avons buildé et signé notre ipa
, il est temps de le télécharger. Nous devons d’abord copier le fichier ipa
du répertoire des sources du build dans les répertoires des artefacts en effectuant cette première tâche:
- task: CopyFiles@2
inputs:
contents: '**/*.ipa'
targetFolder: '$(build.artifactStagingDirectory)'
overWrite: true
La dernière étape est la publication de l’ipa
afin qu’il puisse être téléchargé en cliquant sur le bouton Artifacts.
- task: PublishBuildArtifacts@1
inputs:
pathtoPublish: '$(build.artifactStagingDirectory)/output/$(sdk)/$(configuration)'
artifactName: 'drop'
publishLocation: 'Container'
Si tout se passe bien, vous verrez quelque chose comme ceci:
Sources:
Vous trouverez un exemple de code sur ce répertoire Github.
Happy codding !
Vous avez aimé ce tutoriel ? Laissez une étoile sur le répertoire Github associé !