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.

O 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 mySecretValtajného kódu .

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

Získejte proměnnou mySecretValtajné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.

Snímek obrazovky s výstupem proměnné 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:

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