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í stage2
stage1
závisí na tomto kanálu a stage2
má sadu condition
. stage2
spustí se pouze v případech, kdy je main
zdrojová 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, stage2
i 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í.
Související články
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro