Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022
Tento článek popisuje různé podmínky, které umožňují spuštění fáze, úlohy nebo kroku Azure Pipelines a nastavení těchto podmínek v definici kanálu YAML.
Poznámka:
Tento článek popisuje možnosti kanálu YAML. U klasických kanálů můžete zadat určité podmínky, za kterých se úlohy nebo úlohy spouštějí v možnostech řízení jednotlivých úloh, a v dalších možnostech úlohy v kanálu verze.
Podmínky spuštění fáze, úlohy nebo kroku v části
Ve výchozím nastavení se úloha kanálu nebo fáze spustí, pokud nezávisí na žádné jiné úloze nebo dílčí fázi, nebo pokud jsou všechny její závislosti dokončené a úspěšné. Požadavek na závislost se vztahuje na přímé závislosti a na jejich nepřímé závislosti vypočítané rekurzivně.
Ve výchozím nastavení se krok spustí, pokud v úloze ještě nic selhalo a krok bezprostředně před dokončením. Další kontext fází, úloh a kroků najdete v tématu Klíčové koncepty pro Azure Pipelines.
Toto výchozí chování můžete přepsat nebo přizpůsobit nastavením fáze, úlohy nebo kroku ke spuštění, a to i v případě, že předchozí závislost selže nebo má jiný výsledek. Můžete také definovat vlastní podmínky. V definici kanálu YAML použijete condition vlastnost k určení podmínek, za kterých se může spustit fáze, úloha nebo krok.
Poznámka:
Podmínky platí pro všechny předchozí přímé a nepřímé závislosti se stejným fondem agentů. Fáze nebo úlohy v různých fondech agentů běží souběžně.
Mezi podmínky založené na předchozím stavu závislosti patří:
-
Úspěch: Spusťte pouze v případě, že všechny předchozí závislosti budou úspěšné. Toto chování je výchozí, pokud v YAML není nastavena žádná podmínka. Chcete-li použít tuto podmínku, zadejte
condition: succeeded(). -
Úspěšné nebo neúspěšné: Spusťte i v případě selhání předchozí závislosti, pokud není spuštění zrušeno. Chcete-li použít tuto podmínku, zadejte
condition: succeededOrFailed(). -
Vždy: Spusťte i v případě selhání předchozí závislosti, i když je spuštění zrušeno. Chcete-li použít tuto podmínku, zadejte
condition: always(). -
Selhání: Spusťte pouze v případě, že předchozí závislost selže. Chcete-li použít tuto podmínku, zadejte
condition: failed().
Důležité
Když zadáte condition vlastnost pro fázi, úlohu nebo krok, přepíšete výchozí podmínku. Vaše fáze, úloha nebo krok se může spustit i v případě, že je sestavení zrušeno. Ujistěte se, že vaše podmínky berou v úvahu stav nadřazené fáze nebo úlohy.
Příklad podmínky
Následující příklad YAML ukazuje podmínky always() a failed() ujednání. První úloha skriptu v úloze 1 má podmínku always , takže se spustí i v případě selhání závislostí nebo zrušení sestavení. Ve druhé úloze skriptu exit job1 způsobí selhání úlohy job1.
Fáze kanálu se ve výchozím nastavení spouštějí postupně, ale úlohy se můžou spouštět paralelně. Pomocí vlastnosti můžete dependsOn explicitně definovat závislosti mezi fázemi nebo úlohami.
Chcete-li nastavit podmínky pro úlohu, která závisí na výsledku jiné úlohy, použijte dependsOn k definování závislosti. V následujícím příkladu závisí na job2 spuštění a spuštění, job1 protože job1 selže.
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
Poznámka:
Uživatelské rozhraní Azure Pipelines můžete také použít k ručnímu spuštění závislých fází v případě selhání nadřazené fáze. Další informace najdete v tématu Spouštění podřízených fází, když se nadřazená fáze nezdaří.
Vlastní podmínky
Pokud předdefinované podmínky nevyhovují vašim potřebám, můžete jako výrazy v definicích kanálu YAML zadat vlastní podmínky.
Agent vyhodnotí výraz od nejvnitřnější funkce a pokračuje směrem ven. Konečný výsledek je logická hodnota, která určuje, jestli se má fáze, úloha nebo krok spustit, nebo ne. Úplný průvodce syntaxí najdete v tématu Výrazy.
Důležité
Podmínky se vyhodnocují a určují, jestli se má spustit fáze, úloha nebo krok. Proto není k dispozici nic vypočítané během běhu fáze, úlohy nebo kroku pro použití ve stejné fázi, úloze nebo kroku. Pokud například nastavíte proměnnou v úloze pomocí výrazu modulu runtime se $[ ] syntaxí, nemůžete tuto proměnnou použít v podmínkách v rámci této úlohy.
Proměnné v podmínkách
Proměnné kanálu můžete nastavit a použít je v podmínkách. Následující kanál nastaví proměnnou isMain a použije ji v podmínce, která spouští fázi B pouze v případech, kdy je mainzdrojová větev sestavení .
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ínku můžete nastavit tak, aby se spustila, pokud má proměnná hodnotu null nebo prázdný řetězec. Všechny proměnné se v Azure Pipelines považují za řetězce, takže prázdný řetězec je ekvivalentní null v následujícím kanálu:
variables:
- name: testEmpty
value: ''
jobs:
- job: A
steps:
- script: echo testEmpty is blank
condition: eq(variables.testEmpty, '')
Výstupní proměnné úlohy použité v jiných podmínkách úlohy
Proměnnou můžete vytvořit v úloze, kterou mohou jiné úlohy ve stejné fázi zadat v podmínkách. Proměnné, které jsou dostupné pro závislé úlohy, musí být označeny jako výstupní proměnné s více úlohami , isOutput=truejak je znázorněno v následujícím kódu:
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."
Proměnné kroku použité v dalších podmínkách kroku
Proměnnou můžete vytvořit v kroku, který budoucí kroky ve stejné úloze můžou určovat v podmínkách. Proměnné vytvořené z kroků jsou ve výchozím nastavení dostupné pro budoucí kroky v úloze a není nutné je označit jako výstupní proměnné s více úlohami.
Proměnné vytvořené v kroku v úloze mají následující omezení:
- Jsou vymezeny na kroky ve stejné úloze.
- Jsou k dispozici v dalších krocích pouze jako proměnné prostředí.
- Nejde použít ve stejném kroku, který je definuje.
Následující příklad vytvoří v kroku proměnnou kanálu a použije ji v podmínce skriptu pozdějšího kroku.
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'))
Nastavení podmínky pro různé výsledky
Následující tabulka ukazuje condition nastavení pro vytvoření různých požadovaných výsledků.
| Požadovaný výsledek | Příklad nastavení podmínky |
|---|---|
Spusťte, pokud je mainzdrojová větev , a to i v případě, že nadřazená nebo předchozí fáze, úloha nebo krok selhaly nebo byly zrušeny. |
eq(variables['Build.SourceBranch'], 'refs/heads/main') |
Spusťte, pokud je main zdrojová větev a nadřazená nebo předchozí fáze, úloha nebo krok proběhly úspěšně. |
and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main')) |
Spusťte, pokud zdrojová větev není maina nadřazená nebo předchozí fáze, úloha nebo krok proběhly úspěšně. |
and(succeeded(), ne(variables['Build.SourceBranch'], 'refs/heads/main')) |
Spusťte větve user , pokud byla nadřazená nebo předchozí fáze, úloha nebo krok úspěšné. |
and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/heads/users/')) |
| Spusťte sestavení kontinuální integrace (CI), pokud úspěšně proběhla nadřazená nebo předchozí fáze, úloha nebo krok. | and(succeeded(), in(variables['Build.Reason'], 'IndividualCI', 'BatchedCI')) |
| Spusťte, pokud žádost o přijetí změn aktivovala sestavení a nadřazenou nebo předchozí fázi, úlohu nebo krok selhaly. | and(failed(), eq(variables['Build.Reason'], 'PullRequest')) |
| Spusťte naplánované sestavení, a to i v případě, že nadřazená nebo předchozí fáze, úloha nebo krok selhaly nebo byly zrušeny. | eq(variables['Build.Reason'], 'Schedule') |
Spusťte, System.debug pokud je proměnná nastavená na true, i když nadřazená nebo předchozí fáze, úloha nebo krok selhaly nebo byly zrušeny. |
eq(variables['System.debug'], true) |
Poznámka:
Release.Artifacts.{artifact-alias}.SourceBranch je ekvivalent Build.SourceBranch.
Výsledky podmínek při zrušení buildu
Zrušení sestavení neznamená, že všechny její fáze, úlohy a kroky přestanou běžet. Které úlohy, fáze nebo kroky se zastaví, závisí na zadaných podmínkách a v jakém okamžiku spuštění kanálu jste zrušili sestavení. Pokud se nadřazená fáze, úloha nebo krok přeskočí, fáze, úloha nebo krok se nespustí bez ohledu na její podmínky.
Fáze, úloha nebo krok se spustí pokaždé, když se její podmínky vyhodnotí jako true. Pokud podmínka neodpovídá stavu nadřazeného úkolu, může se úloha spustit i v případě, že je jeho nadřazený objekt zrušen. Pokud chcete určit, jestli se úlohy, fáze nebo kroky spustí při zrušení sestavení, zahrňte do podmínek funkci kontroly stavu úlohy .
Pokud zrušíte sestavení v době, kdy je ve fázi fronty, ale ještě není spuštěné, celé spuštění se zruší, včetně všech ostatních fází.
Poznámka:
Pokud některé z vašich podmínek umožní spuštění úkolů i po zrušení sestavení, zadejte hodnotu pro vypršení časového limitu zrušení , která poskytuje dostatek času na dokončení úkolů po zrušení spuštění.
Příklady výsledků podmínky fáze
Následující příklady ukazují výsledky různých podmínek nastavených ve fázích při zrušení sestavení.
Příklad fáze 1
Ve výchozím nastavení stage2 by v následujícím kanálu záviselo na stage1 úspěšném dokončení. Má však nastavenou stage2 možnost spustit pokaždé, condition když je mainzdrojová větev , bez stage1 ohledu na stav.
Pokud ve větvi zařadíte sestavení main do fronty a zrušíte ho během stage1 běhu, stage2 stále se spustí, protože eq(variables['Build.SourceBranch'], 'refs/heads/main') se vyhodnotí jako true.
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
Příklad fáze 2
Ve výchozím nastavení stage2 závisí následující kanál na stage1 úspěšném dokončení. Úloha B v stage2 má nastavenou condition sadu ke spuštění, kdykoli je mainzdrojová větev .
Pokud sestavení main ve větvi zařadíte do fronty a zrušíte ho během stage1 běhu a stage2 její úlohy se vůbec nespustí, i když fáze obsahuje úlohu, jejíž podmínka se vyhodnotí jako 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
Příklad fáze 3
Ve výchozím nastavení stage2 závisí následující kanál na stage1 úspěšném dokončení. Krok uvnitř úlohy Bstage2 má nastavenou condition sadu ke spuštění pokaždé, když je mainzdrojová větev .
Pokud ve větvi zařadíte sestavení main do fronty a zrušíte ho během stage1 běhu a stage2B úloha se vůbec nespustí, i když úloha B obsahuje krok, jehož podmínka se vyhodnotí jako true.
Stage2 je vynechán zcela, protože stage1 byl zrušen.
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')
Příklady výsledků podmínek úlohy
Následující příklady ukazují výsledky různých podmínek nastavených pro úlohy při zrušení sestavení.
Příklad úlohy 1
V následujícím kanálu YAML závisí spuštěná úloha B na spuštěné úloze A . Úloha B má condition také sadu ke spuštění při každé zdrojové větvi main.
Pokud zařadíte sestavení main do fronty na větvi a zrušíte ho zatímco úloha A běží, úloha B se stále spustí, protože condition: eq(variables['Build.SourceBranch'], 'refs/heads/main') se vyhodnotí jako true.
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
Pokud chcete, aby úloha B běžela pouze v případě, že úloha A proběhne úspěšně a zdroj sestavení je main, je nutné nastavit condition hodnotu and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main')).
Příklad úlohy 2
V následujícím kanálu YAML úloha B závisí na úspěšné úloze A . Úloha B je nastavená condition tak, aby se spustila vždy, když bude úloha A úspěšná a zdrojová větev sestavení je main.
Pokud ve větvi zařadíte sestavení main do fronty a zrušíte ho během běhu úlohy A , úloha B se nespustí, i když má ten condition , který se vyhodnotí jako true. Podmínka v úloze B se vyhodnotí, false protože úloha A nebyla úspěšná. Proto se úloha B a její kroky přeskočí.
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())
Příklad výsledku podmínky kroku
Můžete také nastavit podmínky pro kroky. V následujícím pipelineu je krok 2.3 nastaven tak, aby se spouštěl pokaždé, když je zdrojová větev condition.
Pokud ve větvi zařadíte sestavení main do fronty a zrušíte ho, zatímco jsou spuštěné kroky 2.1 nebo 2.2, krok 2.3 stále běží, protože eq(variables['Build.SourceBranch'], 'refs/heads/main') se vyhodnotí jako true.
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')
Parametry v podmínkách
Parametry můžete použít v podmínkách. Rozšíření parametru proběhne před spuštěním kanálu a nahradí hodnoty obklopené ${{ }} hodnotami literálových parametrů. Vzhledem k tomu, že k rozšíření parametrů dochází před vyhodnocením podmínky, můžete deklarovat parametr v kanálu a vložit parametr do libovolné podmínky v daném kanálu.
Následující condition příklad kombinuje dvě funkce: succeeded() a ${{ eq(parameters.doThing, true) }}. Funkce succeeded() zkontroluje, jestli předchozí krok proběhl úspěšně. Tato funkce také vrátí true , pokud neexistuje žádný předchozí krok.
Funkce ${{ eq(parameters.doThing, true) }} zkontroluje, zda doThing je parametr roven true. Skript krok v následujícím příkladu se spustí, protože neexistuje žádný předchozí krok a parameters.doThing je true ve výchozím nastavení.
parameters:
- name: doThing
default: true
type: boolean
steps:
- script: echo I did a thing
condition: and(succeeded(), ${{ eq(parameters.doThing, true) }})
Parametry šablony v podmínkách
Když předáte parametr šabloně kanálu, můžete nastavit hodnotu parametru v souboru šablony nebo pomocí templateContext předat parametr šabloně.
Následující parameters.yml soubor šablony deklaruje doThing parametr s výchozí hodnotou true a používá parametr v podmínce úlohy.
# parameters.yml
parameters:
- name: doThing
default: true
type: boolean
jobs:
- job: B
steps:
- script: echo I did a thing
condition: ${{ eq(parameters.doThing, true) }}
Následující azure-pipelines.yml definice kanálu odkazuje na úlohu v souboru šablony parameters.yml . Výstupem kanálu je I did a thing to, že parametr doThing je ve výchozím nastavení pravdivý.
# azure-pipelines.yml
extends:
template: parameters.yml
Další příklady parametrů šablony najdete v referenčních informacích k použití šablony.
časté otázky
Jak se dá aktivovat úloha, pokud předchozí úloha proběhla úspěšně, ale s problémy?
Výsledek předchozí úlohy můžete použít v podmínce. V následujícím jazyce YAML nastaví podmínka eq(dependencies.A.result,'SucceededWithIssues') spuštění úlohy B po úspěšném dokončení úlohy A s problémy.
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
Proč je moje sestavení stále spuštěné po zrušení?
K tomuto problému můžete dojít, pokud 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. Další informace najdete v tématu Výsledky podmínky při zrušení sestavení.