Fun with Azure Pipelines - if - 2/?
Cet article fait partie d’une série consacré à Azure Pipelines. Retrouvez l’épisode précédent
Au menu aujourd’hui
Aujourd’hui, on va s’intéresser à la meta-tasks if
. Il existe des fonctionnalités dans Azure Pipelines qui peuvent remplir ce rôle, mais celles-ci offre des possibilités intéressantes.
Toujours dans le contexte de l’écriture de notre template réutilisable dans n projets, nous allons voir comment le rendre plus souple pour qu’il s’adapte au mieux.
Go !
Rappel
Un template Azure Pipeline défini des paramètres en input. C’est sur ces paramètres que nous allons nous appuyer pour exploiter if
ainsi que sur les variables système, celles prédéfinies d’Azure DevOps et qui contiennent des informations de contexte.
On oublie donc les variables que l’on pourrait définir en cours de pipeline.
Exécution conditionnelle de stage, job ou step
Il se peut qu’on veuille executer ou non certaines tâches en fonction d’un paramètre particulier. Il existe deux possibilités :
- l’attribut
condition
présent sur les éléments stage, job et task - la méta-task
if
Avec condition
condition
existe depuis la génération précédente (pipelines en mode designer), aussi bien côté Build que côté Release.
- job: BuildAllCondition
steps:
- powershell: |
Write-Host "Hello Step 1"
displayName: Step 1
- powershell: |
Write-Host "Hello Step 2"
condition: ${{ eq(parameters.doEven, true) }}
displayName: Step 2
- powershell: |
Write-Host "Hello Step 3"
displayName: Step 3
- powershell: |
Write-Host "Hello Step 4"
condition: ${{ eq(parameters.doEven, true) }}
displayName: Step 4
- powershell: |
Write-Host "Hello Step 5"
displayName: Step 5
- powershell: |
Write-Host "Hello Step 6"
displayName: Step 6
condition: ${{ eq(parameters.doEven, true) }}
Le résulat obtenu est similaire à ceci :
Fonctionnel mais pas des plus esthétiques.
Avec if
Avec if
, le code de notre pipeline devient :
- job: BuildAllIf
steps:
- powershell: |
Write-Host "Hello Step 1"
displayName: Step 1
- ${{ if eq(parameters.doEven, true) }}:
- powershell: |
Write-Host "Hello Step 2"
displayName: Step 2
- powershell: |
Write-Host "Hello Step 3"
displayName: Step 3
- ${{ if eq(parameters.doEven, true) }}:
- powershell: |
Write-Host "Hello Step 4"
displayName: Step 4
- powershell: |
Write-Host "Hello Step 5"
displayName: Step 5
- ${{ if eq(parameters.doEven, true) }}:
- powershell: |
Write-Host "Hello Step 6"
displayName: Step 6
Et le résultat obtenu est fonctionnellement identique mais un brun plus propre
L’intérêt de if
n’est pas qu’esthétique et pour mieux comprendre, d’autres cas d’usage.
if
et dependsOn
Que se passe-t-il si vous voulez rendre une phase facultative en fonction d’un paramètre, le déploiement sur un certain environnement par exemple, mais qu’un stage dépend de celui-ci.
if
prend ici tout son sens. Même si la syntaxe est un peu lourde et peut complexifier le pipeline, on gagne énormément en souplesse d’exécution.
parameters:
- name: build2
type: boolean
default: false
stages:
- stage: s1
dependsOn: []
displayName: Build
jobs:
- template: fakejobs.yml
- ${{ if eq(parameters.build2, true) }}:
- stage: s2
dependsOn: []
displayName: Build
jobs:
- template: fakejobs.yml
- stage: d1
dependsOn:
- s1
- ${{ if eq(parameters.build2, true) }}:
- s2
displayName: Deploy on Env1
jobs:
- template: fakejobs.yml
Dans cet exemple, on peut choisir d’exécuter le stage s2 en fonction d’une caractéristique d’un projet. Notre pipeline va ainsi s’adapter et gérer proprement l’exécution du déploiement.
Voici le résultat en image :
if
et les variables
Tout comme pour dependsOn
, on peut définir des variables en fonction d’un paramètre :
parameters:
- name: param1
type: boolean
default: false
variables:
- ${{ if eq(parameters.param1, true) }}:
- name: myVar
value: "One value"
- ${{ if eq(parameters.param1, false) }}:
- name: myVar
value: "Another value"
stages:
- stage: s1
dependsOn: []
displayName: Build
jobs:
- job:
steps:
- powershell: |
Write-Host "Hello $(myVar)"
displayName: '$(myVar)'
Conclusion
Le if
offre une option intéressante pour gérer des exécutions conditionnelles. Son évaluation très tôt, avant l’éxécution du pipeline, permet de simplifier la lecture de l’exécution quand appliqué sur des stages, jobs ou steps. Il permet également plus de souplesse pour la gestion des dépendances et éventuellement de variables.
En revanche, il ne remplacera pas l’attribut condition
qui est lui évalué à l’éxécution.
On va donc dire qu’ils sont complémentaires et cet article devrait vous aider à y voir plus clair.