Hinzufügen von Stages, Abhängigkeiten und Bedingungen
Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2019
Eine Stage ist eine logische Grenze in einer Azure DevOps-Pipeline. Stages können zum Gruppieren von Aktionen in Ihrem Softwareentwicklungsprozess (z. B. „Die App erstellen“, „Den Test ausführen“, „In der Präproduktionsumgebung bereitstellen“) verwendet werden. Eine Stage enthält mindestens einen Auftrag.
Wenn Sie mehrere Stages in einer Pipeline definieren, werden diese standardmäßig nacheinander ausgeführt. Stages können auch voneinander abhängen. Sie können das dependsOn
Schlüsselwort zum Definieren von Abhängigkeiten verwenden. Stages können auch basierend auf dem Ergebnis einer vorherigen Stage ausgeführt werden, für die Bedingungen definiert wurden.
Informationen zur Funktionsweise von Stages mit parallelen Aufträgen und Lizenzierung finden Sie unter Konfigurieren und Bezahlen von parallelen Aufträgen.
Informationen dazu, wie Stages mit anderen Teilen einer Pipeline wie Aufträgen in Beziehung stehen, finden Sie unter Schlüsselpipelinekonzepte.
Weitere Informationen zur Beziehung zwischen Stages und Teilen einer Pipeline finden Sie auch im Artikel zu den YAML-Schemastages.
Pipelineaufträge können in Phasen strukturiert werden. Phasen stellen die Hauptunterteilungen in einer Pipeline dar. Einige gute Beispiele für Phasen sind „Diese App erstellen“, „Diese Tests ausführen“ und „In der Präproduktionsumgebung bereitstellen“. Sie fungieren als logische Abgrenzungen in Ihrer Pipeline, bei denen Sie die Pipeline anhalten und verschiedene Überprüfungen durchführen können.
Jede Pipeline verfügt über mindestens eine Stage, auch wenn Sie sie nicht explizit definieren. Sie können Stages auch in einem Abhängigkeitsdiagramm anordnen, sodass eine Stage vor einer anderen ausgeführt wird. Eine Phase ist auf 256 Aufträge begrenzt.
Hinweis
Die Unterstützung für Stages wurde in Azure DevOps Server 2019.1 hinzugefügt.
Festlegen von Stages
Hinweis
Die Unterstützung für Stages wurde in Azure DevOps Server 2019.1 hinzugefügt.
Im einfachsten Fall benötigen Sie keine logischen Grenzen in Ihrer Pipeline. In diesem Fall müssen Sie das Schlüsselwort stage
nicht explizit verwenden. Sie können die Aufträge direkt in Ihrer YAML-Datei angeben.
# this has one implicit stage and one implicit job
pool:
vmImage: 'ubuntu-latest'
steps:
- bash: echo "Hello world"
# this pipeline has one implicit stage
jobs:
- job: A
steps:
- bash: echo "A"
- job: B
steps:
- bash: echo "B"
Wenn Sie Ihre Pipeline in mehreren Stages organisieren, verwenden Sie das Schlüsselwort stages
.
stages:
- stage: A
jobs:
- job: A1
- job: A2
- stage: B
jobs:
- job: B1
- job: B2
Wenn Sie einen pool
auf der Phasenebene angeben, verwenden alle in dieser Phase definierten Aufträge diesen Pool, sofern sie nicht auf Auftragsebene angegeben sind.
Hinweis
In Azure DevOps Server 2019 können Pools nur auf Auftragsebene angegeben werden.
stages:
- stage: A
pool: StageAPool
jobs:
- job: A1 # will run on "StageAPool" pool based on the pool defined on the stage
- job: A2 # will run on "JobPool" pool
pool: JobPool
Die vollständige Syntax zum Festlegen einer Stage lautet:
stages:
- stage: string # name of the stage, A-Z, a-z, 0-9, and underscore
displayName: string # friendly name to display in the UI
dependsOn: string | [ string ]
condition: string
pool: string | pool
variables: { string: string } | [ variable | variableReference ]
jobs: [ job | templateReference]
Angeben von Abhängigkeiten
Hinweis
Die Unterstützung für Stages wurde in Azure DevOps Server 2019.1 hinzugefügt.
Wenn Sie mehrere Phasen in einer Pipeline definieren, werden diese standardmäßig sequenziell in der Reihenfolge ausgeführt, in der Sie sie in der YAML-Datei definieren. Die Ausnahme ist, wenn Sie Abhängigkeiten hinzufügen. Bei Abhängigkeiten werden die Phasen in der Reihenfolge der dependsOn
-Anforderungen ausgeführt.
Pipelines müssen mindestens eine Phase ohne Abhängigkeiten enthalten.
Die Syntax zum Definieren mehrerer Stages und deren Abhängigkeiten lautet:
stages:
- stage: string
dependsOn: string
condition: string
Beispiel für Stages, die sequenziell ausgeführt werden:
# if you do not use a dependsOn keyword, stages run in the order they are defined
stages:
- stage: QA
jobs:
- job:
...
- stage: Prod
jobs:
- job:
...
Beispiel für Stages, die parallel ausgeführt werden:
stages:
- stage: FunctionalTest
jobs:
- job:
...
- stage: AcceptanceTest
dependsOn: [] # this removes the implicit dependency on previous stage and causes this to run in parallel
jobs:
- job:
...
Beispiel für das Auffächern nach innen und nach außen:
stages:
- stage: Test
- stage: DeployUS1
dependsOn: Test # this stage runs after Test
- stage: DeployUS2
dependsOn: Test # this stage runs in parallel with DeployUS1, after Test
- stage: DeployEurope
dependsOn: # this stage runs after DeployUS1 and DeployUS2
- DeployUS1
- DeployUS2
Definieren von Bedingungen
Sie können die Bedingungen angeben, unter denen jede Stage mit Ausdrücken ausgeführt wird. Standardmäßig wird eine Stage ausgeführt, wenn sie nicht von einer anderen Stage abhängt oder wenn alle Stages, von denen sie abhängt, abgeschlossen und erfolgreich sind. Sie können dieses Verhalten anpassen, indem Sie die Ausführung einer Stage erzwingen, auch wenn eine vorherige Stage fehlschlägt, oder indem Sie eine benutzerdefinierte Bedingung angeben.
Wenn Sie die Standardbedingung der vorherigen Schritte für eine Stage anpassen, entfernen Sie die Bedingungen für Abschluss und Erfolg. Wenn Sie also eine benutzerdefinierte Bedingung verwenden, wird häufig mithilfe von and(succeeded(),custom_condition)
überprüft, ob die vorherige Stage erfolgreich ausgeführt wurde. Andernfalls wird die Stage unabhängig vom Ergebnis der vorherigen Stage ausgeführt.
Hinweis
Bedingungen für fehlgeschlagene ('JOBNAME/STAGENAME') und erfolgreiche ('JOBNAME/STAGENAME') wie im folgenden Beispiel gezeigt funktionieren nur für YAML-Pipelines.
Hinweis
Die Unterstützung für Stages wurde in Azure DevOps Server 2019.1 hinzugefügt.
Beispiel für die Ausführung einer Stage basierend auf dem Status der Ausführung einer vorherigen Stage:
stages:
- stage: A
# stage B runs if A fails
- stage: B
condition: failed()
# stage C runs if B succeeds
- stage: C
dependsOn:
- A
- B
condition: succeeded('B')
Beispiel für die Verwendung einer benutzerdefinierten Bedingung:
stages:
- stage: A
- stage: B
condition: and(succeeded(), eq(variables['build.sourceBranch'], 'refs/heads/main'))
Festlegen von Warteschlangenrichtlinien
YAML-Pipelines unterstützen keine Warteschlangenrichtlinien. Jede Ausführung einer Pipeline ist unabhängig von anderen Ausführungen. Anders ausgedrückt: Ihre beiden aufeinander folgenden Commits können zwei Pipelines auslösen, und beide führen die gleiche Sequenz von Stages aus, ohne aufeinander zu warten. Während wir daran arbeiten, Warteschlangenrichtlinien in YAML-Pipelines einzusetzen, empfiehlt es sich, manuelle Genehmigungen zu verwenden, um die Reihenfolge der Ausführung bei Bedarf manuell steuern zu können.
Festlegen von Genehmigungen
Mithilfe von Genehmigungsüberprüfungen können Sie manuell steuern, wann eine Stage ausgeführt werden soll. Diese Überprüfung wird häufig verwendet, um Bereitstellungen in Produktionsumgebungen zu steuern. Überprüfungen sind ein Mechanismus, der dem Ressourcenbesitzer zur Verfügung steht, um zu steuern, ob und wann eine Stage in einer Pipeline eine Ressource nutzen kann. Als Besitzer*in einer Ressource, z. B. einer Umgebung, können Sie Überprüfungen definieren, die bestanden werden müssen, bevor eine Stage, die diese Ressource nutzt, beginnen kann.
Derzeit werden manuelle Genehmigungsprüfungen in Umgebungen unterstützt. Weitere Informationen finden Sie unter Genehmigungen.
Genehmigungen werden in YAML-Pipelines in dieser Version von Azure DevOps Server noch nicht unterstützt.
Manuellen Trigger hinzufügen
Manuell ausgelöste YAML-Pipelinephasen ermöglichen es Ihnen, eine einheitliche Pipeline zu haben, ohne sie immer zum Abschluss auszuführen.
Ihre Pipeline kann z. B. Phasen für das Erstellen, Testen, Bereitstellen in einer Stagingumgebung und die Bereitstellung in der Produktion umfassen. Möglicherweise möchten Sie, dass alle Phasen automatisch ausgeführt werden, mit Ausnahme der Produktionsbereitstellung, die Sie bei Bedarf manuell auslösen möchten.
Um dieses Feature zu verwenden, fügen Sie die trigger: manual
Eigenschaft zu einer Phase hinzu.
Im folgenden Beispiel wird die Entwicklungsphase automatisch ausgeführt, während für die Produktionsphase manuelles Auslösen erforderlich ist. Beide Phasen führen ein Hello World-Ausgabeskript aus.
stages:
- stage: development
displayName: Deploy to development
jobs:
- job: DeployJob
steps:
- script: echo 'hello, world'
displayName: 'Run script'
- stage: production
displayName: Deploy to production
trigger: manual
jobs:
- job: DeployJob
steps:
- script: echo 'hello, world'
displayName: 'Run script'
Eine Phase als nicht überspringbar markieren
Markieren Sie eine Phase, um isSkippable: false
zu verhindern, dass Pipelinebenutzer Phasen überspringen. Beispielsweise verfügen Sie möglicherweise über eine YAML-Vorlage, die eine Phase einführt, die Schadsoftwareerkennung in allen Pipelines durchführt. Wenn Sie diese Phase festlegen isSkippable: false
, kann Pipeline die Erkennung von Schadsoftware nicht überspringen.
Im folgenden Beispiel wird die Malware-Erkennungsphase als nicht überspringbar gekennzeichnet, d. h. sie muss als Teil der Pipelineausführung ausgeführt werden.
- stage: malware_detection
displayName: Malware detection
isSkippable: false
jobs:
- job: check_job
...
Wenn eine Phase nicht überspringbar ist, wird sie mit einem deaktivierten Kontrollkästchen im Abschnitt „Phasen” angezeigt, um den Konfigurationsbereich auszuführen.