Ange variabler i skript

Azure DevOps Services | Azure DevOps Server 2022 – Azure DevOps Server 2019

När du använder PowerShell- och Bash-skript i dina pipelines är det ofta användbart att kunna ange variabler som du sedan kan använda i framtida uppgifter. Nyligen angivna variabler är inte tillgängliga i samma uppgift.

Skript är bra för när du vill göra något som inte stöds av en uppgift som att anropa ett anpassat REST-API och parsa svaret.

Du använder task.setvariable loggningskommandot för att ange variabler i PowerShell - och Bash-skript .

Kommentar

Distributionsjobb använder en annan syntax för utdatavariabler. Mer information om stöd för utdatavariabler i distributionsjobb finns i Distributionsjobb.

Information om hur du använder en variabel med ett villkor i en pipeline finns i Ange villkor.

Om task.setvariable

När du lägger till en variabel med task.setvariablekan följande uppgifter använda variabeln med hjälp av makrosyntaxen $(myVar). Variabeln är endast tillgänglig för aktiviteter i samma jobb som standard. Om du lägger till parametern isoutput, syntaxen för att anropa dina variabeländringar. Se Ange en utdatavariabel för användning i samma jobb.

Ange variabeln myVar med värdet foo.

- bash: |
    echo "##vso[task.setvariable variable=myVar;]foo"

Läs variabeln myVar:

- bash: |
    echo "You can use macro syntax for variables: $(myVar)"

Ange variabelegenskaper

Kommandot task.setvariable innehåller egenskaper för att ange en variabel som hemlighet, som en utdatavariabel och som skrivskyddad. Bland de tillgängliga egenskaperna finns:

  • variable = variabelnamn (obligatoriskt)
  • issecret = booleskt värde (valfritt, standardvärdet falskt)
  • isoutput = booleskt värde (valfritt, standardvärdet falskt)
  • isreadonly = booleskt värde (valfritt, standardvärdet falskt)

Om du vill använda variabeln i nästa steg anger du isoutput egenskapen till true. Om du vill referera till en variabel med värdet isoutput true tar du med uppgiftsnamnet. Exempel: $(TaskName.myVar)

När du anger en variabel som skrivskyddad kan den inte skrivas över av underordnade aktiviteter. Ställ in isreadonlytrue. Att ange en variabel som skrivskyddad förbättrar säkerheten genom att göra variabeln oföränderlig.

Ange en variabel som hemlighet

När issecret är inställt på true sparas värdet för variabeln som hemlighet och maskeras från loggar.

Kommentar

Azure Pipelines gör ett försök att maskera hemligheter när data skickas till pipelineloggar, så du kan se ytterligare variabler och data maskerade i utdata och loggar som inte har angetts som hemligheter.

Ange den hemliga variabeln mySecretVal.

- bash: |
    echo "##vso[task.setvariable variable=mySecretVal;issecret=true]secretvalue"

Hämta den hemliga variabeln mySecretVal.

- bash: |
    echo "##vso[task.setvariable variable=mySecretVal;issecret=true]secretvalue"
- bash: |
    echo $(mySecretVal)

Hemliga variabelutdata i bash.

Skärmbild av bash-variabelutdata.

Nivåer av utdatavariabler

Det finns fyra olika typer av utdatavariabler med distinkta syntaxer:

Ange en utdatavariabel för användning i samma jobb

När du använder en utdatavariabel i samma jobb behöver du inte använda egenskapen isoutput . Som standard är variabeln tillgänglig för underordnade steg i samma jobb. Men om du lägger till isoutput egenskapen måste du referera till variabeln med uppgiftsnamnet.

Skriptet här anger utdatavariabeln myJobVar för samma jobb utan att isoutput ange och anger myOutputJobVar med 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

Det här skriptet hämtar variablerna myJobVar för samma jobb och myOutputJobVar. Observera att syntaxen ändras för att referera till en utdatavariabel när isoutput=true den har lagts till.

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)

Ange en utdatavariabel för användning i framtida jobb

När du använder utdatavariabler mellan jobb refererar du till dem med dependencies. Syntaxen för att komma åt en utdatavariabel i ett framtida jobb eller stadium varierar beroende på relationen mellan variabelns setter och konsument. Lär dig mer om varje fall i beroenden.

Ange först utdatavariabeln myOutputVar.

jobs:
- job: A
  steps:
  - bash: |
     echo "##vso[task.setvariable variable=myOutputVar;isoutput=true]this is from job A"
    name: passOutput

Gå sedan till myOutputVar ett framtida jobb och mata ut variabeln som myVarFromJobA. Om du vill använda dependenciesmåste du ange dependsOn egenskapen för det framtida jobbet med namnet på det tidigare jobbet där utdatavariabeln angavs.

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)

Ange en utdatavariabel för användning i framtida faser

Utdatavariabler kan användas mellan steg i pipelines. Du kan använda utdatavariabler för att skicka användbar information, till exempel ID för genererade utdata, från en fas till en annan.

När du anger en variabel med isoutput egenskapen kan du referera till variabeln i senare steg med uppgiftsnamnet och syntaxen stageDependencies . Läs mer om beroenden.

Utdatavariabler är endast tillgängliga i nästa nedströmssteg. Om flera steg använder samma utdatavariabel använder du villkoret dependsOn .

Ange först utdatavariabeln myStageVal.

steps:
  - bash: echo "##vso[task.setvariable variable=myStageVal;isOutput=true]this is a stage output variable"
    name: MyOutputVar

I en framtida fas mappar du sedan utdatavariabeln myStageVal till en fas, ett jobb eller en variabel med aktivitetsomfång som till exempel myStageAVar. Observera att mappningssyntaxen använder ett körningsuttryck $[] och spårar sökvägen från stageDependencies till utdatavariabeln med både fasnamnet (A) och jobbnamnet (A1) för att fullständigt kvalificera variabeln.

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)

Om värdet innehåller nya raderingar kan du komma undan dem och agenten tar automatiskt bort det:

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

Vanliga frågor

Min utdatavariabel återges inte. Vad går fel?

Det finns några orsaker till att utdatavariabeln kanske inte visas.

  • Utdatavariabler som anges med isoutput är inte tillgängliga i samma jobb och är i stället endast tillgängliga i underordnade jobb.
  • Beroende på vilken variabelsyntax du använder kanske inte en variabel som anger en utdatavariabels värde vid körning. Variabler med makrosyntax ($(var)) bearbetas till exempel innan en aktivitet körs. Variabler med mallsyntax bearbetas däremot vid körning ($[variables.var]). Du vill vanligtvis använda körningssyntax när du ställer in utdatavariabler. Mer information om variabelsyntax finns i Definiera variabler.
  • Det kan finnas extra blanksteg i uttrycket. Om variabeln inte återges kontrollerar du om det finns extra blanksteg som omger isOutput=true.

Du kan felsöka dependencies utdata för ett pipelinejobb eller en fas genom att lägga till en variabel för beroendena och sedan skriva ut variabeln. I det här pipelinejobbet A anges till exempel utdatavariabeln MyTask. Det andra jobbet (B) beror på jobbet A. En ny variabel innehåller deps JSON-representationen av jobbberoendena. Det andra steget i Jobbet B använder PowerShell för att skriva ut deps så att du kan se jobbberoenden.

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