Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022
Importante
Sélectionnez la version de cet article qui correspond à votre plateforme et à votre version. Le sélecteur de version se trouve au-dessus de la table des matières. Recherchez votre plateforme et votre version Azure DevOps.
Utilisez des expressions lorsque vous devez spécifier une chaîne, une valeur booléenne ou numérique lors de la création d’un pipeline. Lorsqu'une expression retourne un tableau, les règles d'indexation normales s'appliquent et l'index commence par 0.
L’utilisation la plus courante des expressions est dans des conditions pour déterminer si un travail ou une étape doit s’exécuter.
# Expressions are used to define conditions for a step, job, or stage
steps:
- task: ...
condition: <expression>
Une autre utilisation courante des expressions est la définition de variables.
Vous pouvez évaluer des expressions au moment de la compilation ou au moment de l’exécution.
Utilisez des expressions de temps de compilation n’importe où ; utilisez des expressions runtime dans des variables et des conditions. Utilisez des expressions runtime pour calculer le contenu des variables et de l’état (exemple : condition).
# Two examples of expressions used to define variables
# The first one, a, is evaluated when the YAML file is compiled into a plan.
# The second one, b, is evaluated at runtime.
# Note the syntax ${{}} for compile time and $[] for runtime expressions.
variables:
a: ${{ <expression> }}
b: $[ <expression> ]
La différence entre les syntaxes d’expression au moment de l’exécution et de la compilation est principalement le contexte disponible.
Dans une expression au moment de la compilation (${{ <expression> }}), vous avez accès à parameters et variables, défini statiquement.
Dans une expression au moment de l’exécution ($[ <expression> ]), vous avez accès à variables, mais pas aux paramètres.
Dans cet exemple, une expression au moment de l’exécution définit la valeur de $(isMain). Une variable statique dans une expression au moment de la compilation définit la valeur de $(compileVar).
variables:
staticVar: 'my value' # static variable
compileVar: ${{ variables.staticVar }} # compile time expression
isMain: $[eq(variables['Build.SourceBranch'], 'refs/heads/main')] # runtime expression
steps:
- script: |
echo ${{variables.staticVar}} # outputs my value
echo $(compileVar) # outputs my value
echo $(isMain) # outputs True
Une expression peut être un littéral, une référence à une variable, une référence à une dépendance, une fonction ou une combinaison imbriquée valide de ces types.
Littéraux
Dans le cadre d’une expression, vous pouvez utiliser des booléens, null, des nombres, des chaînes ou des littéraux de version.
# Examples
variables:
someBoolean: ${{ true }} # case insensitive, so True or TRUE also works
someNumber: ${{ -1.2 }}
someString: ${{ 'a b c' }}
someVersion: ${{ 1.2.3 }}
Booléen
True et False sont des expressions littérales booléennes.
Zéro
Null est une expression littérale spéciale qui est renvoyée à partir d’un échec du dictionnaire, par exemple (variables['noSuch']). Null peut être la sortie d’une expression, mais ne peut pas être appelé directement dans une expression.
Nombre
Commence par « - », « . » ou « 0 » à « 9 ».
Chaîne
Doit être entre guillemets uniques. Par exemple : 'this is a string'.
Pour exprimer un guillemet unique littéral, échappez-le avec un guillemet unique.
Par exemple : 'It''s OK if they''re using contractions.'.
Vous pouvez utiliser un caractère pipe (|) pour les chaînes multilignes.
myKey: |
one
two
three
Version
Numéro de version comprenant jusqu’à quatre segments.
Doit commencer par un nombre et contenir deux ou trois caractères de point (.).
Par exemple : 1.2.3.4.
Variables
Dans le cadre d’une expression, vous pouvez accéder aux variables à l’aide de l’une des deux syntaxes suivantes :
- Syntaxe d’index :
variables['MyVar'] - Syntaxe de déréférencement de propriété :
variables.MyVar
Pour utiliser la syntaxe de déréférencement de propriété, le nom de la propriété doit :
- Commencez par
a-Zou_ - Être suivi de
a-Z,0-9ou_
Différentes variables sont disponibles en fonction du contexte d’exécution.
- Si vous créez des pipelines à l’aide de YAML, des variables de pipeline sont disponibles.
- Si vous créez des pipelines de build à l’aide de l’éditeur classique, les variables de build sont disponibles.
- Si vous créez des pipelines de mise en production à l’aide de l’éditeur classique, les variables de mise en production sont disponibles.
Les variables sont toujours des chaînes. Si vous souhaitez utiliser des valeurs typées, utilisez des paramètres.
Remarque
Il existe une limitation pour l’utilisation de variables avec des expressions pour les pipelines Classic et YAML lors de la configuration de ces variables via l’interface utilisateur de l’onglet Variables. Les variables définies en tant qu’expressions ne doivent pas dépendre d’une autre variable avec expression en valeur, car il n’est pas garanti que les deux expressions soient évaluées correctement. Par exemple, nous avons une variable a dont la valeur $[ <expression> ] est utilisée comme partie pour la valeur de la variable b. Étant donné que l’ordre de traitement des variables n’est pas garanti, la variable b peut avoir une valeur incorrecte de variable a après l’évaluation.
Vous ne pouvez utiliser ces constructions que lorsque vous configurez des variables via le mot clé des variables dans un pipeline YAML. Vous devez placer les variables dans l’ordre dans lequel elles doivent être traitées pour obtenir les valeurs correctes après le traitement.
Fonctions
Vous pouvez utiliser les fonctions intégrées suivantes dans les expressions.
et
- Renvoie
Truesi tous les paramètres sontTrue. - Paramètres minimaux : 2. Paramètres maximum : N.
- Convertit les paramètres en booléen pour l’évaluation.
- Courts-circuits après le premier
False. - Exemple :
and(eq(variables.letters, 'ABC'), eq(variables.numbers, 123))
fusionner
- Évalue les paramètres dans l’ordre (de gauche à droite) et retourne la première valeur qui n’est pas null ou une chaîne vide.
- Retourne aucune valeur si toutes les valeurs de paramètre sont null ou des chaînes vides.
- Paramètres minimaux : 2. Paramètres maximum : N.
- Exemple :
coalesce(variables.couldBeNull, variables.couldAlsoBeNull, 'literal so it always works')
contient
-
TrueÉvalue si la chaîne de paramètre de gauche contient le paramètre de droite. - Paramètres minimaux : 2. Paramètres maximum : 2.
- Convertit les paramètres en chaîne de caractères pour évaluation.
- Effectue une comparaison ordinale ignore-case.
- Exemple :
contains('ABCDE', 'BCD')(retourne True).
contientValeur
- Évalue
Truesi le paramètre de gauche est un tableau et qu'un de ses éléments est égal au paramètre de droite. Évalue également àTruesi le paramètre de gauche est un objet et si la valeur d’une propriété est égale au paramètre de droite. - Paramètres minimaux : 2. Paramètres maximum : 2.
- Si le paramètre de gauche est un tableau, convertissez chaque élément pour qu’il corresponde au type du paramètre de droite. Si le paramètre de gauche est un objet, convertissez la valeur de chaque propriété pour qu’elle corresponde au type du paramètre de droite. La comparaison d’égalité pour chaque élément spécifique évalue à
Falsesi la conversion échoue. - Comparaison ordinale insensible à la casse pour les chaînes de caractères.
- Court-circuite après la première correspondance
Remarque
Il n’existe aucune syntaxe littérale dans un pipeline YAML pour spécifier un tableau. Cette fonction est d’une utilisation limitée dans les pipelines généraux. Elle est destinée à être utilisée dans le contexte du décorateur de pipeline avec des tableaux fournis par le système, comme la liste des étapes.
Vous pouvez utiliser l’expression containsValue pour rechercher une valeur correspondante dans un objet. Voici un exemple qui illustre la recherche d’une correspondance de Build.SourceBranch dans la liste des branches sources.
parameters:
- name: branchOptions
displayName: Source branch options
type: object
default:
- refs/heads/main
- refs/heads/test
jobs:
- job: A1
steps:
- ${{ each value in parameters.branchOptions }}:
- script: echo ${{ value }}
- job: B1
condition: ${{ containsValue(parameters.branchOptions, variables['Build.SourceBranch']) }}
steps:
- script: echo "Matching branch found"
convertToJson
- Prend un objet complexe et le génère au format JSON.
- Paramètres min. : 1. Paramètres max. : 1.
parameters:
- name: listOfValues
type: object
default:
this_is:
a_complex: object
with:
- one
- two
steps:
- script: |
echo "${MY_JSON}"
env:
MY_JSON: ${{ convertToJson(parameters.listOfValues) }}
Sortie du script :
{
"this_is": {
"a_complex": "object",
"with": [
"one",
"two"
]
}
}
compteur
- Utilisez cette fonction uniquement dans une expression qui définit une variable. Ne l’utilisez pas dans une condition pour une étape, une tâche ou un stade.
- Évalue un nombre qui incrémente avec chaque exécution d’un pipeline.
- Prend deux paramètres :
prefixetseed. -
prefixest une expression de chaîne. La fonction effectue le suivi d’une valeur de compteur distincte pour chaque valeur uniqueprefix. Utilisez des caractères UTF-16 dans leprefix. -
seedest la valeur de départ du compteur.
Vous pouvez créer un compteur qui s'accroît automatiquement de un chaque fois que votre pipeline s’exécute. Lorsque vous définissez un compteur, fournissez un prefix et un seed. L’exemple suivant illustre ce concept.
variables:
major: 1
# define minor as a counter with the prefix as variable major, and seed as 100.
minor: $[counter(variables['major'], 100)]
steps:
- bash: echo $(minor)
La valeur de minor dans l’exemple précédent est 100 pendant la première exécution du pipeline. Dans la deuxième exécution, la valeur est 101, tant que la valeur de major reste 1.
Si vous modifiez le fichier YAML et mettez à jour la valeur de la variable major à 2, la valeur de minor sera 100 lors de l’exécution suivante du pipeline. Les exécutions suivantes incrémentent le compteur à 101, 102, 103, etc.
Si vous modifiez ultérieurement le fichier YAML et définissez la valeur de major retour sur 1, la valeur du compteur reprend là où elle s’est arrêtée pour ce préfixe. Dans cet exemple, il reprend à 102.
L’exemple suivant montre comment définir une variable comme compteur qui commence à 100, incrémente de 1 pour chaque exécution et est réinitialisée à 100 par jour.
Remarque
pipeline.startTime n’est pas disponible en dehors des expressions.
pipeline.startTime transforme system.pipelineStartTime en un objet de date et d'heure pour qu'il puisse être utilisé dans les expressions.
Le fuseau horaire par défaut pour pipeline.startTime est UTC. Vous pouvez modifier le fuseau horaire pour votre organisation.
jobs:
- job:
variables:
a: $[counter(format('{0:yyyyMMdd}', pipeline.startTime), 100)]
steps:
- bash: echo $(a)
L’exemple suivant montre un compteur qui conserve une valeur distincte pour les demandes de tirage et les exécutions CI.
variables:
patch: $[counter(variables['build.reason'], 0)]
Les compteurs sont limités à un pipeline. En d’autres termes, le pipeline incrémente la valeur du compteur pour chaque exécution. Aucun compteur n'est spécifique au projet.
finPar
- Évalue si
Truela chaîne du paramètre de gauche se termine par le paramètre de droite - Paramètres minimaux : 2. Paramètres maximum : 2.
- Convertit les paramètres en chaîne de caractères pour l’évaluation.
- Effectue une comparaison ordinale ignore-case.
- Exemple :
endsWith('ABCDE', 'DE')(retourne True)
Eq
- Évalue
Truesi les paramètres sont égaux - Paramètres minimaux : 2. Paramètres maximum : 2.
- Convertit le paramètre droit pour correspondre au type de paramètre de gauche. Retourne
Falsesi la conversion échoue. - Comparaison ordinale insensible à la casse pour les chaînes de caractères.
- Exemple :
eq(variables.letters, 'ABC')
format
- Évalue les paramètres de fin et les insère dans la chaîne de paramètres de début
- Paramètres min. : 1. Paramètres max. : N
- Exemple :
format('Hello {0} {1}', 'John', 'Doe') - Utilise des spécificateurs de format de date et d’heure personnalisés .NET pour la mise en forme de date (
yyyy,yy,MM,M,dd,d,HH,H,m,mm,ss,s,f,ff,ffff,K) - Exemple :
format('{0:yyyyMMdd}', pipeline.startTime). Dans ce cas,pipeline.startTimeest une variable d’objet date/heure spéciale. - Échappez en doublant les accolades. Par exemple :
format('literal left brace {{ and literal right brace }}')
Ge
- Évalue à
Truesi le paramètre de gauche est supérieur ou égal au paramètre de droite - Paramètres minimaux : 2. Paramètres maximum : 2.
- Convertit le paramètre droit pour correspondre au type de paramètre de gauche. Erreurs si la conversion échoue.
- Comparaison ordinale insensible à la casse pour les chaînes de caractères.
- Exemple :
ge(5, 5)(retourne True)
Gt
- Évalue
Truelorsque le paramètre de gauche est supérieur au paramètre de droite - Paramètres minimaux : 2. Paramètres maximum : 2.
- Convertit le paramètre droit pour correspondre au type de paramètre de gauche. Erreurs si la conversion échoue.
- Comparaison ordinale insensible à la casse pour les chaînes de caractères.
- Exemple :
gt(5, 2)(retourne True)
dans
- Évalue si le paramètre de gauche est égal à n’importe quel des paramètres de droite
- Paramètres min. : 1. Paramètres max. : N
- Convertit les paramètres de droite pour qu’ils correspondent au type de paramètre de gauche. La comparaison d’égalité évalue
Falsesi la conversion échoue. - Comparaison ordinale insensible à la casse pour les chaînes de caractères.
- Court-circuite après la première correspondance
- Exemple :
in('B', 'A', 'B', 'C')(retourne True)
iif
- Renvoie le deuxième paramètre si le premier paramètre prend la valeur
True, et le troisième paramètre sinon. - Paramètres min. : 1. Paramètres max. : 3
- Le premier paramètre doit être une condition
- Exemple :
iif(eq(variables['Build.Reason'], 'PullRequest'), 'ManagedDevOpsPool', 'Azure Pipelines')retourne « ManagedDevOpsPool » pendant l'exécution du pipeline en réponse à une demande de tirage.
joindre
- Concatène tous les éléments du tableau de paramètres de droite, séparés par la chaîne de paramètre de gauche.
- Paramètres minimaux : 2. Paramètres maximum : 2.
- Chaque élément du tableau est converti en chaîne. Les objets complexes sont convertis en chaîne vide.
- Si le paramètre de droite n’est pas un tableau, le résultat est le paramètre de droite converti en chaîne.
Dans cet exemple, un point-virgule est ajouté entre chaque élément du tableau. Le type de paramètre est un objet.
parameters:
- name: myArray
type: object
default:
- FOO
- BAR
- ZOO
variables:
A: ${{ join(';',parameters.myArray) }}
steps:
- script: echo $A # outputs FOO;BAR;ZOO
le
- Évalue à
Truesi le paramètre de gauche est inférieur ou égal au paramètre de droite - Paramètres minimaux : 2. Paramètres maximum : 2.
- Convertit le paramètre droit pour correspondre au type de paramètre de gauche. Erreurs si la conversion échoue.
- Comparaison ordinale insensible à la casse pour les chaînes de caractères.
- Exemple :
le(2, 2)(retourne True)
longueur
- Retourne la longueur d’une chaîne ou d’un tableau, qui provient du système ou qui provient d’un paramètre
- Paramètres minimaux : 1. Paramètres maximum : 1.
- Exemple :
length('fabrikam')retourne 8.
baisser
- Convertit une valeur de chaîne ou de variable en caractères minuscules.
- Paramètres minimaux : 1. Paramètres maximum : 1.
- Retourne l’équivalent minuscule d’une chaîne de caractères.
- Exemple :
lower('FOO')renvoiefoo.
Lt
-
TrueÉvalue si le paramètre gauche est inférieur au paramètre de droite. - Paramètres minimaux : 2. Paramètres maximum : 2.
- Convertit le paramètre droit pour correspondre au type de paramètre de gauche. Erreurs si la conversion échoue.
- Comparaison ordinale insensible à la casse pour les chaînes de caractères.
- Exemple :
lt(2, 5)(retourne True)
NE
- Évalue
Truesi les paramètres ne sont pas égaux - Paramètres minimaux : 2. Paramètres maximum : 2.
- Convertit le paramètre droit pour correspondre au type de paramètre de gauche. Retourne
Truesi la conversion échoue. - Comparaison ordinale insensible à la casse pour les chaînes de caractères.
- Exemple :
ne(1, 2)renvoieTrue.
pas
- Évalue
Truesi le paramètre estFalse - Paramètres min. : 1. Paramètres max. : 1
- Convertit la valeur en booléen pour l’évaluation
- Exemple :
not(eq(1, 2))(retourne True)
notIn
- Évalue
Truesi le paramètre de gauche n’est pas égal à un paramètre de droite - Paramètres min. : 1. Paramètres max. : N
- Convertit les paramètres de droite pour qu’ils correspondent au type de paramètre de gauche. La comparaison d’égalité évalue
Falsesi la conversion échoue. - Comparaison ordinale insensible à la casse pour les chaînes de caractères.
- Court-circuite après la première correspondance
- Exemple :
notIn('D', 'A', 'B', 'C')(retourne True)
ou
- Évalue à
Truesi un paramètre estTrue - Paramètres minimaux : 2. Paramètres maximum : N.
- Convertit les paramètres en booléen pour l’évaluation.
- Court-circuite après le premier
True - Exemple :
or(eq(1, 1), eq(2, 3))(retourne True, court-circuite)
remplacer
- Retourne une nouvelle chaîne dans laquelle toutes les instances d’une chaîne de l’instance actuelle sont remplacées par une autre chaîne.
- Paramètres minimaux : 3. Paramètres maximum : 3.
-
replace(a, b, c): retournea, avec toutes les instances remplacéesbparc. - Exemple :
replace('https://www.tinfoilsecurity.com/saml/consume','https://www.tinfoilsecurity.com','http://server')(renvoiehttp://server/saml/consume).
fractionner
- Fractionne une chaîne en sous-chaînes en fonction des caractères de délimitation spécifiés.
- Paramètres minimaux : 2. Paramètres maximum : 2.
- Le premier paramètre est la chaîne à fractionner.
- Le deuxième paramètre est les caractères de limitation.
- Retourne un tableau de sous-chaînes. Le tableau inclut des chaînes vides lorsque les caractères de délimitation apparaissent consécutivement ou à la fin de la chaîne.
- Exemple :
variables: - name: environments value: prod1,prod2 steps: - ${{ each env in split(variables.environments, ',')}}: - script: ./deploy.sh --environment ${{ env }} - Exemple d'utilisation de split() avec replace() :
parameters: - name: resourceIds type: object default: - /subscriptions/mysubscription/resourceGroups/myResourceGroup/providers/Microsoft.Network/loadBalancers/kubernetes-internal - /subscriptions/mysubscription02/resourceGroups/myResourceGroup02/providers/Microsoft.Network/loadBalancers/kubernetes - name: environments type: object default: - prod1 - prod2 trigger: - main steps: - ${{ each env in parameters.environments }}: - ${{ each resourceId in parameters.resourceIds }}: - script: echo ${{ replace(split(resourceId, '/')[8], '-', '_') }}_${{ env }}
commencePar
- Évalue à
Truesi la chaîne de paramètre de gauche commence par le paramètre de droite - Paramètres minimaux : 2. Paramètres maximum : 2.
- Convertit les paramètres en chaîne de caractères pour l’évaluation.
- Effectue une comparaison ordinale ignore-case.
- Exemple :
startsWith('ABCDE', 'AB')(retourne True).
couper
- Retourne le paramètre sans espaces blancs de début et de fin
- Paramètres min. : 1. Paramètres max. : 1
- Exemple :
trim(' variable ')retourne « variable »
supérieur
- Convertit une valeur de chaîne ou de variable en caractères majuscules
- Paramètres minimaux : 1. Paramètres maximum : 1.
- Retourne l’équivalent majuscule d’une chaîne
- Exemple :
upper('bah')retourneBAH.
Xor
- Évalue
Truesi exactement un paramètre estTrue - Paramètres minimaux : 2. Paramètres maximum : 2.
- Convertit les paramètres en booléen pour l’évaluation.
- Exemple :
xor(True, False)(retourne True)
Fonctions de vérification de l’état du travail
Utilisez les fonctions de vérification d’état suivantes comme expressions dans des conditions, mais pas dans les définitions de variables.
toujours
- Évalue toujours à
True(même en cas d’annulation). Remarque : une défaillance critique peut toujours empêcher l’exécution d’une tâche. Par exemple, si l’obtention des sources a échoué.
annulé
- Évalue à
Truesi le pipeline est annulé.
a échoué
- Pour une étape, équivalent à
eq(variables['Agent.JobStatus'], 'Failed'). - Pour un projet :
- Sans argument, évalue
Truesi un travail précédent dans le graphique de dépendances a échoué. - Avec les noms de travaux en tant qu'arguments, évalue à
Truesi l'un de ces travaux a échoué.
- Sans argument, évalue
Réussi
- Pour une étape, équivalent à
in(variables['Agent.JobStatus'], 'Succeeded', 'SucceededWithIssues'). - Utilisez
dependsOnlorsque vous travaillez avec des tâches pour vérifier si une tâche précédente a réussi. Les travaux s’exécutent en parallèle, tandis que les étapes s’exécutent de manière séquentielle. - Pour un projet :
- Sans argument, évalue
Truesi tous les travaux précédents dans le graphique de dépendances ont réussi ou partiellement réussi. - Avec des noms de travaux en tant qu’arguments, évalue à
Truesi tous ces travaux ont réussi ou partiellement réussi. - Évalue à
Falsesi le pipeline est annulé.
- Sans argument, évalue
réussiOu Échoué
Pour une étape, équivalent à
in(variables['Agent.JobStatus'], 'Succeeded', 'SucceededWithIssues', 'Failed').Pour un travail :
- Sans arguments, évalue à
Trueindépendamment du fait que les travaux dans le graphe des dépendances ont réussi ou échoué. - Avec des noms de travaux en tant qu’arguments, évalue à
Truesi l’un de ces travaux a réussi ou échoué. - Vous souhaiterez peut-être utiliser
not(canceled())à la place lorsque les travaux précédents dans le graphique de dépendances sont ignorés.
Cette fonction est semblable
always(), sauf qu’elle prend laFalsevaleur lorsque le pipeline est annulé.- Sans arguments, évalue à
Insertion conditionnelle
Utilisez if, elseifet else les clauses pour affecter conditionnellement des valeurs de variable ou définir des entrées pour les tâches. Vous pouvez également exécuter une étape de manière conditionnelle lorsqu’une condition est remplie.
Les conditions fonctionnent uniquement lorsque vous utilisez la syntaxe du modèle. Pour plus d’informations, consultez la syntaxe des variables.
Pour les modèles, vous pouvez utiliser l’insertion conditionnelle lors de l’ajout d’une séquence ou d’un mappage. Pour plus d’informations, consultez l’insertion conditionnelle dans les modèles.
Affecter une variable de manière conditionnelle
variables:
${{ if eq(variables['Build.SourceBranchName'], 'main') }}: # only works if you have a main branch
stageName: prod
pool:
vmImage: 'ubuntu-latest'
steps:
- script: echo ${{variables.stageName}}
Définir de manière conditionnelle une entrée de tâche
pool:
vmImage: 'ubuntu-latest'
steps:
- task: PublishPipelineArtifact@1
inputs:
targetPath: '$(Pipeline.Workspace)'
${{ if eq(variables['Build.SourceBranchName'], 'main') }}:
artifact: 'prod'
${{ else }}:
artifact: 'dev'
publishLocation: 'pipeline'
Exécuter une étape de manière conditionnelle
Si aucune variable n’est définie ou si la valeur de foo ne correspond pas aux conditions if, l’instruction else s’exécute. Dans cet exemple, la valeur de foo retourne true dans la elseif condition.
variables:
- name: foo
value: contoso # triggers elseif condition
pool:
vmImage: 'ubuntu-latest'
steps:
- script: echo "start"
- ${{ if eq(variables.foo, 'adaptum') }}:
- script: echo "this is adaptum"
- ${{ elseif eq(variables.foo, 'contoso') }}: # true
- script: echo "this is contoso"
- ${{ else }}:
- script: echo "the value is not adaptum or contoso"
Chaque mot clé
Utilisez le each mot clé pour parcourir les paramètres avec le type d’objet.
parameters:
- name: listOfStrings
type: object
default:
- one
- two
steps:
- ${{ each value in parameters.listOfStrings }}:
- script: echo ${{ value }}
Vous pouvez également effectuer une itération via des éléments imbriqués au sein d’un objet.
parameters:
- name: listOfFruits
type: object
default:
- fruitName: 'apple'
colors: ['red','green']
- fruitName: 'lemon'
colors: ['yellow']
steps:
- ${{ each fruit in parameters.listOfFruits }} :
- ${{ each fruitColor in fruit.colors}} :
- script: echo ${{ fruit.fruitName}} ${{ fruitColor }}
Les dépendances
Les expressions peuvent utiliser le contexte des dépendances pour référencer des travaux ou des phases précédents. Utilisez des dépendances pour :
- Consulter l'état d'une tâche précédente
- Référencer l’état de phase d’une phase précédente
- Référencer des variables de sortie dans le travail précédent dans la même phase
- Référencer les variables de sortie à la phase précédente d’une phase
- Référencer des variables de sortie dans un travail à une phase précédente de la phase suivante
Le contexte est appelé dependencies pour les travaux et les phases et fonctionne comme les variables.
Si vous faites référence à une variable de production d'un projet dans une autre étape, le contexte est appelé stageDependencies.
Si vous rencontrez des problèmes avec les variables de sortie ayant des caractères de guillemets (' ou ") dans ces variables, consultez ce guide de résolution des problèmes.
Vue d'ensemble de la syntaxe des dépendances
La syntaxe du référencement des variables de production avec dépendances varie en fonction des circonstances. Voici une vue d'ensemble des scénarios les plus courants. Il peut parfois arriver que la syntaxe alternative fonctionne également.
Type
Description
dépendance étape à étape (différentes étapes)
Référencez une variable de production d'une étape précédente dans un projet dans une autre étape dans une condition dans stages.
- Syntaxe :
and(succeeded(), eq(stageDependencies.<stage-name>.outputs['<job-name>.<step-name>.<variable-name>'], 'true')) - Exemple :
and(succeeded(), eq(stageDependencies.A.outputs['A1.printvar.shouldrun'], 'true'))
Dépendance de tâche à tâche (même étape)
Référencez une variable de production dans un projet différent dans la même étape dans stages.
- Syntaxe :
and(succeeded(), eq(dependencies.<job-name>.outputs['<step-name>.<variable-name>'], 'true')) - Exemple :
and(succeeded(), eq(dependencies.A.outputs['printvar.shouldrun'], 'true'))
Dépendance entre tâches (différentes étapes)
Référencez une variable de production dans une étape différente dans un job.
- Syntaxe :
eq(stageDependencies.<stage-name>.<job-name>.outputs['<step-name>.<variable-name>'], 'true') - Exemple :
eq(stageDependencies.A.A1.outputs['printvar.shouldrun'], 'true')
Dépendance étape à étape (travail de déploiement)
Référencez une variable de production dans un projet de déploiement dans une autre étape dans stages.
- Syntaxe :
eq(dependencies.<stage-name>.outputs['<deployment-job-name>.<deployment-job-name>.<step-name>.<variable-name>'], 'true') - Exemple :
eq(dependencies.build.outputs['build_job.build_job.setRunTests.runTests'], 'true')
Dépendance d'étape à étape (tâche de déploiement avec ressource).
Référencez une variable de production dans un projet de déploiement qui inclut une ressource dans une étape différente dans stages.
- Syntaxe :
eq(dependencies.<stage-name>.outputs['<deployment-job-name>.<Deploy_resource-name>.<step-name>.<variable-name>'], 'true') - Exemple :
eq(dependencies.build.outputs['build_job.Deploy_winVM.setRunTests.runTests'], 'true')
La syntaxe des variables de sortie dans les travaux de déploiement varie en fonction de la stratégie de déploiement. Pour en savoir plus, consultez Projets de déploiement.
Dépendances phase à phase
Structurellement, l'objet dependencies est un mappage des noms de tâches et de phases vers results et outputs.
Exprimé en tant que JSON, il ressemble à ceci :
"dependencies": {
"<STAGE_NAME>" : {
"result": "Succeeded|SucceededWithIssues|Skipped|Failed|Canceled",
"outputs": {
"jobName.stepName.variableName": "value"
}
},
"...": {
// another stage
}
}
Remarque
Les exemples suivants utilisent une syntaxe de pipeline standard. Si vous utilisez des pipelines de déploiement, la syntaxe des variables et des variables conditionnelles diffère. Pour plus d’informations sur la syntaxe spécifique à utiliser, consultez Travaux de déploiement.
Utilisez cette forme de dependencies pour mapper des variables ou vérifier des conditions à un niveau d'étape.
Dans cet exemple, deux étapes existent, A et B. L’étape A a la condition false et ne s’exécute pas. L'étape B s'exécute si le résultat de l'étape A est Succeeded, SucceededWithIssues ou Skipped. La phase B s’exécute parce que la phase A a été ignorée.
stages:
- stage: A
condition: false
jobs:
- job: A1
steps:
- script: echo Job A1
- stage: B
condition: in(dependencies.A.result, 'Succeeded', 'SucceededWithIssues', 'Skipped')
jobs:
- job: B1
steps:
- script: echo Job B1
Les phases peuvent également utiliser des variables de sortie d’une autre phase.
Dans cet exemple, deux étapes existent. L'étape A inclut un projet, A1, qui définit une variable de production shouldrun sur true. L'étape B s'exécute quand shouldrun est true. Comme shouldrun est true, l'étape B s'exécute.
stages:
- stage: A
jobs:
- job: A1
steps:
- bash: echo "##vso[task.setvariable variable=shouldrun;isOutput=true]true"
# or on Windows:
# - script: echo ##vso[task.setvariable variable=shouldrun;isOutput=true]true
name: printvar
- stage: B
condition: and(succeeded(), eq(dependencies.A.outputs['A1.printvar.shouldrun'], 'true'))
dependsOn: A
jobs:
- job: B1
steps:
- script: echo hello from Stage B
Remarque
Par défaut, chaque index d’un pipeline dépend de celui qui se trouve juste avant lui dans le fichier YAML.
Si vous devez faire référence à une phase qui n’est pas immédiatement antérieure à la phase actuelle, vous pouvez remplacer cette phase automatique par défaut en ajoutant une section dependsOn à la phase.
Dépendances entre tâches au sein d'une étape
Au niveau du travail au sein d’une seule phase, les données dependencies ne contiennent pas d’informations au niveau de la phase.
"dependencies": {
"<JOB_NAME>": {
"result": "Succeeded|SucceededWithIssues|Skipped|Failed|Canceled",
"outputs": {
"stepName.variableName": "value1"
}
},
"...": {
// another job
}
}
Dans cet exemple, il existe trois emplois (a, b et c). Job a est toujours ignoré en raison de condition: false.
La tâche b s’exécute, car elle n’a aucune condition associée.
Le projet c s'exécute, car toutes ses dépendances réussissent (projet b) ou sont ignorées (projet a).
jobs:
- job: a
condition: false
steps:
- script: echo Job a
- job: b
steps:
- script: echo Job b
- job: c
dependsOn:
- a
- b
condition: |
and
(
in(dependencies.a.result, 'Succeeded', 'SucceededWithIssues', 'Skipped'),
in(dependencies.b.result, 'Succeeded', 'SucceededWithIssues', 'Skipped')
)
steps:
- script: echo Job c
Dans cet exemple, le travail B dépend d’une variable de sortie du travail A.
jobs:
- job: A
steps:
- bash: echo "##vso[task.setvariable variable=shouldrun;isOutput=true]true"
# or on Windows:
# - script: echo ##vso[task.setvariable variable=shouldrun;isOutput=true]true
name: printvar
- job: B
condition: and(succeeded(), eq(dependencies.A.outputs['printvar.shouldrun'], 'true'))
dependsOn: A
steps:
- script: echo hello from B
Dépendances d'une tâche à une autre entre les différentes étapes
Au niveau de la tâche, vous pouvez également référencer les résultats d'une tâche d'une étape précédente.
Cela nécessite l’utilisation du contexte stageDependencies.
"stageDependencies": {
"<STAGE_NAME>" : {
"<JOB_NAME>": {
"result": "Succeeded|SucceededWithIssues|Skipped|Failed|Canceled",
"outputs": {
"stepName.variableName": "value"
}
},
"...": {
// another job
}
},
"...": {
// another stage
}
}
Dans cet exemple, la tâche B1 s’exécute si la tâche A1 est ignorée. Le travail B2 vérifie la valeur de la variable de sortie du travail A1 pour déterminer s'il doit s’exécuter.
stages:
- stage: A
jobs:
- job: A1
steps:
- bash: echo "##vso[task.setvariable variable=shouldrun;isOutput=true]true"
# or on Windows:
# - script: echo ##vso[task.setvariable variable=shouldrun;isOutput=true]true
name: printvar
- stage: B
dependsOn: A
jobs:
- job: B1
condition: in(stageDependencies.A.A1.result, 'Skipped') # change condition to `Succeeded and stage will be skipped`
steps:
- script: echo hello from Job B1
- job: B2
condition: eq(stageDependencies.A.A1.outputs['printvar.shouldrun'], 'true')
steps:
- script: echo hello from Job B2
Si un travail dépend d’une variable définie par un travail de déploiement à une phase différente, la syntaxe est différente. Dans l’exemple suivant, le travail run_tests s’exécute si le travail de déploiement build_job a défini runTests sur true. Notez que la clé utilisée pour le dictionnaire outputs est build_job.setRunTests.runTests.
stages:
- stage: build
jobs:
- deployment: build_job
environment:
name: Production
strategy:
runOnce:
deploy:
steps:
- task: PowerShell@2
name: setRunTests
inputs:
targetType: inline
pwsh: true
script: |
$runTests = "true"
echo "setting runTests: $runTests"
echo "##vso[task.setvariable variable=runTests;isOutput=true]$runTests"
- stage: test
dependsOn:
- 'build'
jobs:
- job: run_tests
condition: eq(stageDependencies.build.build_job.outputs['build_job.setRunTests.runTests'], 'true')
steps:
...
Variables de production de projet de déploiement
Si une phase dépend d’une variable définie par un travail de déploiement dans une autre phase, la syntaxe est différente. Dans l'exemple suivant, la phase test dépend de la configuration de déploiement build_job, qui règle shouldTest sur true. Notez que dans le condition de la phase test, build_job apparaît deux fois.
stages:
- stage: build
jobs:
- deployment: build_job
environment:
name: Production
strategy:
runOnce:
deploy:
steps:
- task: PowerShell@2
name: setRunTests
inputs:
targetType: inline
pwsh: true
script: |
$runTests = "true"
echo "setting runTests: $runTests"
echo "##vso[task.setvariable variable=runTests;isOutput=true]$runTests"
- stage: test
dependsOn:
- 'build'
condition: eq(dependencies.build.outputs['build_job.build_job.setRunTests.runTests'], 'true')
jobs:
- job: A
steps:
- script: echo Hello from job A
Dans l’exemple ci-dessus, la condition fait référence à un environnement et non à une ressource d’environnement. Pour référencer une ressource d’environnement, vous devez ajouter le nom de la ressource d’environnement à la condition de dépendances. Dans l’exemple suivant, la condition fait référence à une ressource de machine virtuelle d’environnement nommée vmtest.
stages:
- stage: build
jobs:
- deployment: build_job
environment:
name: vmtest
resourceName: winVM2
resourceType: VirtualMachine
strategy:
runOnce:
deploy:
steps:
- task: PowerShell@2
name: setRunTests
inputs:
targetType: inline
pwsh: true
script: |
$runTests = "true"
echo "setting runTests: $runTests"
echo "##vso[task.setvariable variable=runTests;isOutput=true]$runTests"
- stage: test
dependsOn:
- 'build'
condition: eq(dependencies.build.outputs['build_job.Deploy_winVM2.setRunTests.runTests'], 'true')
jobs:
- job: A
steps:
- script: echo Hello from job A
Tableaux filtrés
Lorsque vous utilisez une collection d’éléments, utilisez la * syntaxe pour appliquer un tableau filtré. Un tableau filtré retourne tous les objets ou éléments, quel que soit leur nom.
Par exemple, considérez un tableau d’objets nommé foo. Vous souhaitez obtenir un tableau des valeurs de la id propriété dans chaque objet de votre tableau.
[
{ "id": 1, "a": "avalue1"},
{ "id": 2, "a": "avalue2"},
{ "id": 3, "a": "avalue3"}
]
Utilisez l’expression suivante :
foo.*.id
Cette expression indique au système de traiter foo comme un tableau filtré, puis de sélectionner la id propriété à partir de chaque objet.
Cette expression retourne :
[ 1, 2, 3 ]
Cast de type
Les valeurs d’une expression peuvent être converties d’un type à un autre à mesure que l’expression est évaluée. Lorsque vous évaluez une expression, le processus convertit les paramètres en type de données approprié, puis les transforme en chaînes.
Par exemple, dans ce YAML, les valeurs True et False se transforment en 1 et 0 lorsque l’expression est évaluée.
La fonction lt() retourne True lorsque le paramètre de gauche est inférieur au paramètre de droite.
variables:
firstEval: $[lt(False, True)] # 0 vs. 1, True
secondEval: $[lt(True, False)] # 1 vs. 0, False
steps:
- script: echo $(firstEval)
- script: echo $(secondEval)
Lorsque vous utilisez l’expression pour évaluer l’équivalence eq() , les valeurs sont implicitement converties en nombres (false en 0 et true en 1).
variables:
trueAsNumber: $[eq('true', true)] # 1 vs. 1, True
falseAsNumber: $[eq('false', true)] # 0 vs. 1, False
steps:
- script: echo $(trueAsNumber)
- script: echo $(falseAsNumber)
Dans cet exemple suivant, les valeurs variables.emptyString et la chaîne vide sont toutes deux évaluées en tant que chaînes vides.
La fonction coalesce() évalue les paramètres dans l’ordre et retourne la première valeur qui n’est pas null ou une chaîne vide.
variables:
coalesceLiteral: $[coalesce(variables.emptyString, '', 'literal value')]
steps:
- script: echo $(coalesceLiteral) # outputs literal value
Les règles de conversion détaillées sont répertoriées ci-dessous.
| De / À | Booléen | Zéro | Nombre | Chaîne | Version |
|---|---|---|---|---|---|
| Booléen | - | - | Oui | Oui | - |
| Zéro | Oui | - | Oui | Oui | - |
| Nombre | Oui | - | - | Oui | Partiel |
| Chaîne | Oui | Partiel | Partiel | - | Partiel |
| Version | Oui | - | - | Oui | - |
Booléen
Numéro de destination :
-
False→0 -
True→1
En chaîne :
-
False→'False' -
True→'True'
Zéro
- En booléen :
False - Numéro de destination :
0 - En chaîne :
''(chaîne vide)
Nombre
- En booléen :
0→False, tout autre nombre →True - Version de destination : doit être supérieur à zéro et doit contenir une décimale différente de zéro. Doit être inférieur à Int32.MaxValue (composant décimal également).
- En chaîne : convertit le nombre en chaîne sans séparateur de milliers ni séparateur décimal.
Chaîne
- En booléen :
''(chaîne vide) →False, toute autre chaîne →True - En valeur null :
''(chaîne vide) →Null, toute autre chaîne non convertible - En nombre :
''(la chaîne vide) → 0, sinon, exécuteInt32.TryParsede C# avec InvariantCulture et les règles suivantes : AllowDecimalPoint | AllowLeadingSign | AllowLeadingWhite | AllowThousands | AllowTrailingWhite. SiTryParseéchoue, il n’est pas convertible. - En version : exécute
Version.TryParsede C#. Doit contenir au minimum des composants majeurs et mineurs. SiTryParseéchoue, il n’est pas convertible.
Version
- En booléen :
True - En chaîne : Major.Minor ou Major.Minor.Build ou Major.Minor.Build.Revision.
Questions fréquentes (FAQ)
Je veux réaliser une action que les expressions ne prennent pas en charge. Quelles sont les options dont je dispose pour étendre la fonctionnalité des pipelines ?
Vous pouvez personnaliser votre pipeline à l’aide d’un script qui inclut une expression. Par exemple, cet extrait de code prend la variable BUILD_BUILDNUMBER et la fractionne en utilisant Bash. Ce script génère deux nouvelles variables, $MAJOR_RUN et $MINOR_RUN, pour les numéros d’exécution majeurs et mineurs.
Les deux variables sont ensuite utilisées pour créer deux variables de pipeline et $major$minor à l’aide de task.setvariable. Ces variables sont disponibles pour les étapes en aval. Pour partager des variables entre pipelines, consultez Groupes de variables.
steps:
- bash: |
MAJOR_RUN=$(echo $BUILD_BUILDNUMBER | cut -d '.' -f1)
echo "This is the major run number: $MAJOR_RUN"
echo "##vso[task.setvariable variable=major]$MAJOR_RUN"
MINOR_RUN=$(echo $BUILD_BUILDNUMBER | cut -d '.' -f2)
echo "This is the minor run number: $MINOR_RUN"
echo "##vso[task.setvariable variable=minor]$MINOR_RUN"
- bash: echo "My pipeline variable for major run is $(major)"
- bash: echo "My pipeline variable for minor run is $(minor)"