Zadání podmínek

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

Můžete zadat podmínky, za kterých budou jednotlivé fáze, úlohy nebo kroky spuštěny. Ve výchozím nastavení se úloha nebo fáze spustí, pokud nezávisí na žádné jiné úloze nebo dílčí fázi, nebo pokud všechny úlohy nebo fáze závisí na dokončení a úspěšném dokončení. To zahrnuje nejen přímé závislosti, ale také jejich závislosti, rekurzivně vypočítané. Ve výchozím nastavení se krok spustí, pokud v jeho úloze ještě nic neselhalo a je dokončený krok, který mu bezprostředně předchází. Toto chování můžete upravit tak, že vynutíte spuštění fáze, úlohy nebo kroku, i když předchozí závislost selže, nebo zadáte vlastní podmínku.

Můžete zadat podmínky, za kterých se krok, úloha nebo fáze spustí.

  • Pouze pokud byly všechny předchozí přímé a nepřímé závislosti se stejným fondem agentů úspěšné. Pokud máte různé fondy agentů, tyto fáze nebo úlohy se spustí souběžně. Toto je výchozí nastavení, pokud v YAML není nastavená podmínka.

  • I v případě, že předchozí závislost selhala, pokud nebylo spuštění zrušeno. Použije succeededOrFailed() se v YAML pro tuto podmínku.

  • I když došlo k selhání předchozí závislosti, i když se spuštění zrušilo. Použije always() se v YAML pro tuto podmínku.

  • Pouze v případech, kdy předchozí závislost selhala. Použije failed() se v YAML pro tuto podmínku.

  • Vlastní podmínky

Ve výchozím nastavení se kroky, úlohy a fáze spustí, pokud byly všechny přímé a nepřímé závislosti úspěšné. Je to jako kdybyste zadali podmínku: succeeded() (viz úspěšná stavová funkce).

jobs:
- job: Foo

  steps:
  - script: echo Hello!
    condition: always() # this step will always run, even if the pipeline is canceled

- job: Bar
  dependsOn: Foo
  condition: failed() # this job will only run if Foo fails

Proměnné můžete použít také v podmínkách.

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)

Podmínky se vyhodnocují tak, aby se rozhodovaly, jestli se má spustit fáze, úloha nebo krok. To znamená, že v této jednotce práce nebude k dispozici nic vypočítané za běhu. Pokud máte například úlohu, která nastaví proměnnou pomocí výrazu modulu runtime pomocí $[ ] syntaxe, nemůžete tuto proměnnou použít ve vlastní podmínce.

YAML se v TFS nepodporuje.

Poznámka:

Když zadáte vlastní condition vlastnost pro fázi / úlohu / krok, přepíšete jeho výchozí condition: succeeded(). To může vést ke spuštění fáze nebo úlohy nebo kroku, i když je sestavení zrušeno. Při psaní vlastních podmínek nezapomeňte vzít v úvahu stav nadřazené fáze nebo úlohy.

Povolení vlastní podmínky

Pokud předdefinované podmínky nevyhovují vašim potřebám, můžete zadat vlastní podmínky.

Podmínky se zapisují jako výrazy v kanálech YAML. Agent vyhodnotí výraz počínaje nejvnitřnější funkcí a postupuje směrem ven. Konečným výsledkem je logická hodnota, která určuje, zda se daný úkol, úloha nebo fáze má spustit, nebo ne. Úplný průvodce syntaxí najdete v článku o výrazech.

Umožňuje některá z vašich podmínek, aby se úloha spustila i v případě, že uživatel zrušil sestavení? Pokud ano, zadejte přiměřenou hodnotu pro vypršení časového limitu zrušení, aby tyto druhy úkolů měly dostatek času na dokončení po zrušení spuštění uživatelem.

Chování kanálu při zrušení sestavení

Když se sestavení zruší, neznamená to, že všechny jeho fáze, úlohy nebo kroky přestanou běžet. Rozhodnutí závisí na zadané fázi, úloze nebo kroku conditions a v jakém okamžiku spuštění kanálu jste zrušili sestavení.

Pokud vaše podmínka nebere v úvahu stav nadřazené fáze nebo úlohy / kroku, pak pokud se podmínka vyhodnotí jako true, vaše fáze, úloha nebo krok se spustí, a to i v případě, že je jeho nadřazený objekt zrušen. Pokud je nadřazený objekt vynechán, vaše fáze, úloha nebo krok se nespustí.

Podívejme se na několik příkladů.

Ve výchozím nastavení stage2stage1 závisí na tomto kanálu a stage2 má sadu condition . stage2 spustí se pouze v případech, kdy je mainzdrojová větev .

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

Pokud zařadíte sestavení do fronty main ve větvi a zrušíte ho během stage1 běhu, stage2 bude se stále spouštět, protože eq(variables['Build.SourceBranch'], 'refs/heads/main') se vyhodnotí jako true.

V tomto kanálu stage2 závisí na stage1. Úloha B má pro ni nastavenou condition sadu.

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

Pokud zařadíte sestavení do fronty main ve větvi a zrušíte ho během stage1 běhu, nespustí se,stage2 i když obsahuje úlohuB, jejíž podmínka se vyhodnotí jako true. Důvodem je to, že stage2 má výchozí hodnotu condition: succeeded(), která se vyhodnotí jako false zrušená stage1 . stage2 Proto se přeskočí a nespustí se žádná z jejích úloh.

Řekněme, že máte následující kanál YAML. Všimněte si, stage2 že ve výchozím nastavení závisí na stage1 nastavení a je script: echo 2 pro ni nastavená condition .

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

Pokud zařadíte sestavení do main fronty ve větvi a zrušíte ho během stage1 běhu, nespustí se, stage2i když obsahuje krok v úlozeB, jejíž podmínka se vyhodnotí jako true. Důvodem je to, že stage2 se v reakci na stage1 zrušení přeskočí.

Pokud chcete zabránit spuštění fází, úloh nebo kroků se spuštěním conditions při zrušení sestavení, při zápisu nezapomeňte zvážit stav nadřazeného objektu conditions. Další informace najdete v tématu Funkce stavu úlohy.

Příklady

Spuštění pro hlavní větev, i když je zrušená, i když selhává

eq(variables['Build.SourceBranch'], 'refs/heads/main')

Spuštění pro hlavní větev, pokud bude úspěšné

and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))

Pokud větev není hlavní, spusťte ji, pokud je úspěšná.

and(succeeded(), ne(variables['Build.SourceBranch'], 'refs/heads/main'))

Spuštění větví tématu uživatele, pokud je úspěšné

and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/heads/users/'))

Pokud se úspěšně spustí sestavení kontinuální integrace (CI), spusťte je.

and(succeeded(), in(variables['Build.Reason'], 'IndividualCI', 'BatchedCI'))

Spuštění, pokud je sestavení spuštěné zásadou větve pro žádost o přijetí změn, pokud selhává

and(failed(), eq(variables['Build.Reason'], 'PullRequest'))

Spuštění, pokud je naplánované sestavení, i když selhává, i když je zrušeno

eq(variables['Build.Reason'], 'Schedule')

Release.Artifacts. {artifact-alias}. SourceBranch je ekvivalentem Build.SourceBranch.

Vždy se spusťte, pokud je proměnná nastavená na true, i když je zrušená, i když selhává.

eq(variables['System.debug'], true)

Spuštění, pokud má proměnná hodnotu null (prázdný řetězec)

Vzhledem k tomu, že všechny proměnné se v Azure Pipelines považují za řetězce, je prázdný řetězec v tomto kanálu ekvivalentní null .

variables:
- name: testEmpty
  value: ''

jobs:
  - job: A
    steps:
    - script: echo testEmpty is blank
    condition: eq(variables.testEmpty, '')

Použití parametru šablony jako součásti podmínky

Pokud deklarujete parametr ve stejném kanálu jako podmínku, dojde k rozšíření parametru dříve, než se zohlední podmínky. V tomto případě můžete parametry vložit do podmínek. Skript v tomto souboru YAML se spustí, protože parameters.doThing je true.

Kanál condition kombinuje dvě funkce: succeeded() a eq('${{ parameters.doThing }}', true). Funkce succeeded() zkontroluje, jestli předchozí krok proběhl úspěšně. Funkce succeeded() vrátí hodnotu true, protože neexistuje žádný předchozí krok.

Funkce eq('${{ parameters.doThing }}', true) zkontroluje, zda je parametr doThing roven true. Vzhledem k tomu, že výchozí hodnota pro doThing je true, vrátí podmínka ve výchozím nastavení hodnotu true, pokud se v kanálu nenastaví jiná hodnota.

Další příklady parametrů šablon najdete v tématu Typy šablon a použití.

parameters:
- name: doThing
  default: true
  type: boolean

steps:
- script: echo I did a thing
  condition: ${{ eq(parameters.doThing, true) }}

Když předáte parametr šabloně, musíte nastavit hodnotu parametru v šabloně nebo použít templateContext k předání vlastností šabloně.

# parameters.yml
parameters:
- name: doThing
  default: true # value passed to the condition
  type: boolean

jobs:
  - job: B
    steps:
    - script: echo I did a thing
    condition: ${{ eq(parameters.doThing, true) }}
# azure-pipeline.yml
parameters:
- name: doThing
  default: true 
  type: boolean

trigger:
- none

extends:
  template: parameters.yml

Výstupem tohoto kanálu je I did a thing skutečnost, že parametr doThing je pravdivý.

Použití výstupní proměnné z úlohy v podmínce v následující úloze

Proměnnou můžete zpřístupnit pro budoucí úlohy a zadat ji v podmínce. Proměnné dostupné pro budoucí úlohy musí být označeny jako výstupní proměnné s více úlohami pomocí isOutput=true.

jobs:
- job: Foo
  steps:
  - bash: |
      echo "This is job Foo."
      echo "##vso[task.setvariable variable=doThing;isOutput=true]Yes" #set variable doThing to Yes
    name: DetermineResult
- job: Bar
  dependsOn: Foo
  condition: eq(dependencies.Foo.outputs['DetermineResult.doThing'], 'Yes') #map doThing and check the value
  steps:
  - script: echo "Job Foo ran and doThing is Yes."

Použití proměnné kanálu vytvořené z kroku v podmínce v následujícím kroku

Proměnnou můžete zpřístupnit pro budoucí kroky a zadat ji v podmínce. Ve výchozím nastavení jsou proměnné vytvořené z kroku k dispozici pro budoucí kroky a není nutné je označit jako výstupní proměnné s více úlohami pomocí isOutput=true.

Je potřeba si uvědomit několik důležitých věcí týkajících se výše uvedeného přístupu a rozsahu:

  • Proměnné vytvořené v kroku v úloze budou vymezeny na kroky ve stejné úloze.
  • Proměnné vytvořené v kroku budou k dispozici pouze v následných krocích jako proměnné prostředí.
  • Proměnné vytvořené v kroku nelze použít v kroku, který je definuje.

Níže je příklad vytvoření proměnné kanálu v kroku a použití proměnné v podmínce a skriptu dalšího kroku.

steps:

# This step creates a new pipeline variable: doThing. This variable will be available to subsquent steps.
- bash: |
    echo "##vso[task.setvariable variable=doThing]Yes"
  displayName: Step 1

# This step is able to use doThing, so it uses it in its condition
- script: |
    # You can 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'))

Často kladené dotazy

Jak se dá aktivovat úloha, pokud předchozí úloha proběhla úspěšně, ale s problémy?

Můžete použít výsledek předchozí úlohy. Například v tomto souboru YAML podmínka eq(dependencies.A.result,'SucceededWithIssues') umožňuje spuštění úlohy, protože úloha A byla úspěšná s problémy.

jobs:
- job: A
  displayName: Job A
  continueOnError: true # next job starts even if this one fails
  steps:
  - script: echo Job A ran
  - script: exit 1

- job: B
  dependsOn: A
  condition: eq(dependencies.A.result,'SucceededWithIssues') # targets the result of the previous job 
  displayName: Job B
  steps:
  - script: echo Job B ran

Zrušil(a) jsem sestavení, ale pořád běží. Co se děje?

K tomuto problému dojde v případě, že podmínka nakonfigurovaná ve fázi neobsahuje funkci kontroly stavu úlohy. Pokud chcete tento problém vyřešit, přidejte do podmínky funkci kontroly stavu úlohy. Pokud zrušíte úlohu v době, kdy je ve frontě, ale není spuštěná, zruší se celá úloha včetně všech ostatních fází.

Přečtěte si další informace o chování kanálu při zrušení sestavení.