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.setvariable
kan 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 isreadonly
på true
. 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.
Nivåer av utdatavariabler
Det finns fyra olika typer av utdatavariabler med distinkta syntaxer:
- Utdatavariabler som anges i samma jobb utan parametern
isoutput
. Om du vill referera till dessa variabler använder du makrosyntax. Exempel:$(myVar)
. - Utdatavariabler som anges i samma jobb med parametern
isoutput
. Om du vill referera till dessa variabler tar du med uppgiftsnamnet. Exempel:$(myTask.myVar)
. - Utdatavariabler som anges i ett framtida jobb. Om du vill referera till dessa variabler refererar du till variabeln i
variables
avsnittet meddependency
syntax. - Utdatavariabler som anges i framtida faser. Om du vill referera till dessa variabler refererar du till variabeln i
variables
avsnittet medstageDependencies
syntax.
Kommentar
Framtida faser eller jobb kan bara komma åt utdatavariabler om de är beroende av fasen eller jobbet där variabeln angavs. Om du vill göra en utdatavariabel tillgänglig kontrollerar du att nästa steg eller jobb beror på fasen eller jobbet där du skapade variabeln. Om flera steg eller jobb behöver använda samma utdatavariabel använder du villkoret dependsOn
för att upprätta det här beroendet.
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 dependencies
må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)"