Festlegen von Variablen in Skripts

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

Wenn Sie PowerShell- und Bash-Skripts in Ihren Pipelines verwenden, ist es häufig nützlich, Variablen festzulegen, die Sie dann in zukünftigen Aufgaben verwenden können. Neu festgelegte Variablen sind in derselben Aufgabe nicht verfügbar.

Skripts eignen sich hervorragend, wenn Sie etwas tun möchten, das von einer Aufgabe nicht unterstützt wird, z. B. das Aufrufen einer benutzerdefinierten REST-API und das Analysieren der Antwort.

Sie verwenden den task.setvariable-Protokollierungsbefehl, um Variablen in PowerShell- und Bash-Skripts festzulegen.

Hinweis

Bereitstellungsaufträge verwenden eine andere Syntax für Ausgabevariablen. Weitere Informationen zur Unterstützung von Ausgabevariablen in Bereitstellungsaufträgen finden Sie unter Bereitstellungsaufträge.

Informationen zum Verwenden einer Variablen mit einer Bedingung in einer Pipeline finden Sie unter Angeben von Bedingungen.

Informationen zum task.setvariable

Wenn Sie eine Variable mit task.setvariable hinzufügen, können die folgenden Aufgaben die Variable mithilfe der Makrosyntax $(myVar)verwenden. Die Variable ist standardmäßig nur für Aufgaben im gleichen Auftrag verfügbar. Wenn Sie den Parameter isoutput hinzufügen, ändert sich die Syntax zum Aufrufen der Variablen. Weitere Informationen finden Sie unter Festlegen einer Ausgabevariablen für die Verwendung im gleichen Auftrag.

Legen Sie die Variable myVar mit dem Wert foo fest.

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

Lesen Sie die Variable myVar:

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

Variableneigenschaften festlegen

Der Befehl task.setvariable enthält Eigenschaften zum Festlegen einer Variablen als Geheimnis, als Ausgabevariablen und als schreibgeschützt. Zu den verfügbaren Eigenschaften gehören:

  • variable = Name der Variablen (erforderlich)
  • issecret = boolesch (optional, Standardwert FALSE)
  • isoutput = boolesch (optional, Standardwert FALSE)
  • isreadonly = boolesch (optional, Standardwert FALSE)

Um die Variable in der nächsten Stage zu verwenden, legen Sie die isoutput-Eigenschaft auf true fest. Um auf eine Variable zu verweisen, deren Wert isoutput auf TRUE festgelegt ist, fügen Sie den Aufgabennamen ein. Beispiel: $(TaskName.myVar).

Wenn Sie eine Variable als schreibgeschützt festlegen, kann sie nicht von nachgelagerten Aufgaben überschrieben werden. Legen Sie isreadonly auf true fest. Wenn Sie eine Variable als schreibgeschützt festlegen, erhöht sich die Sicherheit, da die Variable unveränderlich ist.

Festlegen einer Variablen als Geheimnis

Wenn issecret auf „true“ festgelegt ist, wird der Wert der Variable als Geheimnis gespeichert und im Protokoll maskiert.

Hinweis

Azure Pipelines bemüht sich, geheime Schlüssel beim Ausgeben von Daten an Pipelineprotokolle zu maskieren, sodass möglicherweise zusätzliche Variablen und Daten in Ausgabe- und Protokollen maskiert werden, die nicht als geheime Schlüssel festgelegt sind.

Legen Sie die Geheimnisvariable mySecretVal fest:

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

Ruft die geheime Variable mySecretVal ab.

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

Ausgabe der Geheimnisvariable in Bash.

Screenshot: Ausgabe der Bash-Variable.

Ebenen von Ausgabevariablen

Es gibt vier verschiedene Arten von Ausgabevariablen mit unterschiedlicher Syntax:

Festlegen einer Ausgabevariablen für die Verwendung im gleichen Auftrag

Wenn Sie eine Ausgabevariable im selben Auftrag verwenden, müssen Sie die isoutput-Eigenschaft nicht verwenden. Standardmäßig ist die Variable für nachgeschaltete Schritte innerhalb desselben Auftrags verfügbar. Wenn Sie jedoch die isoutput-Eigenschaft hinzufügen, müssen Sie mit dem Aufgabennamen auf die Variable verweisen.

Das Skript legt hier die Ausgabevariable myJobVar des gleichen Auftrags fest, ohne isoutput anzugeben, und legt myOutputJobVar auf isoutput=true fest.

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

Dieses Skript ruft die Variablen myJobVar und myOutputJobVar des gleichen Auftrags und ab. Beachten Sie, dass sich die Syntax für den Verweis auf eine Ausgabevariable ändert, sobald isoutput=true hinzugefügt wird.

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)

Festlegen einer Ausgabevariable für die Verwendung in zukünftigen Aufträgen

Wenn Sie Ausgabevariablen auftragsübergreifend verwenden, verweisen Sie darauf mit dependencies. Die Syntax für den Zugriff auf eine Ausgabevariable in einem zukünftigen Auftrag oder einer zukünftigen Stage hängt von der Beziehung zwischen dem Setter und dem Consumer der Variablen ab. Erfahren Sie mehr über jeden Fall in Abhängigkeiten.

Legen Sie zunächst die Ausgabevariable myOutputVar fest.

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

Greifen Sie als Nächstes auf myOutputVar in einem zukünftigen Auftrag zu, und geben Sie die Variable als myVarFromJobA aus. Um dependencies zu verwenden, müssen Sie die dependsOn-Eigenschaft für den zukünftigen Auftrag unter Verwendung des Namens des vergangenen Auftrags festlegen, in dem die Ausgabevariable festgelegt wurde.

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)

Festlegen einer Ausgabevariablen für die Verwendung in zukünftigen Stages

Ausgabevariablen können stageübergreifend in Pipelines verwendet werden. Sie können Ausgabevariablen verwenden, um nützliche Informationen, z. B. die ID einer generierten Ausgabe, von einer Stage zur nächsten zu übergeben.

Wenn Sie eine Variable mit der isoutput-Eigenschaft festlegen, können Sie in späteren Stages mit dem Aufgabennamen und der Syntax auf diese stageDependencies-Variable verweisen. Weitere Informationen zu Abhängigkeiten.

Ausgabevariablen sind nur in der nächsten Downstream-Stufe verfügbar. Wenn mehrere Phasen die gleiche Ausgabevariable nutzen, verwenden Sie die dependsOn-Bedingung.

Legen Sie zunächst die Ausgabevariable myStageVal fest.

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

Ordnen Sie dann in einer zukünftigen Stage die Ausgabevariable myStageVal einer Stage, einem Auftrag oder einer Aufgabenbereichsvariablen zu, z. B. myStageAVar. Beachten Sie, dass die Zuordnungssyntax einen Runtimeausdruck $[] verwendet und den Pfad von stageDependencies zur Ausgabevariablen mit dem Stagenamen (A) und dem Auftragsnamen (A1) verfolgt, um die Variable vollständig zu qualifizieren.

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)

Wenn Ihr Wert neue Zeilen enthält, können Sie für diese Escapezeichen einfügen, und der Agent entfernt die Escapezeichen automatisch wieder:

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

Häufig gestellte Fragen

Meine Ausgabevariable wird nicht gerendert. Was ist falsch?

Es gibt einige Gründe, warum Ihre Ausgabevariable möglicherweise nicht angezeigt wird.

  • Ausgabevariablen, die mit isoutput festgelegt sind, sind nicht im selben Auftrag sondern nur in Downstreamaufträgen verfügbar.
  • Je nachdem, welche Variablensyntax Sie verwenden, ist eine Variable, die den Wert einer Ausgabevariablen festlegt, zur Runtime möglicherweise nicht verfügbar. Beispielsweise werden Variablen mit Makrosyntax ($(var)) verarbeitet, bevor eine Aufgabe ausgeführt wird. Im Gegensatz dazu werden Variablen mit Vorlagensyntax zur Runtime ($[variables.var]) verarbeitet. Beim Festlegen von Ausgabevariablen werden Sie in der Regel die Runtimesyntax verwenden. Weitere Informationen zur Variablensyntax finden Sie unter Definieren von Variablen.
  • Möglicherweise gibt es zusätzliche Leerzeichen in Ihrem Ausdruck. Wenn Ihre Variable nicht gerendert wird, überprüfen Sie, ob isOutput=true von zusätzlichen Leerzeichen umgeben ist.

Sie können die dependencies-Ausgabe für einen Pipeline-Job oder die Pipeline-Stufe korrigieren, indem Sie eine Variable für die Abhängigkeiten hinzufügen und diese Variable dann ausgeben. In diesem Pipeline-Job legt A zum Beispiel die Ausgabevariable MyTask fest. Der zweite Job (B) hängt von Job A ab. Eine neue Variable, deps, enthält die JSON-Darstellung der Abhängigkeiten des Jobs. Der zweite Schritt in Job B verwendet PowerShell, um deps auszugeben, damit Sie die Abhängigkeiten des Jobs sehen können.

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