Photo par Ant Rozetsky

Comment builder et signer votre application iOS avec d'Azure DevOps

Découvrez l'intégration continue pour votre application iOS.

Posted by Damien Aicheh on December 05, 2019 · 11 mins

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.

Rapide rappel

Pour faire cela pour une application iOS, vous devez suivre quelques étapes:

  • Restaurer les Pods de votre projet
  • Choisir le bon environnement
  • Builder votre application
  • Signer en utilisant le bon certificat Apple
  • Générer un .ipa
  • Uploadez-le dans le Store de votre choix

Bien sûr, vous pouvez faire toutes ces étapes manuellement mais :

  • Ce sera répétitif
  • Cela prend du temps et le temps, c’est de l’argent
  • Vous ferez probablement des erreurs

Dans ce tutoriel, je vais vous montrer comment builder et signer automatiquement votre application iOS. Alors, commençons!

Présentation de Azure DevOps

L’idée est d’automatiser ce processus à l’aide de Azure DevOps, son intérêt étant de pouvoir:

  • Y accéder de n’importe où
  • Evitez d’être en charge de la maintenance du serveur
  • Dépensez moins d’argent et améliorez la qualité de vos livraisons

À la fin de ce tutoriel, nous disposerons d’un pipeline qui vous permettra de générer votre ipa en un seul clic.

Buildez votre propre pipeline

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.

Configurations globales

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'

Créez votre groupe de variables

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

Importez vos certificats

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:

  • Le certificat App Store qui vous permet simplement de distribuer votre application via le Store officielle.
  • Le certificat Ad Hoc qui vous permet d’installer l’application uniquement pour une liste de périphériques enregistrés dans votre compte Apple.
  • Le certificat interne est uniquement disponible avec un compte Apple Enterprise, ce qui vous permet de distribuer votre application uniquement à vos employés.

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:

Variable groups

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.

Builder et signer

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

Générer l’artefact

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:

Final Pipeline

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é !

N'hésitez pas à me suivre sur pour ne pas rater mon prochain tutoriel !