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 úloha nepodporuje. Můžete například použít skript k volání vlastního rozhraní REST API a parsování odpovědi.
Příkaz protokolování
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á je 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í. Další informace naleznete v tématu 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 isOutput
nastavenou na hodnotu true, zahrnete název úkolu. Například $(TaskName.myVar)
.
Když nastavíte proměnnou jen pro čtení, podřízené úkoly ji nemůžou přepsat. 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žijte 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, odkazujete na proměnnou v oddílu
variables
pomocí syntaxedependency
. -
Výstupní proměnné nastavené v budoucích fázích Pokud chcete na tyto proměnné odkazovat, odkazujete na proměnnou v oddílu
variables
pomocí syntaxestageDependencies
.
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í je proměnná dostupná pro podřízené kroky ve stejné úloze. Pokud však přidáte vlastnost isOutput
, musíte na proměnnou odkazovat s názvem úlohy.
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ě odkazujete 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é řádky, můžete je escapovat a agent je automaticky unescapuje.
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 vaše 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 obvykle chcete 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á PowerShell k zobrazení deps
, 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)"