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.

Capture d’écran de la sortie de la variable Bash.

Niveaux des variables de sortie

Il existe quatre types de variables de sortie différents avec des syntaxes distinctes :

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)"