Koşulları belirtme

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

Her aşamanın, işin veya adımın hangi koşullar altında çalıştırılacağını belirtebilirsiniz. Varsayılan olarak, iş veya aşama başka bir işe veya aşamaya bağlı değilse veya bağımlı olduğu tüm işler veya aşamalar tamamlanmış ve başarılıysa çalışır. Bu yalnızca doğrudan bağımlılıkları değil, aynı zamanda özyinelemeli olarak hesaplanan bağımlılıkları da içerir. Varsayılan olarak işinde henüz hiçbir şey başarısız olmadıysa ve ondan hemen önceki adım tamamlandığında bir adım çalıştırılı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ışı özelleştirebilirsiniz.

Bir adımın, işin veya aşamanın tabi olacağı koşulları 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ıştırılır. YAML'de ayarlanmış bir koşul yoksa bu varsayılan değerdir.

  • Ö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 bile, çalıştırma iptal edilmiş olsa 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 adımlar, işler ve aşamalar çalıştırılır. "condition: succeeded()" (bkz . başarılı durum işlevi).

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

Değişkenleri koşullarda da kullanabilirsiniz.

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)

Koşullar, aşama, iş veya adım başlatılıp başlatılmayeceğine karar vermek için değerlendirilir. Bu, çalışma zamanında bu çalışma birimi içinde hesaplanan hiçbir şeyin kullanılamayacağı anlamına gelir. Örneğin, söz dizimi kullanarak çalışma zamanı ifadesi kullanarak $[ ] değişken ayarlayan bir işiniz varsa, özel koşulunuzda bu değişkeni kullanamazsınız.

YAML, TFS'de desteklenmez.

Not

Bir aşama / iş / adım için kendi condition özelliğinizi belirttiğinizde, varsayılan condition: succeeded()değerinin üzerine yazarsınız. Bu, derleme iptal edilse bile aşamanızın / işinizin / adımınızın çalıştırılmasına yol açabilir. Kendi koşullarınızı yazarken üst aşamanın /işin durumunu dikkate aldığınızdan emin olun.

Özel koşulu etkinleştirme

Yerleşik koşullar gereksinimlerinizi karşılamıyorsa özel koşullar belirtebilirsiniz.

Koşullar YAML işlem hatlarında ifade olarak yazılır. Aracı, ifadeyi en içteki işlevden başlayarak değerlendirir ve oradan devam eder. Nihai sonuç görevin, işin veya aşamanın çalıştırılıp çalıştırılmaması gerektiğini belirleyen bir boole değeri olur. Söz diziminin tam kılavuzu için ifadeler makalesine bakın.

Koşullarınızdan herhangi biri, derleme bir kullanıcı tarafından iptal edildikten sonra bile görevin çalışmasını mümkün hale getiriyor mu? Öyleyse, kullanıcı bir çalıştırmayı iptal ettikten sonra bu tür görevlerin tamamlanması için yeterli zamana sahip olması için iptal zaman aşımı için makul bir değer belirtin.

Derleme iptal edildiğinde işlem hattı davranışı

Derleme iptal edildiğinde, tüm aşamaları, işleri veya adımları çalışmayı durdurmaz. Karar, belirttiğiniz aşamaya, işe veya adıma conditions ve işlem hattının yürütmesinin hangi noktasında derlemeyi iptal ettiğinize bağlıdır.

Durumunuz aşamanızın /işinizin/ adımınızın üst öğesinin durumunu dikkate almazsa, koşul olarak değerlendirilirsetrue, üst öğesi iptal edilse bile aşamanız, işiniz veya adımınız çalışır. Üst öğesi atlanırsa aşamanız, işiniz veya adımınız çalışmaz.

Bazı örneklere bakalım.

Bu işlem hattında, varsayılan olarak stage2 bir kümeye stage1 bağlıdır ve stage2 buna condition sahiptir. stage2 yalnızca kaynak dal olduğunda mainçalışır.

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

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.

Bu işlem hattında, stage2 öğesine stage1bağlıdır. İş B için bir condition set var.

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

Daldaki bir derlemeyi main kuyruğa alır ve çalışırken iptal stage1 ederseniz, stage2durumu olarak değerlendirilen truebir iş B 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.

Aşağıdaki YAML işlem hattına sahip olduğunuzu varsayalım. Varsayılan olarak stage2 buna bağlı stage1 olduğuna ve bunun için bir condition kümesi olduğuna script: echo 2 dikkat edin.

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

Daldaki bir derlemeyi main kuyruğa alır ve çalışırken iptal stage1 ederseniz, stage2durumu olarak değerlendirilen truebir iş B adımı içerse bile çalışmaz. Bunun nedeni stage2 iptal edilmeye stage1 yanıt olarak atlanmış olmasıdır.

Derleme iptal edildiğinde aşamaların, işlerin veya adımların conditions çalışmasını önlemek için, yazarken üstlerinin durumunu dikkate aldığınızdan conditionsemin olun. Daha fazla bilgi için bkz . İş durumu işlevleri.

Örnekler

İptal edilse bile, başarısız olsa bile ana dal için komutunu çalıştırın

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

Başarılı olursa ana dal için komutunu çalıştırın

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

Dal ana değilse, başarılıysa komutunu çalıştırın

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

Başarılı olursa, kullanıcı konusu dalları için komutunu çalıştırın

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

Başarılı olursa sürekli tümleştirme (CI) derlemeleri için çalıştırma

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

Derleme bir çekme isteği için bir dal ilkesi tarafından çalıştırılıyorsa ve başarısız oluyorsa çalıştır

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

Derleme zamanlanmışsa, başarısız olsa bile, iptal edilse bile komutunu çalıştırın

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

Release.Artifacts. {artifact-alias}. SourceBranch, Build.SourceBranch ile eşdeğerdir.

Bir değişken true olarak ayarlandıysa, iptal edilse bile, başarısız olsa bile her zaman çalıştır

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

Değişken null ise (boş dize) komutunu çalıştırın

Tüm değişkenler Azure Pipelines'da dize olarak işlendiğinden, boş bir dize bu işlem hattındaki ile null eşdeğerdir.

variables:
- name: testEmpty
  value: ''

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

Bir koşulun parçası olarak şablon parametresi kullanma

Koşula sahip olduğunuz aynı işlem hattında bir parametre bildirdiğinizde, koşullar dikkate alınmadan önce parametre genişletme gerçekleşir. Bu durumda parametreleri koşulların içine ekleyebilirsiniz. Bu YAML dosyasındaki betik doğru olduğundan parameters.doThing çalışacaktır.

condition işlem hattındaki 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() true değerini döndürür çünkü önceki adım yoktur.

işlevi, eq('${{ parameters.doThing }}', true) doThing parametresinin değerine trueeşit olup olmadığını denetler. doThing için varsayılan değer true olduğundan, işlem hattında farklı bir değer ayarlanmadığı sürece koşul varsayılan olarak true döndürür.

Daha fazla şablon parametresi örneği için bkz . Şablon türleri ve kullanımı.

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

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

Bir parametreyi şablona geçirirken, parametrenin değerini şablonunuzda ayarlamanız veya şablona özellik geçirmek için templateContext kullanmanız gerekir.

# 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

Bu işlem hattının çıkışı, I did a thing parametresinin doThing true olmasıdır.

Bir işin çıkış değişkenini sonraki bir işteki bir koşulda kullanma

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 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ımda bir koşuldaki bir adımdan oluşturulan işlem hattı değişkenini kullanma

Bir değişkeni gelecekteki adımlarda kullanılabilir hale getirip bir koşulda belirtebilirsiniz. Varsayılan olarak, bir adımdan oluşturulan değişkenler gelecekteki adımlarda kullanılabilir ve kullanılarak isOutput=trueçok işli çıkış değişkenleri olarak işaretlenmesi gerekmez.

Yukarıdaki yaklaşım ve kapsam belirleme ile ilgili dikkat edilmesi gereken bazı önemli noktalar vardır:

  • bir işteki bir adımda oluşturulan değişkenlerin kapsamı aynı işteki adımlara göre belirlenmiştir.
  • Bir adımda oluşturulan değişkenler yalnızca sonraki adımlarda ortam değişkenleri olarak kullanılabilir.
  • Bir adımda oluşturulan değişkenler, bunları tanımlayan adımda kullanılamaz.

Aşağıda, 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 örneği verilmiştir.

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

SSS

Önceki bir iş başarılı olursa ancak sorunlar varsa başka bir işi nasıl tetikleyebilirim?

Önceki işin sonucunu kullanabilirsiniz. Örneğin, bu YAML dosyasında, İş A sorunlarla başarılı olduğundan bu koşul eq(dependencies.A.result,'SucceededWithIssues') işin ç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. Sorun nedir?

Aşamada yapılandırılan koşul bir iş durumu denetimi işlevi içermiyorsa bu sorunla karşılaşırsınız. Sorunu çözmek için koşula bir iş durumu denetimi işlevi ekleyin. Bir işi kuyruktayken iptal ederseniz ancak çalıştırılmazsanız, diğer tüm aşamalar da dahil olmak üzere işin tamamı iptal edilir.

Derleme iptal edildiğinde işlem hattının davranışı hakkında daha fazla bilgi edinin.