TL;DR La plateforme Azure Devops permet de constuire et déployer automatiquement, en continu, une application Java Spring Boot dans le cloud Microsoft. Un fichier yaml versionné avec le code source permet de configurer comment un tel déploiement peut être réalisé. Dans ce second article, je décris créér et paramétrer Azure Devops par le code.

Déployer avec Azure Devops

A titre d’exemple, j’ai choisi de déployer La Recyclette, mon application Spring Boot utilisant la webcam du navigateur pour déterminer si un déchet peut être recyclé.

Dans un premier article, je décris comment créer et configurer l’infrastructure Azure nécessaire au déploiement de cette application (ressource de type Application Web). Il s’agit maintenant de compiler et de packager cette application puis de la déployer dans la resource Azure préalablement configurée.

Pour le reste de l’article, je suppose que vous êtes connectés a Azure Devops et que vous avez un abonnement valide. L’abonnement gratuit (limité à 5 utilisateurs) suffit.

Créer un pipeline Azure Devops

Il faut commencer par un nouveau projet dans Azure Devops. Un projet regroupe l’ensemble des services permettant la réalisation et le déploiement d’une application web. Nous allons uniquement utiliser le service pipelines, mais les autres ont également leurs qualités et mériteraient une présentation à part entière (repos, boards agiles, etc.)

Une fois le projet en place, on peut se rendre dans l’onglet Pipelines > Pipelines pour commencer l’automatisation de notre déploiement.

Azure Devops va demander où récupérer le code source de l’application. Puisque dans notre cas le code source est disponible sur github.com, il faut associer son compte Github à Azure Devops. Cette opération nécessite de se connecter à Github et de fournir les autorisations nécessaires.

Configuration par fichier

Azure Devops demande un droit d’écriture dans le repository. Cela peut sembler intrusif, mais donne en réalité l’opportunité de sauvegarder la configuration de déploiement dans un fichier yaml, directement versionné au même endroit que votre code. Les intérêts sont multiples : répéter le déploiement, le faire évoluer en même temps que votre architecture, etc.

L’écriture de ce fichier yaml est largement assistée dans Azure Devops, via des templates et des assistants, l’expérience est vraiment moderne. Vous pouvez également prendre l’option d’une configuration plus classique, via des écrans et des formulaires, en cliquant sur le lien Classic editor en bas de page.

Nous pouvons commencer avec le Starter pipeline, qui va initialiser un fichier yaml et afficher un éditeur de texte permettant de le compléter.

Il contient trois sections trigger et pool et steps. trigger définit la branche à observer pour déclencher le build en continu, pool paramètre l’ensemble d’ordinateurs (agents) utilisés pour le build et enfin steps définit les tâches du build en lui même.

Le contenu par défaut du fichier est l’équivalent d’un hello world. On peut commencer par vider les tâches d’exemples insérées par défaut sous steps:.

Build

L’étape suivante est de packager notre application. Il faut indiquer à Azure Devops l’ensemble des actions nécessaires pour créer ce package. Ces actions vont prendre la forme de tâches, décrites dans le fichier yaml par un type, une description et des paramètres.

Un assistant de conception yaml, permettant de faciliter le renseignement de ces informations, est disponible à l’aide du bouton Show assistant sur la droite de l’éditeur.

Puisqu’il s’agit d’une application Spring Boot construite avec Maven, rechercher et sélectionner la tâche de type maven dans l’assistant, paramétrer les différentes options (chemin vers le pom.xml, etc.) et cliquer sur Add.

Attention, le contenu yaml va être inséré à l’endroit où le curseur est positionné dans l’éditeur, il faut donc bien s’assurer que ce dernier à l’endroit souhaité (la fin du fichier, après steps:) avant de cliquer sur Add, sinon le code ne sera plus valide.

- task: Maven@3
    displayName: 'Maven Package'
    inputs:
    mavenPomFile: 'pom.xml'

Copier les fichiers

Après cette étape Maven a en théorie généré une archive jar dans le dossier target de l’environnement de travail.

La seconde étape consiste à copier cette archive dans un second répertoire, le répertoire de staging. En effet, l’environnement de travail contient de nombreux fichiers intermédiaires (.class, .obj, etc.) qui n’ont pas d’intérêt à être déployés. Il faut donc récupérer uniquement l’archive qui nous intéresse. Ceci peut être fait avec la tache CopyFiles (à rechercher dans l’assistant)

- task: CopyFiles@2
    displayName: 'Copy Files to artifact staging directory'
    inputs:
    SourceFolder: '$(System.DefaultWorkingDirectory)'
    Contents: '**/target/*.?(war|jar)'
    TargetFolder: $(Build.ArtifactStagingDirectory)

Déployer

La dernière étape consiste à déployer l’archive dans la resource Azure de type Application Web.

Ceci peut être fait avec la tache AzureWebApp. Il faut spécifier l’identifiant de la souscription (l’abonnement) Azure dans laquelle déployer, ainsi que le nom de l’application, qui correspond au nom de l’instance applicative crée précédemment.

- task: AzureWebApp@1
displayName: 'Azure Web App Deploy'
inputs:
    azureSubscription: ...
    appType: webAppLinux
    appName: ...
    package: '$(Build.ArtifactStagingDirectory)/**/target/*.?(war|jar)'

Organisation

Pour mieux identifier les différentes tâches, elles peuvent être regroupées en sous parties : des stages. Par exemple j’ai choisi d’en créer deux : une pour le build et une pour le déploiement. Dans ce cas particulier, j’ai dû ajouter une tâche pour uploader les fichiers dans un répertoire drop partagé entre les différents stages.

Des variables de build (pour l’environnement et la souscription) ont également été ajoutées pour simplifier la maintenance. L’avantage est que ces variables peuvent être modifiées / surchargées lors du lancement de la pipeline.

Conclusion

Ces quelques étapes permettent de construire et de déployer une application Spring Boot dans Azure, à l’aide d’un fichier versionné avec le code source. La configuration choisie permet de déclencher ce déploiement automatiquement à chaque commit sur master.

Un exemple de fichier de configuration complet est disponible sur Github.