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.
Ebenen von Ausgabevariablen
Es gibt vier verschiedene Arten von Ausgabevariablen mit unterschiedlicher Syntax:
- Ausgabevariablen, die im gleichen Auftrag ohne den
isOutput
-Parameter festgelegt werden. Um auf diese Variablen zu verweisen, verwenden Sie Makrosyntax. Beispiel:$(myVar)
. - Ausgabevariablen, die im gleichen Auftrag mit dem
isOutput
-Parameter festgelegt werden. Um auf diese Variablen zu verweisen, fügen Sie den Aufgabennamen ein. Beispiel:$(myTask.myVar)
. - Ausgabevariablen, die in einem zukünftigen Auftrag festgelegt sind. Um auf diese Variablen zu verweisen, verweisen Sie im Abschnitt
variables
mit derdependency
-Syntax auf die Variable. - Ausgabevariablen, die in zukünftigen Stages festgelegt werden. Um auf diese Variablen zu verweisen, verweisen Sie im Abschnitt
variables
mit derstageDependencies
-Syntax auf die Variable.
Hinweis
Zukünftige Phasen oder Aufträge können nur auf Ausgabevariablen zugreifen, wenn sie von der Phase oder dem Auftrag abhängen, in der die Variable festgelegt wurde. Um eine Ausgabevariable zugänglich zu machen, stellen Sie sicher, dass die nächste Phase oder der nächste Auftrag von der Phase oder dem Auftrag abhängt, in der Sie die Variable erstellt haben. Wenn mehrere Phasen oder Aufträge dieselbe Ausgabevariable verwenden müssen, verwenden Sie die dependsOn
-Bedingung, um diese Abhängigkeit festzulegen.
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)"