Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020
In diesem Artikel werden die verschiedenen Bedingungen beschrieben, mit denen eine Azure Pipelines-Phase, ein Auftrag oder ein Schritt ausgeführt werden kann und wie Sie diese Bedingungen in einer YAML-Pipelinedefinition festlegen.
Hinweis
In diesem Artikel werden YAML-Pipelinefunktionen erläutert. Bei klassischen Pipelines können Sie in den Steuerungsoptionen der jeweiligen Aufgabe einige Bedingungen angeben, unter denen die Aufgabe oder der Auftrag ausgeführt wird. Für einen Auftrag in einer Releasepipeline können Sie dafür Zusätzliche Optionen verwenden.
Bedingungen, unter der eine Phase, ein Auftrag oder ein Schritt ausgeführt wird
Standardmäßig wird ein Pipelineauftrag oder eine Pipelinephase ausgeführt, wenn er nicht von einem anderen Auftrag oder einer anderen Phase abhängt oder ob alle Abhängigkeiten abgeschlossen und erfolgreich waren. Die Abhängigkeitsanforderung gilt für direkte Abhängigkeiten und für ihre indirekten Abhängigkeiten, die rekursiv berechnet werden.
Schritte werden standardmäßig ausgeführt, wenn im zugehörigen Auftrag noch kein Fehler aufgetreten ist und der unmittelbar vorangehende Schritt abgeschlossen wurde. Mehr Kontext zu Phasen, Aufträgen und Schritten finden Sie unter Wichtige Konzepte für Azure Pipelines.
Sie können diese Standardverhalten außer Kraft setzen oder anpassen, indem Sie eine Phase, einen Auftrag oder einen Schritt festlegen, der ausgeführt werden soll, auch wenn eine vorherige Abhängigkeit fehlschlägt oder ein anderes Ergebnis hat. Sie können auch benutzerdefinierte Bedingungen definieren. In einer YAML-Pipelinedefinition verwenden Sie die condition
Eigenschaft, um Bedingungen anzugeben, unter denen eine Phase, ein Auftrag oder ein Schritt ausgeführt werden kann.
Hinweis
Bedingungen gelten für alle vorherigen direkten und indirekten Abhängigkeiten mit demselben Agentpool. Phasen oder Aufträge in verschiedenen Agentpools werden gleichzeitig ausgeführt.
Zu den Bedingungen, die auf dem vorherigen Abhängigkeitsstatus basieren, gehören:
-
Erfolgreich: Nur ausgeführt, wenn alle vorherigen Abhängigkeiten erfolgreich sind. Dieses Verhalten ist die Standardeinstellung, wenn keine Bedingung im YAML festgelegt ist. Geben Sie
condition: succeeded()
an, um diese Bedingung anzuwenden. -
Erfolgreich oder fehlgeschlagen: Führen Sie die Ausführung auch dann aus, wenn eine vorherige Abhängigkeit fehlschlägt, es sei denn, die Ausführung wird abgebrochen. Geben Sie
condition: succeededOrFailed()
an, um diese Bedingung anzuwenden. -
Always: Run even if a previous dependency fails, even if the run is canceled. Geben Sie
condition: always()
an, um diese Bedingung anzuwenden. -
Fehler: Wird nur ausgeführt, wenn eine vorherige Abhängigkeit fehlschlägt. Geben Sie
condition: failed()
an, um diese Bedingung anzuwenden.
Wichtig
Wenn Sie eine Eigenschaft für eine condition
Phase, einen Auftrag oder einen Schritt angeben, überschreiben Sie die Standardbedingung. Ihre Phase, Ihr Auftrag oder Ihr Schritt kann auch dann ausgeführt werden, wenn der Build abgebrochen wurde. Stellen Sie sicher, dass Ihre Bedingungen den Status der übergeordneten Stufe oder des Arbeitsplatzes berücksichtigen.
Bedingungsbeispiel
Im folgenden YAML-Beispiel werden die always()
Bedingungen veranschaulicht failed()
. Die erste Skriptaufgabe in Auftrag 1 weist eine always
Bedingung auf, sodass sie auch dann ausgeführt wird, wenn Abhängigkeiten fehlschlagen oder der Build abgebrochen wird. In der zweiten Skriptaufgabe sorgt exit job1
dafür, dass der job1
Auftrag fehlschlägt.
Pipelinephasen werden standardmäßig sequenziell ausgeführt, Aufträge können jedoch parallel ausgeführt werden. Sie können die dependsOn
Eigenschaft verwenden, um explizit Abhängigkeiten zwischen Phasen oder Aufträgen zu definieren.
Verwenden Sie zum Festlegen der Bedingungen für einen Auftrag, der vom Ergebnis eines anderen Auftrags abhängt, dependsOn
die Abhängigkeit zu definieren. Im folgenden Beispiel hängt von job2
und wird ausgeführt, job1
da job1
ein Fehler auftritt.
jobs:
- job: job1
steps:
- script: echo Hello!
condition: always() # this step runs even if the build is canceled
- script: |
echo "This task will fail."
exit job1
- job: job2
dependsOn: job1
condition: failed() # this job runs only if job1 fails
Hinweis
Sie können auch die Benutzeroberfläche von Azure Pipelines verwenden, um abhängige Phasen manuell auszuführen, wenn die übergeordnete Phase fehlschlägt. Weitere Informationen finden Sie unter Ausführen untergeordneter Phasen, wenn die übergeordnete Phase fehlschlägt.
Benutzerdefinierte Bedingungen
Wenn die integrierten Bedingungen Ihren Anforderungen nicht entsprechen, können Sie benutzerdefinierte Bedingungen als Ausdrücke in YAML-Pipelinedefinitionen angeben.
Der Agent wertet den Ausdruck aus, indem er mit der innersten Funktion beginnt und nach außen fortfährt. Das endgültige Ergebnis ist ein boolescher Wert, der bestimmt, ob die Phase, der Auftrag oder der Schritt ausgeführt werden soll. Eine vollständige Anleitung für die Syntax finden Sie unter Ausdrücke.
Wichtig
Bedingungen werden ausgewertet, um zu bestimmen, ob eine Phase, ein Auftrag oder ein Schritt gestartet werden soll. Daher steht während der Laufzeit einer Phase, eines Auftrags oder eines Schritts nichts zur Verfügung, das innerhalb derselben Stufe, eines Auftrags oder eines Schritts verwendet werden kann. Wenn Sie beispielsweise eine Variable in einem Auftrag mithilfe eines Laufzeitausdrucks mit $[ ]
Syntax festlegen, können Sie diese Variable nicht in Bedingungen innerhalb dieses Auftrags verwenden.
Variablen in Bedingungen
Sie können Pipelinevariablen festlegen und in Bedingungen verwenden. Die folgende Pipeline legt eine isMain
Variable fest und verwendet sie in einer Bedingung, die Phase B nur ausführt, wenn der Buildquellzweig ist main
.
variables:
isMain: $[eq(variables['Build.SourceBranch'], 'refs/heads/main')]
stages:
- stage: A
jobs:
- job: A1
steps:
- script: echo Hello Stage A!
- stage: B
condition: and(succeeded(), eq(variables.isMain, true))
jobs:
- job: B1
steps:
- script: echo Hello Stage B!
- script: echo $(isMain)
Sie können eine Bedingung festlegen, die ausgeführt werden soll, wenn eine Variable null oder eine leere Zeichenfolge ist. Alle Variablen werden in Azure Pipelines als Zeichenfolgen behandelt, sodass eine leere Zeichenfolge in der folgenden Pipeline entspricht null
:
variables:
- name: testEmpty
value: ''
jobs:
- job: A
steps:
- script: echo testEmpty is blank
condition: eq(variables.testEmpty, '')
Auftragsausgabevariablen, die in anderen Auftragsbedingungen verwendet werden
Sie können eine Variable in einem Auftrag erstellen, den andere Aufträge in derselben Phase in Bedingungen angeben können. Variablen, die abhängigen Aufträgen zur Verfügung stehen, müssen wie im folgenden Code als AusgabevariablenisOutput=true
mit mehreren Aufträgen gekennzeichnet werden:
jobs:
- job: A
steps:
- bash: |
echo "This is job A."
echo "##vso[task.setvariable variable=doThing;isOutput=true]Yes" #set variable doThing to Yes
name: DetermineResult
- job: B
dependsOn: A
condition: eq(dependencies.A.outputs['DetermineResult.doThing'], 'Yes') #map doThing and check the value
steps:
- script: echo "Job A ran and doThing is Yes."
In nachfolgenden Schrittbedingungen verwendete Schrittvariablen
Sie können in einem Schritt eine Variable erstellen, die zukünftige Schritte im selben Auftrag in Bedingungen angeben kann. Variablen, die anhand von Schritten erstellt wurden, sind standardmäßig für zukünftige Schritte im Auftrag verfügbar und müssen nicht als Ausgabevariablen mit mehreren Stellen gekennzeichnet werden.
Variablen, die in einem Schritt in einem Auftrag erstellt wurden, weisen die folgenden Einschränkungen auf:
- Sind auf die Schritte im selben Auftrag eingestellt.
- Sind in nachfolgenden Schritten nur als Umgebungsvariablen verfügbar.
- Kann nicht in demselben Schritt verwendet werden, der sie definiert.
Im folgenden Beispiel wird eine Pipelinevariable in einem Schritt erstellt und die Variable in der Skriptbedingung eines späteren Schritts verwendet.
steps:
# This step creates a new pipeline variable: doThing. This variable is available to subsequent steps.
- bash: |
echo "##vso[task.setvariable variable=doThing]Yes"
displayName: Step 1
# This step uses doThing in its condition
- script: |
# Access the variable from Step 1 as an environment variable.
echo "Value of doThing (as DOTHING env var): $DOTHING."
displayName: Step 2
condition: and(succeeded(), eq(variables['doThing'], 'Yes')) # or and(succeeded(), eq(variables.doThing, 'Yes'))
Bedingungseinstellungen für verschiedene Ergebnisse
Die folgende Tabelle zeigt condition
Einstellungen, um verschiedene gewünschte Ergebnisse zu erzielen.
Gewünschtes Ergebnis | Exemplarische Bedingungseinstellung |
---|---|
Führen Sie die Ausführung aus, wenn der Quellzweig main , auch wenn die übergeordnete oder vorhergehende Phase, der Auftrag oder der Schritt fehlgeschlagen ist oder abgebrochen wurde. |
eq(variables['Build.SourceBranch'], 'refs/heads/main') |
Führen Sie die Ausführung aus, wenn der Quellzweig und die übergeordnete oder vorhergehende Phase, der Auftrag oder der Schritt erfolgreich war main . |
and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main')) |
Führen Sie die Ausführung aus, wenn der Quellzweig nicht main ausgeführt wird und die übergeordnete oder vorhergehende Phase, der Auftrag oder der Schritt erfolgreich war. |
and(succeeded(), ne(variables['Build.SourceBranch'], 'refs/heads/main')) |
Führen Sie für user Verzweigungen aus, wenn die übergeordnete oder vorhergehende Phase, der Auftrag oder der Schritt erfolgreich war. |
and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/heads/users/')) |
Die Ausführung soll für CI-Builds (Continuous Integration) erfolgen, wenn die übergeordnete oder vorhergehende Phase, der übergeordnete oder vorhergehende Auftrag oder der übergeordnete oder vorhergehende Schritt erfolgreich war. | and(succeeded(), in(variables['Build.Reason'], 'IndividualCI', 'BatchedCI')) |
Führen Sie die Ausführung aus, wenn eine Pullanforderung den Build ausgelöst hat und die übergeordnete oder vorhergehende Phase, der Auftrag oder der Schritt fehlgeschlagen ist. | and(failed(), eq(variables['Build.Reason'], 'PullRequest')) |
Die Ausführung soll für einen geplanten Buildvorgang erfolgen, auch wenn die übergeordnete oder vorhergehende Phase, der übergeordnete oder vorhergehende Auftrag oder der übergeordnete oder vorhergehende Schritt nicht erfolgreich war oder abgebrochen wurde. | eq(variables['Build.Reason'], 'Schedule') |
Führen Sie die Ausführung aus, wenn die System.debug Variable auf true , auch wenn die übergeordnete oder vorhergehende Phase, der Auftrag oder der Schritt fehlgeschlagen oder abgebrochen wurde. |
eq(variables['System.debug'], true) |
Hinweis
Release.Artifacts.{artifact-alias}.SourceBranch
entspricht Build.SourceBranch
.
Bedingungsergebnisse, wenn ein Buildvorgang abgebrochen wird
Das Abbrechen eines Builds bedeutet nicht, dass alle Phasen, Aufträge und Schritte nicht mehr ausgeführt werden. Welche Aufträge, Phasen oder Schritte nicht mehr ausgeführt werden, hängt von den von Ihnen angegebenen Bedingungen ab, und an welchem Punkt der Ausführung der Pipeline Sie den Build abgebrochen haben. Wenn das übergeordnete Element einer Phase, eines Auftrags oder eines Schritts übersprungen wird, wird die Phase, der Auftrag oder der Schritt unabhängig von den Bedingungen nicht ausgeführt.
Eine Phase, ein Auftrag oder ein Schritt wird ausgeführt, wenn die Auswertung der zugehörigen Bedingungen true
ergibt. Wenn eine Bedingung nicht den Status des übergeordneten Elements der Aufgabe berücksichtigt, kann die Aufgabe auch dann ausgeführt werden, wenn das übergeordnete Element abgebrochen wird. Um zu steuern, ob Aufträge, Phasen oder Schritte ausgeführt werden, wenn ein Build abgebrochen wird, fügen Sie eine Auftragsstatusüberprüfungsfunktion in Ihre Bedingungen ein.
Wenn Sie einen Build abbrechen, während er sich in der Warteschleife befindet, aber noch nicht ausgeführt wird, wird die gesamte Ausführung abgebrochen, einschließlich aller anderen Phasen.
Hinweis
Wenn eine Ihrer Bedingungen die Ausführung von Aufgaben auch nach dem Abbrechen des Builds ermöglicht, geben Sie einen Wert für das Abbrechen von Timeouts an, der genügend Zeit für die Aufgaben bereitstellt, die nach dem Abbrechen der Ausführung abgeschlossen werden können.
Beispiel für Phasenbedingungsergebnisse
Die folgenden Beispiele zeigen die Ergebnisse verschiedener Bedingungen, die auf Phasen festgelegt sind, wenn der Build abgebrochen wird.
Phasenbeispiel 1
In der folgenden Pipeline hängt standardmäßig stage2
davon ab stage1
, dass sie erfolgreich abgeschlossen wurde. Verfügt jedoch über einen stage2
Satz, der ausgeführt werden soll, condition
wenn der Quellzweig unabhängig vom main
Status iststage1
.
Wenn Sie einen Buildvorgang für den main
-Branch in die Warteschlange stellen und ihn während der Ausführung von stage1
abbrechen, wird stage2
trotzdem ausgeführt, da eq(variables['Build.SourceBranch'], 'refs/heads/main')
als true
ausgewertet wird.
stages:
- stage: stage1
jobs:
- job: A
steps:
- script: echo 1; sleep 30
- stage: stage2
condition: eq(variables['Build.SourceBranch'], 'refs/heads/main')
jobs:
- job: B
steps:
- script: echo 2
Phasenbeispiel 2
In der folgenden Pipeline hängt standardmäßig stage2
davon ab stage1
, dass sie erfolgreich abgeschlossen wird. Auftrag B
in stage2
verfügt über einen condition
Satz, der ausgeführt werden soll, wenn die Quell-Verzweigung ist main
.
Wenn Sie einen Build auf der Verzweigung in die main
Warteschlange stellen und ihn während der stage1
Ausführung abbrechen und stage2
dessen Aufträge überhaupt nicht ausgeführt werden, obwohl die Phase einen Auftrag enthält, dessen Bedingung ausgewertet wird true
.
stages:
- stage: stage1
jobs:
- job: A
steps:
- script: echo 1; sleep 30
- stage: stage2
jobs:
- job: B
condition: eq(variables['Build.SourceBranch'], 'refs/heads/main')
steps:
- script: echo 2
Phasenbeispiel 3
In der folgenden Pipeline hängt standardmäßig stage2
davon ab stage1
, dass sie erfolgreich abgeschlossen wird. Der schritt inside job B
within stage2
has a condition
set to run whenever the source branch is main
.
Wenn Sie einen Build auf der Verzweigung in die main
Warteschlange stellen und ihn abbrechen, während stage1
er ausgeführt wird, stage2
und der Auftrag B
überhaupt nicht ausgeführt wird, obwohl der Auftrag B
einen Schritt enthält, dessen Bedingung ausgewertet wird true
.
Stage2
wird vollständig übersprungen, weil stage1
sie abgebrochen wurde.
stages:
- stage: stage1
jobs:
- job: A
steps:
- script: echo 1; sleep 30
- stage: stage2
jobs:
- job: B
steps:
- script: echo 2
condition: eq(variables['Build.SourceBranch'], 'refs/heads/main')
Beispiel für Ergebnisse der Auftragsbedingung
Die folgenden Beispiele zeigen die Ergebnisse verschiedener Bedingungen, die für Aufträge festgelegt sind, wenn der Build abgebrochen wird.
Auftragsbeispiel 1
In der folgenden YAML-Pipeline hängt der Auftrag B
, der ausgeführt wird, von der Ausführung des Auftrags A
ab. Der Auftrag B
verfügt außerdem über einen condition
Satz, der ausgeführt werden soll, wenn der Quellzweig ist main
.
Wenn Sie einen Buildvorgang für den main
-Branch in die Warteschlange stellen und ihn während der Ausführung des Auftrags A
abbrechen, wird der Auftrag B
trotzdem ausgeführt, da condition: eq(variables['Build.SourceBranch'], 'refs/heads/main')
als true
ausgewertet wird.
jobs:
- job: A
steps:
- script: sleep 30
- job: B
dependsOn: A
condition: eq(variables['Build.SourceBranch'], 'refs/heads/main')
steps:
- script: echo step 2.1
Wenn der Auftrag nur ausgeführt werden soll, wenn der Auftrag B
A
erfolgreich ist und die Buildquelle lautet main
, müssen Sie den condition
Wert auf " and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
.
Auftragsbeispiel 2
In der folgenden YAML-Pipeline hängt der Auftrag B
vom erfolgreichen Auftrag A
ab. Auftrag verfügt über einen Satz, der ausgeführt werden soll, wenn der Auftrag B
condition
erfolgreich ist und der Buildquellzweig istA
.main
Wenn Sie einen Build auf der Verzweigung in die main
Warteschlange stellen und ihn abbrechen, während der Auftrag A
ausgeführt wird, wird der Auftrag B
nicht ausgeführt, obwohl er einen condition
hat, der true
ausgewertet wird. Die Bedingung für den Auftrag B
wird ausgewertet, false
weil der Auftrag A
nicht erfolgreich war. Daher werden Auftrag B
und die zugehörigen Schritte übersprungen.
jobs:
- job: A
steps:
- script: sleep 30
- job: B
dependsOn: A
steps:
- script: echo step 2.1
condition: and(eq(variables['Build.SourceBranch'], 'refs/heads/main'), succeeded())
Beispiel für schrittbedingungsergebnis
Sie können auch Bedingungen für Schritte festlegen. In der folgenden Pipeline ist für den Schritt 2.3 eine Bedingung (condition
) festgelegt, damit der Schritt ausgeführt wird, wenn der Quellbranch main
lautet.
Wenn Sie einen Buildvorgang für den main
-Branch in die Warteschlange stellen und ihn abbrechen, während der Schritt 2.1 oder 2.2 ausgeführt wird, wird der Schritt 2.3 trotzdem ausgeführt, da eq(variables['Build.SourceBranch'], 'refs/heads/main')
als true
ausgewertet wird.
steps:
- script: echo step 2.1
- script: echo step 2.2; sleep 30
- script: echo step 2.3
condition: eq(variables['Build.SourceBranch'], 'refs/heads/main')
Parameter in Bedingungen
Sie können Parameter in Bedingungen verwenden. Die Parametererweiterung erfolgt, bevor die Pipeline ausgeführt wird und Werte ersetzt, die von ${{ }}
den Literalparameterwerten umgeben sind. Da die Parametererweiterung vor der Bedingungsauswertung auftritt, können Sie einen Parameter in einer Pipeline deklarieren und den Parameter in eine beliebige Bedingung in dieser Pipeline einbetten.
Im condition
folgenden Beispiel werden zwei Funktionen kombiniert: succeeded()
und ${{ eq(parameters.doThing, true) }}
. Die Funktion succeeded()
überprüft, ob der vorherige Schritt erfolgreich war. Diese Funktion gibt auch zurück true
, wenn kein vorheriger Schritt vorhanden ist.
Die Funktion ${{ eq(parameters.doThing, true) }}
überprüft, ob der doThing
-Parameter gleich true
ist. Der Skriptschritt im folgenden Beispiel wird ausgeführt, da kein vorheriger Schritt vorhanden war und parameters.doThing
standardmäßig vorhanden ist true
.
parameters:
- name: doThing
default: true
type: boolean
steps:
- script: echo I did a thing
condition: and(succeeded(), ${{ eq(parameters.doThing, true) }})
Vorlagenparameter in Bedingungen
Wenn Sie einen Parameter an eine Pipelinevorlage übergeben, können Sie den Wert des Parameters in der Vorlagendatei festlegen oder templateContext verwenden, um den Parameter an die Vorlage zu übergeben.
Die folgende parameters.yml Vorlagendatei deklariert den doThing
Parameter mit einem Standardwert true
und verwendet den Parameter in einer Auftragsbedingung.
# parameters.yml
parameters:
- name: doThing
default: true
type: boolean
jobs:
- job: B
steps:
- script: echo I did a thing
condition: ${{ eq(parameters.doThing, true) }}
Die folgende azure-pipelines.yml Pipelinedefinition verweist auf den Auftrag in der parameters.yml Vorlagendatei. Die Ausgabe der Pipeline liegt I did a thing
daran, dass der Parameter doThing
standardmäßig "true" ist.
# azure-pipelines.yml
extends:
template: parameters.yml
Weitere Vorlagenparameterbeispiele finden Sie in der Referenz zur Vorlageverwendung.
Häufig gestellte Fragen
Wie kann ich einen Auftrag auslösen, wenn ein vorheriger Auftrag trotz Problemen erfolgreich abgeschlossen wurde?
Sie können das Ergebnis des vorherigen Auftrags als Bedingung verwenden. Im folgenden YAML legt der Bedingungsauftrag eq(dependencies.A.result,'SucceededWithIssues')
B
fest, der ausgeführt werden soll, nachdem der Auftrag A
mit Problemen erfolgreich war.
jobs:
- job: A
steps:
- script: echo Job A ran
- job: B
dependsOn: A
condition: eq(dependencies.A.result,'SucceededWithIssues') # targets the result of the previous job
steps:
- script: echo Job A had issues
Warum wird mein Build nach dem Abbrechen noch ausgeführt?
Dieses Problem kann auftreten, wenn eine in einer Phase konfigurierte Bedingung keine Auftragsstatus-Überprüfungsfunktion enthält. Um das Problem zu beheben, fügen Sie der Bedingung eine Auftragsstatus-Überprüfungsfunktion hinzu. Weitere Informationen finden Sie unter Bedingungsergebnisse, wenn ein Build abgebrochen wird.