Share via


Variabelen instellen in scripts

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

Wanneer u PowerShell- en Bash-scripts in uw pijplijnen gebruikt, is het vaak handig om variabelen in te stellen die u vervolgens in toekomstige taken kunt gebruiken. Nieuw ingestelde variabelen zijn niet beschikbaar in dezelfde taak.

Scripts zijn handig als u iets wilt doen dat niet wordt ondersteund door een taak, zoals het aanroepen van een aangepaste REST API en het parseren van het antwoord.

U gebruikt de task.setvariable opdracht voor logboekregistratie om variabelen in te stellen in PowerShell - en Bash-scripts .

Notitie

Implementatietaken gebruiken een andere syntaxis voor uitvoervariabelen. Zie Implementatietaken voor meer informatie over ondersteuning voor uitvoervariabelen in implementatietaken.

Zie Voorwaarden opgeven als u een variabele wilt gebruiken met een voorwaarde in een pijplijn.

Over task.setvariable

Wanneer u een variabele met task.setvariabletoevoegt, kunnen de volgende taken de variabele gebruiken met behulp van macrosyntaxis $(myVar). De variabele is standaard alleen beschikbaar voor taken in dezelfde taak. Als u de parameter isoutputtoevoegt, wordt de syntaxis voor het aanroepen van de variabele gewijzigd. Zie Een uitvoervariabele instellen voor gebruik in dezelfde taak.

Stel de variabele myVar in met de waarde foo.

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

De variabele myVarlezen:

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

Variabele-eigenschappen instellen

De task.setvariable opdracht bevat eigenschappen voor het instellen van een variabele als geheim, als uitvoervariabele en als alleen-lezen. De beschikbare eigenschappen zijn onder andere:

  • variable = variabelenaam (vereist)
  • issecret = Booleaanse waarde (optioneel, standaard ingesteld op onwaar)
  • isoutput = Booleaanse waarde (optioneel, standaard ingesteld op onwaar)
  • isreadonly = Booleaanse waarde (optioneel, standaard ingesteld op onwaar)

Als u de variabele in de volgende fase wilt gebruiken, stelt u de isoutput eigenschap in op true. Als u wilt verwijzen naar een variabele met de isoutput set waar, neemt u de taaknaam op. Bijvoorbeeld: $(TaskName.myVar).

Wanneer u een variabele instelt als alleen-lezen, kan deze niet worden overschreven door downstreamtaken. Stel isreadonly in op true. Het instellen van een variabele als alleen-lezen verbetert de beveiliging door die variabele onveranderbaar te maken.

Een variabele instellen als geheim

Wanneer issecret deze is ingesteld op true, wordt de waarde van de variabele opgeslagen als geheim en gemaskeerd uit logboeken.

Notitie

Azure Pipelines doet er alles aan om geheimen te maskeren bij het verzenden van gegevens naar pijplijnlogboeken, zodat er mogelijk extra variabelen en gegevens worden gemaskeerd in uitvoer en logboeken die niet als geheimen zijn ingesteld.

Stel de geheime variabele mySecretValin.

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

Haal de geheime variabele mySecretValop.

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

Uitvoer van geheime variabelen in bash.

Schermopname van uitvoer van bash-variabelen.

Niveaus van uitvoervariabelen

Er zijn vier verschillende typen uitvoervariabelen met verschillende syntaxis:

Een uitvoervariabele instellen voor gebruik in dezelfde taak

Wanneer u een uitvoervariabele in dezelfde taak gebruikt, hoeft u de isoutput eigenschap niet te gebruiken. De variabele is standaard beschikbaar voor downstreamstappen binnen dezelfde taak. Als u de isoutput eigenschap echter toevoegt, moet u verwijzen naar de variabele met de taaknaam.

Met het script wordt hier de uitvoervariabele myJobVar voor dezelfde taak ingesteld zonder op te geven en in te isoutput stellen myOutputJobVar met 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

Met dit script worden dezelfde taakvariabelen myJobVar en myOutputJobVar. U ziet dat de syntaxis verandert voor het verwijzen naar een uitvoervariabele zodra isoutput=true deze is toegevoegd.

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)

Een uitvoervariabele instellen voor gebruik in toekomstige taken

Wanneer u uitvoervariabelen in verschillende taken gebruikt, verwijst u ernaar met dependencies. De syntaxis voor het openen van een uitvoervariabele in een toekomstige taak of fase varieert op basis van de relatie tussen de setter en de consument van de variabele. Meer informatie over elk geval in afhankelijkheden.

Stel eerst de uitvoervariabele myOutputVarin.

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

Vervolgens opent myOutputVar u in een toekomstige taak en voert u de variabele uit als myVarFromJobA. Als u deze wilt gebruiken dependencies, moet u de dependsOn eigenschap voor de toekomstige taak instellen met behulp van de naam van de vorige taak waarin de uitvoervariabele is ingesteld.

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)

Een uitvoervariabele instellen voor gebruik in toekomstige fasen

Uitvoervariabelen kunnen worden gebruikt in fasen in pijplijnen. U kunt uitvoervariabelen gebruiken om nuttige informatie door te geven, zoals de id van een gegenereerde uitvoer, van de ene fase naar de volgende.

Wanneer u een variabele met de isoutput eigenschap instelt, kunt u in latere fasen naar die variabele verwijzen met de taaknaam en de stageDependencies syntaxis. Meer informatie over afhankelijkheden.

Uitvoervariabelen zijn alleen beschikbaar in de volgende downstreamfase. Als meerdere fasen dezelfde uitvoervariabele gebruiken, gebruikt u de dependsOn voorwaarde.

Stel eerst de uitvoervariabele myStageValin.

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

Wijs vervolgens in een toekomstige fase de uitvoervariabele myStageVal toe aan een fase, taak of taakbereikvariabele, bijvoorbeeld myStageAVar. De toewijzingssyntaxis maakt gebruik van een runtime-expressie $[] en traceert het pad van naar de uitvoervariabele met behulp van stageDependencies zowel de fasenaam (A) als de taaknaam (A1) om de variabele volledig in aanmerking te komen.

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)

Als uw waarde nieuwe regels bevat, kunt u deze escapen en wordt deze automatisch ongedaan door de agent weergegeven:

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

Veelgestelde vragen

Mijn uitvoervariabele wordt niet weergegeven. Wat gaat er mis?

Er zijn enkele redenen waarom uw uitvoervariabele mogelijk niet wordt weergegeven.

  • Uitvoervariabelen die zijn ingesteld met isoutput zijn niet beschikbaar in dezelfde taak en zijn in plaats daarvan alleen beschikbaar in downstreamtaken.
  • Afhankelijk van de syntaxis van de variabele die u gebruikt, is een variabele waarmee de waarde van een uitvoervariabele wordt ingesteld, mogelijk niet beschikbaar tijdens runtime. Variabelen met macrosyntaxis ($(var)) worden bijvoorbeeld verwerkt voordat een taak wordt uitgevoerd. Variabelen met sjabloonsyntaxis worden daarentegen verwerkt tijdens runtime ($[variables.var]). Meestal wilt u de runtimesyntaxis gebruiken bij het instellen van uitvoervariabelen. Zie Variabelen definiëren voor meer informatie over de syntaxis van variabelen.
  • Er zijn mogelijk extra spaties in uw expressie. Als uw variabele niet wordt weergegeven, controleert u of er extra spaties rondom zijn isOutput=true.

U kunt de dependencies uitvoer voor een pijplijntaak of fase oplossen door een variabele voor de afhankelijkheden toe te voegen en die variabele vervolgens af te drukken. In deze pijplijntaak A wordt bijvoorbeeld de uitvoervariabele MyTaskingesteld. De tweede taak (B) is afhankelijk van de taak A. Een nieuwe variabele bevat deps de JSON-weergave van de taakafhankelijkheden. In de tweede stap in Taak B wordt PowerShell gebruikt om af te drukken deps , zodat u de taakafhankelijkheden kunt zien.

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