Définir des variables dans des scripts
Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2019
Lorsque vous utilisez des scripts PowerShell et Bash dans vos pipelines, il est souvent utile de définir des variables, que vous pouvez utiliser dans des futures tâches. Les variables nouvellement définies ne sont pas disponibles dans la même tâche.
Les scripts sont parfaits lorsque vous souhaitez effectuer une action non prise en charge par une tâche, comme appeler une API REST personnalisée et analyser la réponse.
Vous allez utiliser la commande de journalisation task.setvariable
pour définir des variables dans des scripts PowerShell et Bash.
Notes
Les travaux de déploiement utilisent une syntaxe différente pour les variables de sortie. Pour en savoir plus sur la prise en charge des variables de sortie dans les travaux de déploiement, consultez Travaux de déploiement.
Pour utiliser une variable avec une condition dans un pipeline, consultez Spécifier des conditions.
À propos de task.setvariable
Lorsque vous ajoutez une variable avec task.setvariable
, les tâches suivantes peuvent utiliser la variable à l’aide de la syntaxe macro $(myVar)
. La variable est disponible uniquement pour les tâches du même travail, par défaut. Si vous ajoutez le paramètre isoutput
, la syntaxe permettant d’appeler votre variable change. Consultez Définir une variable de sortie à utiliser dans le même travail.
Définissez la variable myVar
avec la valeur foo
.
- bash: |
echo "##vso[task.setvariable variable=myVar;]foo"
Lisez la variable myVar
:
- bash: |
echo "You can use macro syntax for variables: $(myVar)"
Définir les propriétés de la variable
La commande task.setvariable
inclut des propriétés pour définir une variable en tant que secret, en tant que variable de sortie et en lecture seule. Les propriétés disponibles sont les suivantes :
variable
= nom de la variable (obligatoire)issecret
= booléen (facultatif, la valeur par défaut est false)isoutput
= booléen (facultatif, la valeur par défaut est false)isreadonly
= booléen (facultatif, la valeur par défaut est false)
Pour utiliser la variable dans l’index suivant, définissez la propriété isoutput
sur true
. Pour référencer une variable avec la valeur isoutput
définie sur true, incluez le nom de la tâche. Par exemple : $(TaskName.myVar)
.
Lorsque vous définissez une variable en lecture seule, elle ne peut pas être remplacée par des tâches en aval. Définissez isreadonly
sur true
. La définition d’une variable en lecture seule améliore la sécurité ; en effet, cette variable devient immuable.
Définir une variable en tant que secret
Lorsque la valeur de issecret
est définie sur true, la valeur de la variable est enregistrée comme secret et masquée dans des journaux.
Remarque
Azure Pipelines fait un effort pour masquer des secrets lors de l’émission de données dans des journaux de pipeline. Vous pouvez donc voir des variables supplémentaires et des données masquées dans des sorties et des journaux qui ne sont pas définis en tant que secrets.
Définissez la variable secrète mySecretVal
.
- bash: |
echo "##vso[task.setvariable variable=mySecretVal;issecret=true]secretvalue"
Obtenez la variable secrète mySecretVal
.
- bash: |
echo "##vso[task.setvariable variable=mySecretVal;issecret=true]secretvalue"
- bash: |
echo $(mySecretVal)
Sortie de variable secrète dans Bash.
Niveaux des variables de sortie
Il existe quatre types de variables de sortie différents avec des syntaxes distinctes :
- Variables de sortie définies dans le même travail sans le paramètre
isoutput
. Pour référencer ces variables, utilisez la syntaxe macro. Exemple :$(myVar)
. - Variables de sortie définies dans le même travail avec le paramètre
isoutput
. Pour référencer ces variables, incluez le nom de la tâche. Exemple :$(myTask.myVar)
. - Variables de sortie définies dans un futur travail. Pour référencer ces variables, référencez la variable dans la section
variables
avec la syntaxedependency
. - Variables de sortie définies dans des futurs index. Pour référencer ces variables, référencez la variable dans la section
variables
avec la syntaxestageDependencies
.
Remarque
Les étapes ou travaux ultérieurs ne peuvent accéder aux variables de sortie que s'ils dépendent de l'étape ou du travail où la variable a été définie. Pour rendre une variable d'édition accessible, assurez-vous que l'étape ou la tâche suivante dépend de l'étape ou de la tâche où vous avez créé la variable. Si plusieurs étapes ou travaux doivent utiliser la même variable de sortie, utilisez la condition dependsOn
pour établir cette dépendance.
Définir une variable de sortie à utiliser dans le même travail
Lorsque vous utilisez une variable de sortie dans le même travail, vous n’avez pas besoin d’utiliser la propriété isoutput
. Par défaut, la variable est disponible pour les étapes en aval dans le même travail. Toutefois, si vous ajoutez la propriété isoutput
, vous devez référencer la variable avec le nom de la tâche.
Le script définit ici la variable de sortie myJobVar
du même travail sans spécifier isoutput
et définit myOutputJobVar
avec isoutput=true
.
jobs:
- job: A
steps:
- bash: |
echo "##vso[task.setvariable variable=myJobVar]this is the same job"
- bash: |
echo "##vso[task.setvariable variable=myOutputJobVar;isoutput=true]this is the same job too"
name: setOutput
Ce script obtient les variables myJobVar
du même travail et myOutputJobVar
. Notez que la syntaxe change pour référencer une variable de sortie lors de l’ajout de isoutput=true
.
jobs:
- job: A
steps:
- bash: |
echo "##vso[task.setvariable variable=myJobVar]this is the same job"
- bash: |
echo "##vso[task.setvariable variable=myOutputJobVar;isoutput=true]this is the same job too"
name: setOutput
- bash: |
echo $(myJobVar)
- bash: |
echo $(setOutput.myOutputJobVar)
Définir une variable de sortie à utiliser dans des futurs travaux
Lorsque vous utilisez des variables de sortie entre les travaux, référencerez-les avec dependencies
. La syntaxe permettant d’accéder à une variable de sortie dans un futur travail ou index varie en fonction de la relation entre le setter et le consommateur de la variable. Découvrez chaque cas dans des dépendances.
Tout d’abord, définissez la variable de sortie myOutputVar
.
jobs:
- job: A
steps:
- bash: |
echo "##vso[task.setvariable variable=myOutputVar;isoutput=true]this is from job A"
name: passOutput
Ensuite, accédez à myOutputVar
dans un futur travail et générez la variable en tant que myVarFromJobA
. Pour utiliser dependencies
, vous devez définir la propriété dependsOn
pour le futur travail à l’aide du nom du travail passé dans lequel la variable de sortie a été définie.
jobs:
- job: A
steps:
- bash: |
echo "##vso[task.setvariable variable=myOutputVar;isoutput=true]this is from job A"
name: passOutput
- job: B
dependsOn: A
variables:
myVarFromJobA: $[ dependencies.A.outputs['passOutput.myOutputVar'] ]
steps:
- bash: |
echo $(myVarFromJobA)
Définir une variable de sortie à utiliser dans des futurs index
Les variables de sortie peuvent être utilisées à travers les index des pipelines. Vous pouvez utiliser des variables de sortie pour transmettre des informations utiles, telles que l’ID d’une sortie générée, d’un index à l’autre.
Lorsque vous définissez une variable avec la propriété isoutput
, vous pouvez référencer cette variable dans des index ultérieurs à l’aide du nom de la tâche et de la syntaxe stageDependencies
. Découvrez-en plus sur les dépendances.
Les variables de sortie sont disponibles uniquement dans l’index en aval suivant. Si plusieurs index consomment la même variable de sortie, utilisez la condition dependsOn
.
Tout d’abord, définissez la variable de sortie myStageVal
.
steps:
- bash: echo "##vso[task.setvariable variable=myStageVal;isOutput=true]this is a stage output variable"
name: MyOutputVar
Ensuite, dans un futur index, mappez la variable de sortie myStageVal
à une variable d’index, de travail ou de tâche, par exemple, myStageAVar
. Notez que la syntaxe de mappage utilise une expression de runtime $[]
et trace le chemin d’accès depuis stageDependencies
à la variable de sortie à l’aide du nom d’index (A
) et du nom du travail (A1
) pour qualifier entièrement la variable.
stages:
- stage: A
jobs:
- job: A1
steps:
- bash: echo "##vso[task.setvariable variable=myStageVal;isOutput=true]this is a stage output variable"
name: MyOutputVar
- stage: B
dependsOn: A
jobs:
- job: B1
variables:
myStageAVar: $[stageDependencies.A.A1.outputs['MyOutputVar.myStageVal']]
steps:
- bash: echo $(myStageAVar)
Si votre valeur contient des lignes nouvelles, vous pouvez assurer leur échappement et l’agent annule automatiquement leur échappement :
steps:
- bash: |
escape_data() {
local data=$1
data="${data//'%'/'%AZP25'}"
data="${data//$'\n'/'%0A'}"
data="${data//$'\r'/'%0D'}"
echo "$data"
}
echo "##vso[task.setvariable variable=myStageVal;isOutput=true]$(escape_data $'foo\nbar')"
name: MyOutputVar
Questions fréquentes (FAQ)
Ma variable de sortie n’est pas rendue. Que se passe-t-il ?
Plusieurs raisons peuvent expliquer le fait que votre variable de sortie n’apparaît pas.
- Les variables de sortie définies avec
isoutput
ne sont pas disponibles dans le même travail et sont uniquement disponibles dans les travaux en aval. - Selon la syntaxe de variable que vous utilisez, une variable qui définit la valeur d’une variable de sortie peut ne pas être disponible au moment du runtime. Par exemple, les variables présentant la syntaxe macro (
$(var)
) sont traitées avant l’exécution d’une tâche. En revanche, les variables présentant la syntaxe de modèle sont traitées au moment du runtime ($[variables.var]
). En règle générale, il est souhaitable d’utiliser la syntaxe de runtime lors de la définition de variables de sortie. Pour plus d’informations sur la syntaxe des variables, consultez Définir des variables. - Il peut y avoir des espaces supplémentaires dans votre expression. Si votre variable n’est pas rendue, vérifiez s’il y a des espaces supplémentaires autour de
isOutput=true
.
Vous pouvez résoudre le problème de la sortie dependencies
pour un travail ou une étape du pipeline en ajoutant une variable pour les dépendances, puis en imprimant cette variable. Par exemple, dans ce pipeline, le travail A
définit la variable de sortie MyTask
. Le deuxième travail (B
) dépend du travail A
. Une nouvelle variable, deps
, contient la représentation JSON des dépendances du travail. La deuxième étape du travail B
utilise PowerShell pour imprimer deps
afin que vous puissiez voir les dépendances du travail.
trigger:
- '*'
pool:
vmImage: 'ubuntu-latest'
jobs:
- job: A
steps:
- script: |
echo "##vso[task.setvariable variable=MyTask;isOutput=true]theoutputval"
name: ProduceVar
- job: B
dependsOn: A
variables:
varFromA: $[ dependencies.A.outputs['ProduceVar.MyTask'] ]
deps: $[convertToJson(dependencies)] # create a variable with the job dependencies
steps:
- script: echo $(varFromA) #
- powershell: Write-Host "$(deps)"