Voorwaarden opgeven
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
U kunt de voorwaarden opgeven waaronder elke fase, taak of stap wordt uitgevoerd. Een taak of fase wordt standaard uitgevoerd als deze niet afhankelijk is van een andere taak of fase, of als alle taken of fasen ervan afhankelijk zijn van voltooid en voltooid. Dit omvat niet alleen directe afhankelijkheden, maar ook hun afhankelijkheden, die recursief worden berekend. Standaard wordt een stap uitgevoerd als er nog niets in de taak is mislukt en de stap die direct aan de taak voorafgaat, is voltooid. U kunt dit gedrag aanpassen door een fase, taak of stap af te dwingen om te worden uitgevoerd, ook als een eerdere afhankelijkheid mislukt of door een aangepaste voorwaarde op te geven.
U kunt voorwaarden opgeven waaronder een stap, taak of fase wordt uitgevoerd.
Alleen wanneer alle vorige directe en indirecte afhankelijkheden met dezelfde agentgroep zijn geslaagd. Als u verschillende agentpools hebt, worden deze fasen of taken gelijktijdig uitgevoerd. Dit is de standaardinstelling als er geen voorwaarde is ingesteld in de YAML.
Zelfs als een eerdere afhankelijkheid is mislukt, tenzij de uitvoering is geannuleerd. Gebruik
succeededOrFailed()
in de YAML voor deze voorwaarde.Zelfs als een eerdere afhankelijkheid is mislukt, zelfs als de uitvoering is geannuleerd. Gebruik
always()
in de YAML voor deze voorwaarde.Alleen wanneer een eerdere afhankelijkheid is mislukt. Gebruik
failed()
in de YAML voor deze voorwaarde.
- Aangepaste voorwaarden
Standaard worden stappen, taken en fasen uitgevoerd als alle directe en indirecte afhankelijkheden zijn geslaagd. Het is alsof u 'voorwaarde: succeeded()' hebt opgegeven (zie de statusfunctie geslaagd).
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
U kunt ook variabelen in voorwaarden gebruiken.
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)
Voorwaarden worden geëvalueerd om te bepalen of een fase, taak of stap moet worden gestart.
Dit betekent dat er niets dat tijdens runtime in die werkeenheid wordt berekend, beschikbaar is.
Als u bijvoorbeeld een taak hebt waarmee een variabele wordt ingesteld met behulp van een runtime-expressie met behulp van $[ ]
syntaxis, kunt u die variabele niet gebruiken in uw aangepaste voorwaarde.
YAML wordt niet ondersteund in TFS.
Notitie
Wanneer u uw eigen condition
eigenschap opgeeft voor een fase/taak/stap, overschrijft u de standaardwaarde condition: succeeded()
. Dit kan leiden tot de fase/taak/stap die wordt uitgevoerd, zelfs als de build is geannuleerd. Zorg ervoor dat u rekening houdt met de status van de bovenliggende fase/taak bij het schrijven van uw eigen voorwaarden.
Een aangepaste voorwaarde inschakelen
Als de ingebouwde voorwaarden niet aan uw behoeften voldoen, kunt u aangepaste voorwaarden opgeven.
Voorwaarden worden in YAML-pijplijnen als expressies geschreven. De agent evalueert de expressie, te beginnen met de binnenste functie, en werkt naar buiten toe. Het uiteindelijke resultaat is een booleaanse waarde die bepaalt of de taak of fase moet worden uitgevoerd of niet. Zie het artikel over expressies voor een volledige handleiding voor de syntaxis.
Kan op basis van een van de voorwaarden de taak worden uitgevoerd, ook nadat de build door een gebruiker is geannuleerd? Zo ja, geef dan een redelijke waarde op voor time-outs voor annuleren, zodat dit soort taken voldoende tijd hebben om te voltooien nadat de gebruiker een uitvoering heeft geannuleerd.
Gedrag van pijplijn wanneer de build wordt geannuleerd
Wanneer een build wordt geannuleerd, betekent dit niet dat alle fasen, taken of stappen niet meer worden uitgevoerd. De beslissing is afhankelijk van de fase, taak of stap conditions
die u hebt opgegeven en op welk moment van de uitvoering van de pijplijn u de build hebt geannuleerd.
Als uw voorwaarde niet rekening houdt met de status van het bovenliggende element van uw fase/taak/stap, wordt uw fase, taak of stap uitgevoerd als de voorwaarde true
wordt geëvalueerd, zelfs als het bovenliggende item wordt geannuleerd. Als het bovenliggende item wordt overgeslagen, wordt uw fase, taak of stap niet uitgevoerd.
We bekijken enkele voorbeelden.
In deze pijplijn is standaard stage2
afhankelijk van en stage2
is er een condition
set stage1
ingesteld. stage2
wordt alleen uitgevoerd wanneer de bronbranch zich bevindt main
.
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
Als u een build in de wachtrij plaatst op de main
vertakking en u deze annuleert terwijl stage1
deze wordt uitgevoerd, stage2
wordt deze nog steeds uitgevoerd, omdat eq(variables['Build.SourceBranch'], 'refs/heads/main')
dit true
wordt geëvalueerd.
In deze pijplijn is stage2
dit afhankelijk stage1
van. Job B
heeft er een condition
set voor.
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
Als u een build in de wachtrij op de main
vertakking zet en u deze annuleert terwijl stage1
deze wordt uitgevoerd, stage2
wordt deze niet uitgevoerd, ook al bevat het een taak B
waarvan de voorwaarde wordt geëvalueerd true
. De reden hiervoor is dat stage2
de standaardwaarde condition: succeeded()
is, die evalueert false
wanneer stage1
wordt geannuleerd. Daarom wordt stage2
overgeslagen en worden de taken niet uitgevoerd.
Stel dat u de volgende YAML-pijplijn hebt. U ziet dat stage2
standaard afhankelijk is van stage1
en dat script: echo 2
er een condition
set voor is ingesteld.
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')
Als u een build in de wachtrij op de main
vertakking zet en u deze annuleert terwijl stage1
deze wordt uitgevoerd,stage2
wordt deze niet uitgevoerd, ook al bevat het een stap in de taak B
waarvan de voorwaarde wordt geëvalueerdtrue
. De reden hiervoor is dat stage2
het wordt overgeslagen als reactie op stage1
annuleren.
Als u wilt voorkomen dat fasen, taken of stappen worden conditions
uitgevoerd wanneer een build wordt geannuleerd, moet u rekening houden met de status van de bovenliggende gebruiker bij het schrijven van de conditions
. Zie Taakstatusfuncties voor meer informatie.
Voorbeelden
Uitvoeren voor de hoofdbranch, zelfs als deze is geannuleerd, zelfs als dit mislukt
eq(variables['Build.SourceBranch'], 'refs/heads/main')
Uitvoeren voor de hoofdvertakking, indien geslaagd
and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
Uitvoeren als de vertakking niet de hoofdvertakking is, als het slaagt
and(succeeded(), ne(variables['Build.SourceBranch'], 'refs/heads/main'))
Uitvoeren voor vertakkingen van gebruikersonderwerp, indien geslaagd
and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/heads/users/'))
Uitvoeren voor CI-builds (continue integratie) als dit lukt
and(succeeded(), in(variables['Build.Reason'], 'IndividualCI', 'BatchedCI'))
Uitvoeren als de build wordt uitgevoerd door een vertakkingsbeleid voor een pull-aanvraag, als dit mislukt
and(failed(), eq(variables['Build.Reason'], 'PullRequest'))
Uitvoeren als de build is gepland, zelfs als deze mislukt, zelfs als deze is geannuleerd
eq(variables['Build.Reason'], 'Schedule')
Release.Artifacts. {artifact-alias}. SourceBranch is gelijk aan Build.SourceBranch.
Altijd uitvoeren als een variabele is ingesteld op true, zelfs als deze is geannuleerd, zelfs als deze mislukt
eq(variables['System.debug'], true)
Uitvoeren als een variabele null is (lege tekenreeks)
Omdat alle variabelen worden behandeld als tekenreeksen in Azure Pipelines, is een lege tekenreeks gelijk aan null
in deze pijplijn.
variables:
- name: testEmpty
value: ''
jobs:
- job: A
steps:
- script: echo testEmpty is blank
condition: eq(variables.testEmpty, '')
Een sjabloonparameter gebruiken als onderdeel van een voorwaarde
Wanneer u een parameter declareert in dezelfde pijplijn waarin een voorwaarde voorkomt, vindt parameteruitbreiding plaats voordat er op voorwaarden wordt gelet. In dit geval kunt u parameters insluiten binnen voorwaarden. Het script in dit YAML-bestand wordt uitgevoerd omdat parameters.doThing
dit waar is.
De condition
in de pijplijn combineert twee functies: succeeded()
en eq('${{ parameters.doThing }}', true)
. De succeeded()
functie controleert of de vorige stap is geslaagd. De succeeded()
functie retourneert waar omdat er geen vorige stap is.
De eq('${{ parameters.doThing }}', true)
functie controleert of de doThing-parameter gelijk is aan true
. Omdat de standaardwaarde voor doThing waar is, retourneert de voorwaarde standaard true, tenzij een andere waarde wordt ingesteld in de pijplijn.
Zie Sjabloontypen en -gebruik voor meer voorbeelden van sjabloonparameters.
parameters:
- name: doThing
default: true
type: boolean
steps:
- script: echo I did a thing
condition: ${{ eq(parameters.doThing, true) }}
Wanneer u een parameter doorgeeft aan een sjabloon, moet u de waarde van de parameter instellen in uw sjabloon of templateContext gebruiken om eigenschappen door te geven aan sjablonen.
# 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
De uitvoer van deze pijplijn komt I did a thing
omdat de parameter doThing
waar is.
De uitvoervariabele van een taak gebruiken in een voorwaarde in een volgende taak
U kunt een variabele beschikbaar maken voor toekomstige taken en deze opgeven in een voorwaarde. Variabelen die beschikbaar zijn voor toekomstige taken, moeten worden gemarkeerd als uitvoervariabelen voor meerdere taken met behulp van 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."
De pijplijnvariabele gebruiken die is gemaakt op basis van een stap in een voorwaarde in een volgende stap
U kunt een variabele beschikbaar maken voor toekomstige stappen en deze opgeven in een voorwaarde. Variabelen die zijn gemaakt op basis van een stap, zijn standaard beschikbaar voor toekomstige stappen en hoeven niet te worden gemarkeerd als uitvoervariabelen voor meerdere taken met behulp van isOutput=true
.
Er zijn enkele belangrijke dingen die u moet weten met betrekking tot de bovenstaande benadering en het bereik:
- Variabelen die zijn gemaakt in een stap in een taak, worden afgestemd op de stappen in dezelfde taak.
- Variabelen die in een stap zijn gemaakt, zijn alleen beschikbaar in de volgende stappen als omgevingsvariabelen.
- Variabelen die in een stap zijn gemaakt, kunnen niet worden gebruikt in de stap die deze definieert.
Hieronder ziet u een voorbeeld van het maken van een pijplijnvariabele in een stap en het gebruik van de variabele in de voorwaarde en het script van een volgende stap.
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'))
Veelgestelde vragen
Hoe kan ik een taak activeren als een vorige taak problemen heeft gegeven?
U kunt het resultaat van de vorige taak gebruiken. In dit YAML-bestand kan de taak eq(dependencies.A.result,'SucceededWithIssues')
bijvoorbeeld worden uitgevoerd omdat taak A is geslaagd met problemen.
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
Ik heb mijn build geannuleerd, maar het wordt nog steeds uitgevoerd. Wat is er gaande?
U ondervindt dit probleem als de voorwaarde die is geconfigureerd in de fase geen functie voor taakstatuscontrole bevat. U kunt het probleem oplossen door een functie voor taakstatuscontrole toe te voegen aan de voorwaarde. Als u een taak annuleert terwijl deze in de wachtrij staat, maar niet wordt uitgevoerd, wordt de hele taak geannuleerd, inclusief alle andere fasen.
Meer informatie over het gedrag van een pijplijn wanneer een build wordt geannuleerd.
Verwante artikelen:
Feedback
https://aka.ms/ContentUserFeedback.
Binnenkort: Gedurende 2024 worden GitHub Issues uitgefaseerd als het feedbackmechanisme voor inhoud. Dit wordt vervangen door een nieuw feedbacksysteem. Ga voor meer informatie naar:Feedback verzenden en bekijken voor