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.