Some notions on Azure DevOps
Structure des pipelines Azure DevOps
Les pipelines Azure DevOps jouent le même que les github actions et que les fichiers gitlab-ci. Ils permettent d'automatiser les tâches les plus récurrentes et de mettre en place la CI-CD.
Un pipeline :
- est composé d'un ou plusieurs
stages
, - un
stage
est une manière d'organiser desjobs
de façon cohérente, - un
job
tourne sur un agent (runner), - un
job
est composé d'une ou plusieurssteps
, - Une
step
est alors soit unetask
, soitscript
, task
etscript
sont les blocs de bases d'un pipeline azure.
Scripts, Tasks
Un script
est simplement un suite de commande éxecutée les unes à la suite des autres. Suivant le runner (vm) utilisé, c'est commandes peuvent soit être des commandes shell, avec un runner ubuntu, soit des commandes powershelle (avec un runner windows).
Exemple
Un script possède un displayName
qui permet de l'identifier dans la suite des instructions données.
Si un script devient assez gros et complexe, il est alors possible de l'encapsuler dans une task
. une task
est un script
ou une procédure packagée qui a été abstraite et possède un ensemble d'inputs
. Chaque task
possède un ensemble d'inputs
spécifiques, que l'on peut consulter dans la documentation suivante.
Exemple : UsePythonVersion@0
Steps
Une fois que l'on souhaite définir une liste de script
ou task
que l'on veut éxecuter les unes à la suite des autres, on utilise alors le mot clé steps
.
Une step
est le plus petit bloc de contruction d'un pipeline azure, il peut contenir une ou plusieurs script
/task
Exemple
Jobs
Jobs
est une liste de job
.
Un job
est une liste de steps
lancées les unes à la suites des autres par un agent commun. A chque fois que l'on lance un pipeline, l'agent provisionne une nouvelle machine virutelle pour chaque job
, cette machine virtuelle est supprimée une fois que la liste des steps
présentes dans le job
a été entièrement éxecutée.
Ce qui veut dire que pour chaque job
dans une liste de jobs
, on a une machine virtuelle différente.
La plupart du temps il est nécessaire de définir quel agent on souhaite utiliser via le paramètre pool.vmImage
.
Exemple avec ubuntu-latest
Pour configurer les jobs
, les steps
, et stages
, il est possbile de définir des stratégies via la commande strategy.matrix
, pour pouvoir définir une matrice OS/python version.
Stages
Template Azure DevOps
Azure pipelines permet de créer des templates pour les tâches que l'on souhaite réutiliser, et de les partager entre nos différents pipelines.
Les templates permettent de partager une logique (tâche) commune à plusieurs pipelines de manière centralisée.
Il existe 4 types différents de templates :
- Stage Template : permet de définir une suite de
stages
et dejobs
correspondants. - Job Template : pour définir une série de
steps
éxecutée par un agent. - Step Template : pour définir une série de
task
,script
éxecutée par un agent. - Variable Template : pour définir une famille de variables (environnement, etc.)
Pour créer un template, on ne passe pas par la case Pipelines
de AZure DevOps, mais on les crée directement en tant que fichier yaml dans un repo.
Step template
steps-template.yaml | |
---|---|
Le step template est le template de plus bas niveau que vous puissiez créer. Pour l'utiliser, on peut l'appeler avec la commande template
.
Un template (step, job, stage) peut être entouré de commandes du même genre avant ou après lui, cela ne pose pas de problème, les instructions étant lues de façon linéaire.
Job template
jobs-template.yaml | |
---|---|
Un job template peut faire appel à un ou plusieurs step template en son sein.
Stage template
stages-template.yaml | |
---|---|
Le stage template est le seul qui possède toutes les étapes d'un pipeline, du stage
au script
.
Passer des paramètres à des temmplates
Pour l'instant ces templates ont des paramètres qui sont fixes, si l'on souhaite que ces templates soient plus modulaires, il faut les modifier légèrement.
Voyons comment faire cela sur un job template.
modular-jobs-template.yaml | |
---|---|
Tout d'abord il est nécessaire de définir les variables que l'on souhaite pouvoir être modifiable dans le pipeline. Cela se fait via l'ajout de la section parameters
. Appeler une variable dans ce template se fait via l'usage des ${{...}}
.
Une fois le template modifiée, on peut alors l'appeler dans un autre pipeline de la façon suivante.
Question
Comment passer à un template un paramètre qui est une variable de sortie d'une autre tâche ?
Pour cela, il est nécessaire de l'élever au rang de variables
.