İşlem hattı koşulları
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
Bu makalede, Azure Pipelines aşamasının, işinin veya adımının hangi koşullar altında çalıştırıldığı ve farklı koşulların nasıl belirtildiği açıklanmaktadır. Aşamalar, işler ve adımlar hakkında daha fazla bağlam için bkz . Azure Pipelines için temel kavramlar.
Varsayılan olarak, bir iş veya aşama başka bir işe veya aşamaya bağımlı değilse veya tüm bağımlılıkları tamamlanmış ve başarılıysa çalışır. Bu gereksinim yalnızca doğrudan bağımlılıklar için değil, özyinelemeli olarak hesaplanan dolaylı bağımlılıkları için de geçerlidir.
Varsayılan olarak, işinde henüz hiçbir şey başarısız olmazsa ve ondan hemen önceki adım tamamlandığında bir adım çalışır.
Önceki bir bağımlılık başarısız olsa bile bir aşamayı, işi veya adımı çalıştırmaya zorlayarak veya özel bir koşul belirterek bu davranışı geçersiz kılabilir veya özelleştirebilirsiniz.
Not
Bu makalede YAML işlem hattı özellikleri ele alınmaktadır. Klasik işlem hatları için, görevlerin veya işlerin çalıştırıldığı bazı koşulları her görevin Denetim Seçenekleri'nde ve yayın işlem hattındaki bir iş için ek seçenekler bölümünde belirtebilirsiniz.
Aşamanın, işin veya adımın çalıştırıldığı koşullar
İşlem hattı tanımı YAML'de bir aşamanın, işin veya adımın hangi koşullarda çalıştırılacağını belirtebilirsiniz:
Yalnızca aynı aracı havuzuna sahip önceki tüm doğrudan ve dolaylı bağımlılıklar başarılı olduğunda. Farklı aracı havuzlarınız varsa, bu aşamalar veya işler eşzamanlı olarak çalışır. YAML'de hiçbir koşul ayarlanmadıysa bu koşul varsayılandır.
Önceki bir bağımlılık başarısız olsa bile, çalıştırma iptal edilmediği sürece. Bu koşul için YAML'de kullanın
succeededOrFailed()
.Önceki bir bağımlılık başarısız olsa ve çalıştırma iptal edilse bile. Bu koşul için YAML'de kullanın
always()
.Yalnızca önceki bir bağımlılık başarısız olduğunda. Bu koşul için YAML'de kullanın
failed()
.
- Özel koşullar.
Varsayılan olarak, tüm doğrudan ve dolaylı bağımlılıklar başarılı olursa aşamalar, işler ve adımlar çalışır. Bu durum, belirtilmesiyle condition: succeeded()
aynıdır. Daha fazla bilgi için bkz . başarılı durum işlevi.
Aşama, iş veya adım için bir condition
özellik belirttiğinizde, varsayılan condition: succeeded()
değerinin üzerine yazarsınız. Kendi koşullarınızı belirtmek, derleme iptal edilse bile aşamanızın, işinizin veya adımınızın çalışmasına neden olabilir. Yazdığınız koşulların üst aşamanın veya işin durumunu hesaba katdığından emin olun.
Aşağıdaki YAML örneği ve failed()
koşullarını gösteriralways()
. İlk işteki adım, bağımlılıklar başarısız olsa veya derleme iptal edilse bile çalışır. İkinci iş yalnızca ilk iş başarısız olursa çalışır.
jobs:
- job: Foo
steps:
- script: echo Hello!
condition: always() # this step runs, even if the build is canceled
- job: Bar
dependsOn: Foo
condition: failed() # this job runs only if Foo fails
Değişkenleri koşullarda da ayarlayabilir ve kullanabilirsiniz. Aşağıdaki örnek, olarak Build.SourceBranch
bir main
değişken ayarlayıp kullanırisMain
.
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)
Önemli
Koşullar, aşama, iş veya adım başlatılıp başlatılmayacağını belirlemek için değerlendirilir. Bu nedenle, çalışma zamanında bu çalışma birimi içinde hesaplanan hiçbir şey kullanılamaz. Örneğin, söz dizimi içeren $[ ]
bir çalışma zamanı ifadesi kullanarak değişken ayarlayan bir işiniz varsa, bu değişkeni bu işteki özel bir koşulda kullanamazsınız.
Özel koşullar
Yerleşik koşullar gereksinimlerinizi karşılamıyorsa özel koşullar belirtebilirsiniz. YAML işlem hattı tanımlarında koşulları ifade olarak yazarsınız.
Aracı, ifadeyi en içteki işlevden başlayıp dışa doğru ilerleterek değerlendirir. Nihai sonuç, görevin, işin veya aşamanın çalıştırılıp çalıştırılmayacağını belirleyen boole değeridir. Söz diziminin tam kılavuzu için bkz . İfadeler.
Koşullarınızdan herhangi biri, derleme iptal edildikten sonra bile görevin çalışmasını mümkün hale getirirse, kullanıcı bir çalıştırmayı iptal ettikten sonra bu görevlerin tamamlanması için yeterli zamana sahip olması için zaman aşımını iptal etmek için makul bir değer belirtin.
Derleme iptal edildiğinde koşul sonuçları
Derlemeyi iptal etmek, tüm aşamalarının, işlerinin veya adımlarının çalışmayı durdurduğu anlamına gelmez. Hangi aşamaların, işlerin veya adımların çalışmayı durdurduğu belirttiğiniz koşullara ve işlem hattının yürütmesinin hangi noktasında derlemeyi iptal ettiğinize bağlıdır. Aşama, iş veya adımın üst öğesi atlanırsa, görev koşulları ne olursa olsun çalışmaz.
Aşama, iş veya adım, koşulları olarak değerlendirilirken true
çalışır. Koşulunuz görevin üst öğesinin durumunu dikkate almazsa, üst öğesi iptal edilse bile görev çalıştırılabilir. Bir derleme iptal edildiğinde aşamaların, işlerin veya koşullara sahip adımların çalıştırılıp çalıştırılmayacağını denetlemek için, koşullarınıza bir iş durumu denetimi işlevi eklediğinizden emin olun.
Aşağıdaki örneklerde, derleme iptal edildiğinde aşamalar, işler veya adımlar üzerinde ayarlanan çeşitli koşulların sonuçları gösterilir.
Aşama örneği 1
Aşağıdaki işlem hattında, varsayılan olarak stage2
öğesine stage1
bağımlıdır, ancak stage2
durum ne olursa olsun stage1
kaynak dal her olduğunda çalışacak şekilde condition
ayarlanmıştırmain
.
Daldaki bir derlemeyi main
kuyruğa alır ve çalışırken iptal stage1
ederseniz, stage2
yine de çalışır çünkü eq(variables['Build.SourceBranch'], 'refs/heads/main')
olarak değerlendirilir 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
Aşama örneği 2
Aşağıdaki işlem hattında, stage2
varsayılan olarak bağlıdır stage1
. içindeki stage2
işin B
bir condition
kümesi vardır. Daldaki bir derlemeyi main
kuyruğa alır ve çalışırken iptal stage1
ederseniz, stage2
koşulu olarak değerlendirilen true
bir iş içerse bile çalışmaz.
Bunun nedenistage2
, iptal edildiğinde stage1
değerlendirilen false
varsayılan condition: succeeded()
değerinin olmasıdır. Bu nedenle atlanır stage2
ve işlerinin hiçbiri çalışmaz.
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
Aşama örneği 3
Aşağıdaki işlem hattında, varsayılan olarak stage2
öğesine stage1
bağlıdır ve işin B
içindeki adımın bir condition
kümesi vardır.
Daldaki bir derlemeyi main
kuyruğa alır ve çalışırken iptal stage1
ederseniz, stage2
durumu olarak değerlendirilen true
bir iş B
adımı içerse bile çalışmaz. Bunun nedeni stage2
iptal edilmeye stage1
yanıt olarak atlanmış olmasıdır.
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')
İş örneği 1
Aşağıdaki YAML işlem hattında, iş B
varsayılan olarak işe A
bağlıdır, ancak kaynak dal her olduğunda işin B
çalıştırılacak bir condition
kümesi vardır main
. Daldaki bir derlemeyi main
kuyruğa alır ve iş çalışırken iptal ederseniz, iş B
A
yine de çalışır çünkü eq(variables['Build.SourceBranch'], 'refs/heads/main')
olarak değerlendirilirtrue
.
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
İşin yalnızca iş B
başarılı olduğunda A
ve derleme kaynağı dal olduğunda çalıştırılmasını main
istiyorsanız, değeriniz condition
olmalıdır and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
.
İş örneği 2
Aşağıdaki işlem hattında, iş B
varsayılan olarak işe A
bağlıdır. Daldaki bir derlemeyi main
kuyruğa alır ve iş A
çalışırken iptal ederseniz, adımında olarak değerlendirilen true
bir condition
olsa bile iş B
çalışmaz.
Bunun nedeni, işin B
iptal edildiğinde değerlendirilen false
varsayılan condition: succeeded()
değerinin olmasıdırA
. Bu nedenle, iş B
atlanır ve adımlarından hiçbiri çalışmaz.
jobs:
- job: A
steps:
- script: sleep 30
- job: B
dependsOn: A
steps:
- script: echo step 2.1
condition: eq(variables['Build.SourceBranch'], 'refs/heads/main', succeeded())
Adım örneği
Adımlarla ilgili koşullarınız da olabilir.
Aşağıdaki işlem hattında, kaynak dal her olduğunda 2.3 adımının çalıştırılacak bir condition
kümesi vardır main
. Daldaki bir derlemeyi main
kuyruğa alır ve 2.1 veya 2.2 adımları çalışırken iptal ederseniz, 2.3. adım yine çalışır çünkü eq(variables['Build.SourceBranch'], 'refs/heads/main')
olarak değerlendirilir 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')
Koşul ayarları
Aşağıdaki tabloda, çeşitli sonuçlar üretmek için örnek condition
ayarlar gösterilmektedir.
Not
Release.Artifacts.{artifact-alias}.SourceBranch
eşdeğeri, Build.SourceBranch
olur.
İstenen sonuç | Örnek koşul ayarı |
---|---|
Üst veya önceki aşama, iş veya adım başarısız olsa veya iptal edilmiş olsa bile kaynak dal ana ise komutunu çalıştırın. | eq(variables['Build.SourceBranch'], 'refs/heads/main') |
Kaynak dal ana ise ve üst dal veya önceki aşama, iş veya adım başarılıysa komutunu çalıştırın. | and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main')) |
Kaynak dal ana dal değilse ve üst veya önceki aşama, iş veya adım başarılıysa komutunu çalıştırın. | and(succeeded(), ne(variables['Build.SourceBranch'], 'refs/heads/main')) |
Üst veya önceki aşama, iş veya adım başarılı olduysa, kullanıcı konusu dalları için komutunu çalıştırın. | and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/heads/users/')) |
Üst veya önceki aşama, iş veya adım başarılı olduysa sürekli tümleştirme (CI) derlemeleri için komutunu çalıştırın. | and(succeeded(), in(variables['Build.Reason'], 'IndividualCI', 'BatchedCI')) |
Derleme bir çekme isteği için bir dal ilkesi tarafından tetiklendiyse ve üst veya önceki aşama, iş veya adım başarısız olduysa komutunu çalıştırın. | and(failed(), eq(variables['Build.Reason'], 'PullRequest')) |
Üst veya önceki aşama, iş veya adım başarısız olsa veya iptal edilmiş olsa bile zamanlanmış bir derleme için çalıştırın. | eq(variables['Build.Reason'], 'Schedule') |
Üst veya önceki aşama, iş veya adım başarısız olsa veya iptal edilse bile bir değişken true olarak ayarlanmışsa komutunu çalıştırın. | eq(variables['System.debug'], true) |
Not
Değişken null (boş dize) olduğunda çalışacak bir koşul ayarlayabilirsiniz. Tüm değişkenler Azure Pipelines'da dize olarak ele alındığından, boş bir dize aşağıdaki işlem hattına eşdeğerdir null
:
variables:
- name: testEmpty
value: ''
jobs:
- job: A
steps:
- script: echo testEmpty is blank
condition: eq(variables.testEmpty, '')
Koşullardaki parametreler
Parametre genişletme, koşullar dikkate alınmadan önce gerçekleşir. Bu nedenle, bir koşulla aynı işlem hattında bir parametre bildirdiğinizde, parametreyi koşulun içine ekleyebilirsiniz. Aşağıdaki YAML'deki betik true olduğundan parameters.doThing
çalıştırılır.
parameters:
- name: doThing
default: true
type: boolean
steps:
- script: echo I did a thing
condition: and(succeeded(), ${{ eq(parameters.doThing, true) }})
condition
Yukarıdaki işlem hattında iki işlevi birleştirir: succeeded()
ve ${{ eq(parameters.doThing, true) }}
. İşlev, succeeded()
önceki adımın başarılı olup olmadığını denetler. İşlev succeeded()
, önceki bir adım olmadığından döndürür true
.
İşlev, ${{ eq(parameters.doThing, true) }}
parametresinin doThing
değerine eşit true
olup olmadığını denetler. için doThing
varsayılan değer olduğundan true
, işlem hattı farklı bir değer ayarlanmadığı sürece koşul varsayılan olarak döndürür true
.
Koşullarda şablon parametreleri
Bir parametreyi şablona geçirirken, parametrenin değerini şablonunuzda ayarlamanız veya templateContext kullanarak parametreyi şablona geçirmeniz gerekir.
Örneğin, aşağıdaki parameters.yml dosyası parametreyi doThing
ve varsayılan değeri bildirir:
# 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) }}
İşlem hattı kodu parameters.yml şablonuna başvurur. İşlem hattının çıkışı, I did a thing
parametrenin doThing
true olmasıdır.
# azure-pipeline.yml
parameters:
- name: doThing
default: true
type: boolean
trigger:
- none
extends:
template: parameters.yml
Daha fazla şablon parametresi örneği için bkz . Şablon kullanımı başvurusu.
Sonraki iş koşullarında kullanılan iş çıktı değişkenleri
Bir değişkeni gelecekteki işler için kullanılabilir hale getirip bir koşulda belirtebilirsiniz. Gelecekteki işler için kullanılabilen değişkenler, aşağıdaki kodda olduğu gibi kullanılarak isOutput=true
çok işli çıkış değişkenleri olarak işaretlenmelidir:
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."
Sonraki adım koşullarında kullanılan bir adımda oluşturulan değişkenler
Bir koşulda belirtmek üzere gelecekteki adımlarda kullanılabilecek bir değişken oluşturabilirsiniz. Adımlardan oluşturulan değişkenler varsayılan olarak gelecekteki adımlarda kullanılabilir ve çok işli çıkış değişkenleri olarak işaretlenmesi gerekmez.
Adımlardan oluşturulan kapsam belirleme değişkenleri hakkında dikkat edilmesi gereken bazı önemli noktalar vardır.
- bir işteki bir adımda oluşturulan değişkenlerin kapsamı aynı işteki adımlarla belirlenmiştir.
- Bir adımda oluşturulan değişkenler, sonraki adımlarda yalnızca ortam değişkenleri olarak kullanılabilir.
- Bir adımda oluşturulan değişkenler, bunları tanımlayan adımda kullanılamaz.
Aşağıdaki örnekte, bir adımda işlem hattı değişkeni oluşturma ve sonraki bir adımın koşulunda ve betiğinde değişkeni kullanma gösterilmektedir.
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 is able to use doThing, so it 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'))
SSS
Önceki bir iş başarılı olursa ancak sorunlar varsa başka bir işi nasıl tetikleyebilirim?
Bir koşulda önceki işin sonucunu kullanabilirsiniz. Örneğin, aşağıdaki YAML'de, iş B
sorunlarla başarılı olduğundan bu koşul eq(dependencies.A.result,'SucceededWithIssues')
işin A
çalışmasına izin verir.
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
Derlememi iptal ettim ama çalışmaya devam ediyor. Neden?
Bir aşamada yapılandırılan bir koşul iş durumu denetimi işlevi içermiyorsa bu sorunla karşılaşabilirsiniz. Sorunu çözmek için koşula bir iş durumu denetimi işlevi ekleyin.
Bir işi kuyruk aşamasındayken iptal ederseniz ancak çalışmıyorsanız, diğer tüm aşamalar da dahil olmak üzere işin tamamı iptal edilir. Daha fazla bilgi için bu makalenin önceki bölümlerinde derleme iptal edildiğinde koşul sonuçları bölümüne bakın.