Sdílet prostřednictvím


Přidání fází, závislostí a podmínek

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

Fáze je logická hranice v pipeline Azure DevOps. Fáze seskupují akce ve vašem procesu vývoje softwaru, jako je sestavení aplikace, spouštění testů a nasazení do předprodukce. Každá fáze obsahuje jednu nebo více úloh.

Když v pipelině definujete více fází, spustí se ve výchozím nastavení jedna po druhé. Fáze můžou záviset také na sobě. Pomocí klíčového dependsOn slova můžete definovat závislosti. Fáze se můžou spouštět také na základě výsledku předchozí fáze s podmínkami.

Informace o tom, jak fáze fungují s paralelními úlohami a licencováním, najdete v tématu Konfigurace a platba za paralelní úlohy.

Pro informace o tom, jak fáze souvisejí s jinými částmi dataového toku, jako jsou úlohy, se podívejte na Klíčové koncepty dataových toků.

Další informace o tom, jak fáze souvisejí s částmi kanálu, najdete v článku fáze schématu YAML.

Úlohy potrubí můžete uspořádat do fází. Fáze jsou hlavními částmi v rámci pipeline: sestavení této aplikace, spuštění těchto testů a nasazení do předprodukce jsou dobrými příklady těchto fází. Jedná se o logické hranice ve vašem kanálu, kde můžete kanál pozastavit a provádět různé kontroly.

Každý kanál má alespoň jednu fázi, i když ho explicitně nedefinujete. Fáze můžete také uspořádat do grafu závislostí tak, aby se jedna fáze spustila před druhou. Fáze může mít až 256 úloh.

Určení fází

V nejjednodušším případě nepotřebujete v kanálu logické hranice. Pro tyto scénáře můžete přímo zadat úlohy v souboru YAML bez klíčového stages slova. Pokud máte například jednoduchý kanál, který sestaví a testuje malou aplikaci bez nutnosti samostatných prostředí nebo kroků nasazení, můžete definovat všechny úlohy přímo bez použití fází.

pool:
  vmImage: 'ubuntu-latest'

jobs:
- job: BuildAndTest
  steps:
  - script: echo "Building the application"
  - script: echo "Running tests"

Toto potrubí má jednu implicitní fázi a dvě úlohy. Klíčové stages slovo se nepoužívá, protože existuje jen jedna fáze.

jobs:
- job: Build
  steps:
  - bash: echo "Building"

- job: Test
  steps:
  - bash: echo "Testing"

Pokud chcete kanál uspořádat do několika fází, použijte stages klíčové slovo. Tento YAML definuje kanál se dvěma fázemi, kde každá fáze obsahuje více úloh a každá úloha má konkrétní kroky ke spuštění.

stages:
- stage: A
  displayName: "Stage A - Build and Test"
  jobs:
  - job: A1
    displayName: "Job A1 - build"
    steps:
    - script: echo "Building the application in Job A1"
      displayName: "Build step"
  - job: A2
    displayName: "Job A2 - Test"
    steps:
    - script: echo "Running tests in Job A2"
      displayName: "Test step"

- stage: B
  displayName: "Stage B - Deploy"
  jobs:
  - job: B1
    displayName: "Job B1 - Deploy to Staging"
    steps:
    - script: echo "Deploying to staging in Job B1"
      displayName: "Staging deployment step"
  - job: B2
    displayName: "Job B2 - Deploy to Production"
    steps:
    - script: echo "Deploying to production in Job B2"
      displayName: "Production deployment step"

Pokud zadáte pool na úrovni fáze, všechny úlohy v této fázi použijí tento fond, pokud není pool určen na úrovni úlohy.

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

Určení závislostí

Když v potrubí definujete více fází, ve výchozím nastavení se spouští postupně podle pořadí, v jakém je definuje soubor YAML. Výjimkou je přidání závislostí. V případě závislostí se fáze spouští podle pořadí dependsOn požadavků.

Kanály musí obsahovat alespoň jednu fázi bez závislostí.

Další informace o definování fází najdete ve fázích ve schématu YAML.

Následující ukázkové fáze se spouštějí postupně. Pokud klíčové slovo nepoužíváte dependsOn , fáze se spouštějí v pořadí, ve kterém jsou definované.

stages:
- stage: Build
  displayName: "Build Stage"
  jobs:
  - job: BuildJob
    steps:
    - script: echo "Building the application"
      displayName: "Build Step"

- stage: Test
  displayName: "Test Stage"
  jobs:
  - job: TestJob
    steps:
    - script: echo "Running tests"
      displayName: "Test Step"

Ukázkové fáze, které běží paralelně:

stages:
- stage: FunctionalTest
  displayName: "Functional Test Stage"
  jobs:
  - job: FunctionalTestJob
    steps:
    - script: echo "Running functional tests"
      displayName: "Run Functional Tests"

- stage: AcceptanceTest
  displayName: "Acceptance Test Stage"
  dependsOn: [] # Runs in parallel with FunctionalTest
  jobs:
  - job: AcceptanceTestJob
    steps:
    - script: echo "Running acceptance tests"
      displayName: "Run Acceptance Tests"

Příklad chování fan-out a fan-in:

stages:
- stage: Test

- stage: DeployUS1
  dependsOn: Test    #  stage runs after Test

- stage: DeployUS2
  dependsOn: Test    # stage runs in parallel with DeployUS1, after Test

- stage: DeployEurope
  dependsOn:         # stage runs after DeployUS1 and DeployUS2
  - DeployUS1
  - DeployUS2

Definování podmínek

Můžete určit podmínky, za kterých se jednotlivé fáze spouštějí pomocí výrazů. Ve výchozím nastavení se fáze spustí, pokud nezávisí na žádné jiné fázi, nebo pokud byly všechny fáze, na kterých závisí, úspěšně dokončeny. Toto chování můžete přizpůsobit vynucením spuštění fáze, i když předchozí fáze selže nebo zadáte vlastní podmínku.

Pokud upravíte výchozí podmínku pro fázi v předchozích krocích, odstraníte podmínky pro jejich dokončení a úspěšné splnění. Pokud tedy používáte vlastní podmínku, je běžné zkontrolovat and(succeeded(),custom_condition) , jestli se předchozí fáze úspěšně spustila. V opačném případě se fáze spustí bez ohledu na výsledek předchozí fáze.

Poznámka:

Podmínky pro selhání ('JOBNAME/STAGENAME') a úspěch ('JOBNAME/STAGENAME'), jak je znázorněno v následujícím příkladu, fungují pouze pro YAML kanály.

Příklad spuštění fáze na základě stavu spuštění předchozí fáze:

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

Příklad použití vlastní podmínky:

stages:
- stage: A

- stage: B
  condition: and(succeeded(), eq(variables['build.sourceBranch'], 'refs/heads/main'))

Zadání zásad řízení front

Kanály YAML nepodporují zásady frontování. Každé spuštění kanálu je nezávislé a neví o ostatních spuštěních. Jinými slovy, vaše dva po sobě jdoucí commity můžou aktivovat dvě pipeliny, a obě provedou stejnou sekvenci fází, aniž by na sebe čekaly. Zatímco pracujeme na zavedení front ve kanálech YAML, doporučujeme použít ruční schvalování, abyste mohli řídit pořadí provádění ručně, pokud je to důležité.

Určete schválení

Pomocí kontrol schválení můžete ručně řídit, kdy se má fáze spustit. To se běžně používá k řízení nasazení do produkčních prostředí. Kontroly jsou mechanismus, který je k dispozici vlastníku prostředku, aby řídil, zda a kdy fáze v potrubí může prostředek využívat. Jako vlastník prostředku, jako je například prostředí, můžete definovat kontroly, které musí být splněny před tím, než může začít fáze, která daný prostředek využívá.

V současné době jsou v prostředích podporovány kontroly ručního schvalování. Další informace najdete v tématu Schválení.

Přidat ruční spouštěč

Ručně spouštěné fáze potrubí YAML umožňují mít sjednocené potrubí, aniž by bylo nutné ho vždy dokončit.

Kanál může například zahrnovat fáze sestavení, testování, nasazení do přípravného prostředí a nasazení do produkčního prostředí. Můžete chtít, aby se všechny fáze spouštěly automaticky s výjimkou produkčního nasazení, které chcete aktivovat ručně, až budete připraveni.

Chcete-li tuto funkci použít, přidejte vlastnost trigger: manual ke fázi.

V následujícím příkladu se fáze vývoje spustí automaticky, zatímco produkční fáze vyžaduje ruční aktivaci. Obě fáze spouští výstupní skript Hello World.

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'

Označení fáze jako nepřeskočitelné

Označte fázi jako isSkippable: false, abyste zabránili uživatelům kanálu ve vynechání fází. Můžete mít například šablonu YAML, která vloží fázi, která provádí detekci malwaru ve všech kanálech. Pokud nastavíte isSkippable: false pro tuto fázi, váš kanál nebude moct přeskočit detekci malwaru.

V následujícím příkladu je fáze detekce malwaru označena jako nepřeskočitelná, což znamená, že musí být provedena jako součást spuštění pipeline.

- stage: malware_detection
  displayName: Malware detection
  isSkippable: false
  jobs:
  - job: check_job
    ...

Pokud je fáze nepřeskočitelná, zobrazí se v konfiguračním panelu Fáze ke spuštění s deaktivovaným zaškrtávacím políčkem.

Snímek obrazovky s fázemi ke spuštění, když je jedna fáze zakázána.