Photo par pxhere.com

Comment builder et signer une application Android en utilisant Azure DevOps

Découvrez l'intégration continue avec Azure!

Créé par Damien Aicheh le 13/06/2019 · 8 mins

Lorsque vous développez une application mobile, vous devez livrer un apk régulièrement, par exemple lorsque vous souhaitez mettre à jour votre application sur le Google Play Store.

Rappel rapide

Pour ce faire, vous devez suivre quelques étapes:

  • Builder votre application en mode Release
  • Signer à l’aide du keystore
  • Enregistrer l’apk signé et l’uploader sur un store

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

Présentation de Azure DevOps

L’idée est d’automatiser ce process en utilisant un très bon outil: Azure DevOps, ce processus est appelé intégration continue.

L’intérêt d’utiliser Azure DevOps réside dans le fait que :

  • Il peut être accessible de partout
  • Vous ne serez pas en charge de la maintenance du serveur
  • Ce n’est pas très coûteux par rapport au gain que cela apporte sur vos projets

Nous allons créer quelque chose appelé un pipeline qui vous permettra de générer votre apk en un seul clic. Pour ce faire, nous utiliserons les Azure Pipelines.

Construisez votre propre pipeline

Configurer le projet

Allez dans Azure DevOps et dans la section Pipelines et Builds/Pipelines, créez un nouveau projet, puis suivez les 4 étapes pour obtenir le code source à partir du repository approprié:

Create project

Azure DevOps créera automatiquement un nouveau fichier à la racine du dossier de votre projet appelé azure-pipelines.yml. Vous devrez valider ce fichier dans votre référentiel de code. Il contient la définition du job de votre projet définie en yaml, il sera interprété par Azure DevOps pour savoir comment créer et signer votre application.

Ce qui est intéressant avec ce type de définition de job c’est:

  • Vous conservez vos tâches de construction avec votre code source à l’aide du fichier azure-pipelines.yml
  • yaml est facile à lire et à maintenir
  • Si vous migrez vers un autre compte Azure, vous conservez les configurations de vos jobs.

Configuration par défault

Accédez à votre projet Azure DevOps et modifiez le pipeline. Le fichier azure-pipelines.yml s’ouvrira et, au-dessus, vous verrez les lignes suivantes:

trigger:
- master

pool:
 vmImage: 'ubuntu-latest'

steps:

Comme vous pouvez le constater, chaque fois que quelque chose est poussé sur la branche * master , un nouveau build est lancé sur une machine virtuelle dotée de la dernière version d’Ubuntu*.

Changeons la vmImage pour une version de Mac, cela fixera un problem de chemin d’accès pour l’outil zipalign :

pool:
 vmImage: 'macOS-10.13'

Ensuite, nous devons créer nos différentes tâches sous la définition de steps pour définir ou créer un pipeline.

Construisez votre application avec Gradle

Pour construire un projet Android, la bonne pratique consiste maintenant à utiliser Gradle, ajoutons donc cette tâche:

- task: Gradle@2
  inputs:
    workingDirectory: ''
    gradleWrapperFile: 'gradlew'
    gradleOptions: '-Xmx3072m'
    javaHomeOption: 'JDKVersion'
    jdkVersionOption: '1.8'
    jdkArchitectureOption: 'x64'
    publishJUnitResults: false
    testResultsFiles: '**/TEST-*.xml'
    tasks: 'assembleRelease'

Pour le paramètre tasks, je choisis assembleRelease car je souhaite builder le mode Release par défaut. N’hésitez pas à définir la configuration de Gradle appropriée en fonction des besoins de votre projet. Maintenant, si vous lancez le job, vous devriez avoir tout réussi:

Build succeeded

Signer votre application

Il est maintenant temps de signer notre application que nous venons de builder à l’aide du keystore. N’oubliez pas que sans signer l’application, vous ne pourrez pas l’installer sur un appareil n’y l’uploader sur le store.

En dessous de la tâche de build Gradle, ajouter une nouvelle tâche pour signer l’application Android :

Pour les besoins du tutoriel, les données du keystore sont visibles, mais vous devez utiliser les variables secrètes à la place recommandée par Microsoft. Si vous n’êtes pas familier avec cela, vous pouvez consulter mon tutoriel à ce sujet.

- task: AndroidSigning@3
  inputs:
    apkFiles: '**/*.apk'
    apksign: true
    apksignerKeystoreFile: 'production.keystore'
    apksignerKeystorePassword: 'keystorepwd'
    apksignerKeystoreAlias: 'key0'
    apksignerKeyPassword: 'aliaspwd'
    apksignerArguments: --out $(Build.SourcesDirectory)/app/build/outputs/apk/release/ my-crazy-app.release.apk
    zipalign: true

Je vous recommande de spécifier le apksignerArguments comme je l’ai fait pour donner un nouveau nom à l’apk signé. Si vous ne le faites pas, l’apk signé aura le même nom que celui non signé. Si vous mettez le job en file d’attente maintenant, vous obtiendrez cette erreur:

Keystore error

Cette erreur vous indique que le fichier de clés n’est pas trouvé car le pipeline n’y a pas accès. Pour résoudre ce problème, accédez à la section Pipelines et Library puis, dans l’onglet Fichiers sécurisés, où vous devez uploader votre keystore:

Keystore upload

Revenez ensuite au dernier job ayant échoué et cliquez sur le bouton Authorize resources pour pouvoir l’utiliser sans erreur. Vous pouvez maintenant relancer le build sans erreur.

Générer l’artéfact

Nous avons notre apk buildé et signé, il est temps d’obtenir l’apk généré sur notre machine. Nous devons d’abord copier l’apk dans les répertoires des artéfacts avec une première task. Notez que je choisis tous les fichiers apk qui se terminent par .release.apk comme défini précédemment dans la task de signature Android.

- task: CopyFiles@2
  inputs:
    SourceFolder: $(Build.SourcesDirectory)
    contents: '**/*.release.apk'
    targetFolder: '$(build.artifactStagingDirectory)'
    overWrite: true

Dernière étape, nous publions les artéfacts afin qu’ils puissent être téléchargés en cliquant sur le bouton Artifacts.

- task: PublishBuildArtifacts@1
  inputs:
    pathtoPublish: '$(Build.ArtifactStagingDirectory)/app/build/outputs/apk/release/'
    artifactName: 'apks'
    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 !