Aracılığıyla paylaş


İş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.SourceBranchbir 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 stage1bağı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 truebir 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 stage1bağ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 truebir 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ş BA 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 truebir 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')
      

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: ${{ 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 trueolup 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.