Nastavení proměnných ve skriptech
Azure DevOps Services | Azure DevOps Server 2022 – Azure DevOps Server 2019
Když ve svých kanálech používáte skripty PowerShellu a Bash, je často užitečné nastavit proměnné, které pak můžete použít v budoucích úlohách. Nově nastavené proměnné nejsou ve stejném úkolu dostupné.
Skripty jsou skvělé, když chcete udělat něco, co není podporováno úlohou, jako je volání vlastního rozhraní REST API a analýza odpovědi.
Pomocí task.setvariable
příkazu protokolování nastavíte proměnné ve skriptech PowerShellu a Bash .
Poznámka:
Úlohy nasazení používají pro výstupní proměnné jinou syntaxi. Další informace o podpoře výstupních proměnných v úlohách nasazení najdete v tématu Úlohy nasazení.
Pokud chcete použít proměnnou s podmínkou v kanálu, přečtěte si téma Určení podmínek.
Asi task.setvariable
Když přidáte proměnnou s task.setvariable
, následující úlohy mohou použít proměnnou pomocí syntaxe $(myVar)
makra . Proměnná bude ve výchozím nastavení dostupná jenom pro úkoly ve stejné úloze. Pokud přidáte parametr isoutput
, syntaxe pro volání proměnné se změní. Viz Nastavení výstupní proměnné pro použití ve stejné úloze.
Nastavte proměnnou myVar
hodnotou foo
.
- bash: |
echo "##vso[task.setvariable variable=myVar;]foo"
Přečtěte si proměnnou myVar
:
- bash: |
echo "You can use macro syntax for variables: $(myVar)"
Nastavení vlastností proměnné
Příkaz task.setvariable
obsahuje vlastnosti pro nastavení proměnné jako tajného klíče, jako výstupní proměnné a jen pro čtení. Mezi dostupné vlastnosti patří:
variable
= název proměnné (povinné)issecret
= logická hodnota (volitelné, výchozí hodnota je false)isoutput
= logická hodnota (volitelné, výchozí hodnota je false)isreadonly
= logická hodnota (volitelné, výchozí hodnota je false)
Chcete-li použít proměnnou v další fázi, nastavte isoutput
vlastnost na true
. Pokud chcete odkazovat na proměnnou s nastavenou isoutput
na hodnotu true, zahrnete název úkolu. Například $(TaskName.myVar)
.
Když nastavíte proměnnou jen pro čtení, není možné ji přepsat podřízenými úkoly. Nastavte isreadonly
na hodnotu true
. Nastavení proměnné jen pro čtení zvyšuje zabezpečení tím, že tuto proměnnou nastavíte jako neměnnou.
Nastavení proměnné jako tajného kódu
Pokud issecret
je nastavena hodnota true, hodnota proměnné se uloží jako tajný kód a maskuje se z protokolů.
Poznámka:
Azure Pipelines se snaží maskovat tajné kódy při generování dat do protokolů kanálu, takže můžete vidět další proměnné a data maskovaná ve výstupu a protokolech, které nejsou nastavené jako tajné kódy.
Nastavte proměnnou mySecretVal
tajného kódu .
- bash: |
echo "##vso[task.setvariable variable=mySecretVal;issecret=true]secretvalue"
Získejte proměnnou mySecretVal
tajného kódu .
- bash: |
echo "##vso[task.setvariable variable=mySecretVal;issecret=true]secretvalue"
- bash: |
echo $(mySecretVal)
Výstup proměnné tajného kódu v Bash.
Úrovně výstupních proměnných
Existují čtyři různé typy výstupních proměnných s odlišnými syntaxemi:
- Výstupní proměnné nastavené ve stejné úloze bez parametru
isoutput
Pokud chcete na tyto proměnné odkazovat, použijete syntaxi makra. Příklad:$(myVar)
. - Výstupní proměnné nastavené ve stejné úloze s parametrem
isoutput
Pokud chcete na tyto proměnné odkazovat, zahrnete název úkolu. Příklad:$(myTask.myVar)
. - Výstupní proměnné nastavené v budoucí úloze Pokud chcete na tyto proměnné odkazovat, budete na tuto proměnnou odkazovat v oddílu
variables
sedependency
syntaxí. - Výstupní proměnné nastavené v budoucích fázích Pokud chcete na tyto proměnné odkazovat, budete na tuto proměnnou odkazovat v oddílu
variables
sestageDependencies
syntaxí.
Poznámka:
Budoucí fáze nebo úlohy mají přístup pouze k výstupním proměnným, pokud závisí na fázi nebo úloze, ve které byla proměnná nastavena. Aby byla výstupní proměnná přístupná, ujistěte se, že další fáze nebo úloha závisí na fázi nebo úloze, ve které jste proměnnou vytvořili. Pokud je potřeba použít stejnou výstupní proměnnou více fází nebo úloh, použijte podmínku dependsOn
k vytvoření této závislosti.
Nastavení výstupní proměnné pro použití ve stejné úloze
Pokud ve stejné úloze použijete výstupní proměnnou, nemusíte tuto isoutput
vlastnost používat. Ve výchozím nastavení bude proměnná dostupná pro podřízené kroky ve stejné úloze. Pokud ale tuto vlastnost přidáte isoutput
, budete muset na proměnnou odkazovat s názvem úkolu.
Skript zde nastaví výstupní proměnnou myJobVar
stejné úlohy bez zadání isoutput
a sad myOutputJobVar
pomocí 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
Tento skript získá proměnné myJobVar
stejné úlohy a myOutputJobVar
. Všimněte si, že se syntaxe změní pro odkazování na výstupní proměnnou po isoutput=true
přidání.
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)
Nastavení výstupní proměnné pro použití v budoucích úlohách
Při použití výstupních proměnných napříč úlohami na ně budete odkazovat pomocí dependencies
. Syntaxe pro přístup k výstupní proměnné v budoucí úloze nebo dílčí fázi se liší v závislosti na vztahu mezi setter a příjemcem proměnné. Přečtěte si o jednotlivých případech v závislostech.
Nejprve nastavte výstupní proměnnou myOutputVar
.
jobs:
- job: A
steps:
- bash: |
echo "##vso[task.setvariable variable=myOutputVar;isoutput=true]this is from job A"
name: passOutput
V dalším kroku se dostanete k myOutputVar
budoucí úloze a vypíšete proměnnou jako myVarFromJobA
. Chcete-li použít dependencies
, je nutné nastavit dependsOn
vlastnost pro budoucí úlohu pomocí názvu předchozí úlohy, ve které byla nastavena výstupní proměnná.
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)
Nastavení výstupní proměnné pro použití v budoucích fázích
Výstupní proměnné je možné použít napříč fázemi v kanálech. Pomocí výstupních proměnných můžete předávat užitečné informace, jako je ID vygenerovaného výstupu, z jedné fáze do další.
Když nastavíte proměnnou s isoutput
vlastností, můžete na tuto proměnnou odkazovat v pozdějších fázích s názvem úlohy a stageDependencies
syntaxí. Přečtěte si další informace o závislostech.
Výstupní proměnné jsou k dispozici pouze v další podřízené fázi. Pokud více fází spotřebovává stejnou výstupní proměnnou, použijte podmínku dependsOn
.
Nejprve nastavte výstupní proměnnou myStageVal
.
steps:
- bash: echo "##vso[task.setvariable variable=myStageVal;isOutput=true]this is a stage output variable"
name: MyOutputVar
Potom v budoucí fázi namapujte výstupní proměnnou myStageVal
na proměnnou s oborem fáze, úlohy nebo úkolu, například myStageAVar
. Všimněte si, že syntaxe mapování používá výraz $[]
modulu runtime a trasuje cestu z stageDependencies
výstupní proměnné pomocí názvu fáze (A
) i názvu úlohy () proA1
úplnou kvalifikaci proměnné.
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)
V případě, že vaše hodnota obsahuje nové čáry, můžete je utéct a agent ho automaticky zruší:
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
Často kladené dotazy
Výstupní proměnná se nevykresluje. Co se pokazí?
Existuje několik důvodů, proč se výstupní proměnná nemusí zobrazit.
- Výstupní proměnné nastavené
isoutput
s nejsou dostupné ve stejné úloze a místo toho jsou k dispozici pouze v podřízených úlohách. - V závislosti na tom, jakou syntaxi proměnné použijete, nemusí být proměnná, která nastaví hodnotu výstupní proměnné za běhu k dispozici. Například proměnné se syntaxí maker (
$(var)
) se zpracovávají před spuštěním úlohy. Naproti tomu proměnné se syntaxí šablony zpracovávají za běhu ($[variables.var]
). Při nastavování výstupních proměnných budete obvykle chtít použít syntaxi modulu runtime. Další informace o syntaxi proměnných najdete v tématu Definování proměnných. - Ve výrazu můžou být nadbytečné mezery. Pokud se vaše proměnná nevykresluje, zkontrolujte nadbytečné mezery kolem
isOutput=true
.
Výstup úlohy kanálu nebo fáze můžete vyřešit dependencies
přidáním proměnné pro závislosti a následným tiskem této proměnné. Například v této úloze A
kanálu nastaví výstupní proměnnou MyTask
. Druhá úloha (B
) závisí na úloze A
. Nová proměnná obsahuje deps
reprezentaci JSON závislostí úloh. Druhý krok v úloze B
používá k vytištění deps
PowerShellu, abyste viděli závislosti úloh.
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)"