Bagikan melalui


Kondisi jalur

Layanan Azure DevOps | Azure DevOps Server | Azure DevOps Server 2022

Artikel ini menjelaskan berbagai kondisi yang memungkinkan tahap, pekerjaan, atau langkah Azure Pipelines berjalan, dan cara mengatur kondisi tersebut dalam definisi alur YAML.

Catatan

Artikel ini membahas kemampuan alur YAML. Untuk alur kerja Klasik, Anda dapat menentukan beberapa kondisi di mana tugas atau pekerjaan dijalankan di Opsi Kontrol setiap tugas, dan di Opsi Tambahan untuk pekerjaan dalam alur rilis.

Kondisi tahap, pekerjaan, atau langkah berjalan di bawah

Secara default, pekerjaan atau tahapan alur berjalan jika tidak bergantung pada pekerjaan atau tahap lain, atau jika semua dependensinya selesai dan berhasil. Persyaratan dependensi berlaku untuk dependensi langsung dan ke dependensi tidak langsungnya, dihitung secara rekursif.

Secara default, sebuah langkah akan berjalan jika tidak ada kesalahan dalam pekerjaannya dan langkah sebelumnya telah selesai. Untuk konteks selengkapnya tentang tahapan, pekerjaan, dan langkah-langkah, lihat Konsep utama untuk Azure Pipelines.

Anda dapat mengambil alih atau menyesuaikan perilaku default ini dengan mengatur tahap, pekerjaan, atau langkah untuk dijalankan meskipun atau hanya jika dependensi sebelumnya gagal atau memiliki hasil lain. Anda juga dapat menentukan kondisi kustom. Dalam definisi alur YAML, Anda menggunakan condition properti untuk menentukan kondisi di mana tahap, pekerjaan, atau langkah dapat berjalan.

Catatan

Kondisi berlaku untuk semua dependensi langsung dan tidak langsung sebelumnya dengan kumpulan agen yang sama. Tahapan atau pekerjaan di kumpulan agen yang berbeda berjalan bersamaan.

Kondisi berdasarkan status dependensi sebelumnya meliputi:

  • Berhasil: Jalankan hanya jika semua dependensi sebelumnya berhasil. Perilaku ini adalah default jika tidak ada kondisi yang diatur dalam YAML. Untuk menerapkan kondisi ini, tentukan condition: succeeded().
  • Berhasil atau gagal: Jalankan meskipun dependensi sebelumnya gagal, kecuali eksekusi dibatalkan. Untuk menerapkan kondisi ini, tentukan condition: succeededOrFailed().
  • Selalu: Jalankan meskipun dependensi sebelumnya gagal, meskipun eksekusi dibatalkan. Untuk menerapkan kondisi ini, tentukan condition: always().
  • Gagal: Jalankan hanya ketika dependensi sebelumnya gagal. Untuk menerapkan kondisi ini, tentukan condition: failed().

Penting

Saat Anda menentukan condition properti untuk tahap, pekerjaan, atau langkah, Anda menimpa kondisi default. Tahap, pekerjaan, atau langkah Anda mungkin berjalan meskipun build dibatalkan. Pastikan kondisi Anda memperhitungkan status tahap induk atau pekerjaan.

Contoh kondisi

Contoh YAML berikut menunjukkan always() kondisi dan failed() . Tugas skrip pertama dalam pekerjaan 1 memiliki always kondisi, sehingga berjalan bahkan jika dependensi gagal atau build dibatalkan. Dalam tugas skrip kedua, exit job1 memaksa pekerjaan job1 menjadi gagal.

Tahap alur berjalan secara berurutan secara default, tetapi pekerjaan dapat berjalan secara paralel. Anda dapat menggunakan dependsOn properti untuk secara eksplisit menentukan dependensi antara tahap atau pekerjaan.

Untuk mengatur kondisi untuk pekerjaan yang bergantung pada hasil pekerjaan lain, gunakan dependsOn untuk menentukan dependensi. Dalam contoh berikut, job2 bergantung pada job1 dan berjalan karena job1 gagal.

jobs:
- job: job1
  steps:
  - script: echo Hello!
    condition: always() # this step runs even if the build is canceled
  - script: |
      echo "This task will fail."
      exit job1 
- job: job2
  dependsOn: job1
  condition: failed() # this job runs only if job1 fails

Catatan

Anda juga dapat menggunakan antarmuka pengguna Azure Pipelines untuk menjalankan tahap dependen secara manual saat tahap induk gagal. Untuk informasi selengkapnya, lihat Menjalankan tahapan turunan saat tahap induk gagal.

Kondisi kustom

Jika kondisi bawaan tidak memenuhi kebutuhan Anda, Anda dapat menentukan kondisi kustom sebagai ekspresi dalam definisi alur YAML.

Agen mengevaluasi ekspresi yang dimulai dengan fungsi paling dalam dan melanjutkan ke arah luar. Hasil akhir adalah nilai boolean yang menentukan apakah akan menjalankan tahap, pekerjaan, atau langkah atau tidak. Untuk panduan lengkap untuk sintaks, lihat Ekspresi.

Penting

Kondisi dievaluasi untuk menentukan apakah akan memulai tahap, pekerjaan, atau langkah. Oleh karena itu, tidak ada yang dihitung selama runtime tahap, pekerjaan, atau langkah tersedia untuk digunakan dalam tahap, pekerjaan, atau langkah yang sama. Misalnya, jika Anda mengatur variabel dalam pekerjaan menggunakan ekspresi runtime dengan $[ ] sintaks, Anda tidak dapat menggunakan variabel tersebut dalam kondisi dalam pekerjaan tersebut.

Variabel dalam kondisi

Anda dapat mengatur variabel alur dan menggunakannya dalam kondisi. Alur berikut mengatur isMain variabel dan menggunakannya dalam kondisi yang menjalankan Tahap B hanya ketika cabang sumber build adalah main.

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)

Anda dapat mengatur kondisi untuk dijalankan jika variabel null atau string kosong. Semua variabel diperlakukan sebagai string di Azure Pipelines, sehingga string kosong setara dengan null dalam alur berikut:

variables:
- name: testEmpty
  value: ''

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

Variabel output pekerjaan yang digunakan dalam kondisi pekerjaan lain

Anda dapat membuat variabel dalam pekerjaan yang dapat ditentukan oleh pekerjaan lain dalam tahap yang sama dalam kondisi. Variabel yang tersedia untuk pekerjaan dependen harus ditandai sebagai variabel output multi-pekerjaan dengan menggunakan isOutput=true, seperti dalam kode berikut:

jobs:
- job: A
  steps:
  - bash: |
      echo "This is job A."
      echo "##vso[task.setvariable variable=doThing;isOutput=true]Yes" #set variable doThing to Yes
    name: DetermineResult
- job: B
  dependsOn: A
  condition: eq(dependencies.A.outputs['DetermineResult.doThing'], 'Yes') #map doThing and check the value
  steps:
  - script: echo "Job A ran and doThing is Yes."

Variabel langkah yang digunakan dalam kondisi langkah berikutnya

Anda dapat membuat variabel dalam langkah yang dapat ditentukan dalam pekerjaan yang sama dalam kondisi di masa mendatang. Variabel yang dibuat dari langkah-langkah tersedia untuk langkah-langkah di masa mendatang dalam pekerjaan secara default dan tidak perlu ditandai sebagai variabel output multi-pekerjaan.

Variabel yang dibuat dalam langkah dalam pekerjaan memiliki batasan berikut:

  • Dilingkup ke langkah-langkah dalam pekerjaan yang sama.
  • Tersedia dalam langkah-langkah berikutnya hanya sebagai variabel lingkungan.
  • Tidak dapat digunakan dalam langkah yang sama yang menentukannya.

Contoh berikut membuat variabel alur dalam langkah dan menggunakan variabel dalam kondisi skrip langkah selanjutnya.

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

Pengaturan kondisi untuk berbagai hasil

Tabel berikut ini memperlihatkan condition pengaturan untuk menghasilkan berbagai hasil yang diinginkan.

Hasil yang diinginkan Contoh pengaturan kondisi
Jalankan jika cabang sumber adalah main, bahkan jika tahap induk atau sebelumnya, pekerjaan, atau langkah gagal atau dibatalkan. eq(variables['Build.SourceBranch'], 'refs/heads/main')
Jalankan jika cabang sumber adalah main dan tahap induk atau sebelumnya, pekerjaan, atau langkah berhasil. and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
Jalankan jika cabang sumber bukan main, dan tahap induk atau sebelumnya, pekerjaan, atau langkah berhasil. and(succeeded(), ne(variables['Build.SourceBranch'], 'refs/heads/main'))
Jalankan untuk user cabang jika tahap induk atau sebelumnya, pekerjaan, atau langkah berhasil. and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/heads/users/'))
Jalankan untuk build integrasi kontinu (CI), jika tahap induk, pekerjaan, atau langkah sebelumnya berhasil. and(succeeded(), in(variables['Build.Reason'], 'IndividualCI', 'BatchedCI'))
Jalankan jika permintaan pull memicu build dan tahap induk atau sebelumnya, pekerjaan, atau langkah gagal. and(failed(), eq(variables['Build.Reason'], 'PullRequest'))
Jalankan build yang dijadwalkan, bahkan jika tahap induk atau tahap sebelumnya, pekerjaan, atau langkah gagal atau dibatalkan. eq(variables['Build.Reason'], 'Schedule')
Jalankan jika System.debug variabel diatur ke true, bahkan jika tahap induk atau sebelumnya, pekerjaan, atau langkah gagal atau dibatalkan. eq(variables['System.debug'], true)

Catatan

Release.Artifacts.{artifact-alias}.SourceBranch setara dengan Build.SourceBranch.

Hasil kondisi ketika pembangunan dibatalkan

Membatalkan build tidak berarti bahwa semua tahapan, pekerjaan, dan langkah-langkahnya berhenti berjalan. Pekerjaan, tahapan, atau langkah mana yang berhenti berjalan tergantung pada kondisi yang Anda tentukan, dan pada titik mana eksekusi alur Anda membatalkan build. Jika tahap, pekerjaan, atau induk langkah dilewati, tahap, pekerjaan, atau langkah tidak berjalan, terlepas dari kondisinya.

Tahap, pekerjaan, atau langkah berjalan setiap kali kondisinya bernilai true. Jika kondisi tidak memperhitungkan status induk tugas, tugas mungkin berjalan meskipun induknya dibatalkan. Untuk mengontrol apakah pekerjaan, tahapan, atau langkah berjalan saat build dibatalkan, sertakan fungsi pemeriksaan status pekerjaan dalam kondisi Anda.

Jika Anda membatalkan build saat dalam tahap antrean tetapi belum berjalan, seluruh proses dibatalkan, termasuk semua tahap lainnya.

Catatan

Jika salah satu kondisi Anda memungkinkan tugas berjalan bahkan setelah build dibatalkan, tentukan nilai untuk batas waktu pembatalan yang memberikan cukup waktu untuk tugas selesai setelah eksekusi dibatalkan.

Contoh hasil kondisi tahapan

Contoh berikut menunjukkan hasil dari berbagai kondisi yang diatur pada tahap saat build dibatalkan.

Contoh tahap 1

Dalam alur berikut, secara default stage2 akan bergantung pada stage1 penyelesaian yang berhasil. Namun, stage2 memiliki set condition untuk dijalankan setiap kali cabang sumber adalah main, terlepas dari stage1 statusnya.

Jika Anda mengantre build pada cabang main dan membatalkannya saat stage1 sedang berjalan, stage2 tetap berjalan, karena eq(variables['Build.SourceBranch'], 'refs/heads/main') dievaluasi menjadi 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

Contoh tahap 2

Dalam alur berikut, secara default stage2 bergantung pada stage1 penyelesaian yang berhasil. Pekerjaan B di stage2 memiliki set condition untuk dijalankan setiap kali cabang sumber adalah main.

Jika Anda mengantrekan build di main cabang dan membatalkannya saat stage1 sedang berjalan, stage2 dan pekerjaannya tidak berjalan sama sekali, meskipun tahap berisi pekerjaan yang kondisinya dievaluasi ke true.

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

Contoh tahap 3

Dalam alur berikut, secara default stage2 bergantung pada stage1 penyelesaian yang berhasil. Langkah di dalam pekerjaan B dalam stage2 memiliki set condition untuk dijalankan setiap kali cabang sumber adalah main.

Jika Anda mengantre build di main cabang dan membatalkannya saat stage1 sedang berjalan, stage2 dan pekerjaan B tidak berjalan sama sekali, meskipun pekerjaan B berisi langkah yang kondisinya dievaluasi ke true. Stage2 dilewati sepenuhnya karena stage1 dibatalkan.

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

Contoh hasil kondisi pekerjaan

Contoh berikut menunjukkan hasil dari berbagai kondisi yang ditetapkan pada pekerjaan saat build dibatalkan.

Contoh pekerjaan 1

Dalam alur YAML berikut, pekerjaan B yang berjalan tergantung pada pekerjaan A yang berjalan. Pekerjaan B juga memiliki set condition untuk dijalankan setiap kali cabang sumber adalah main.

Jika Anda mengantre build di main cabang dan membatalkannya saat tugas A berjalan, tugas B masih berjalan, karena condition: eq(variables['Build.SourceBranch'], 'refs/heads/main') dievaluasi menjadi true.

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

Jika Anda ingin pekerjaan B berjalan hanya ketika pekerjaan A berhasil dan sumber build adalah main, Anda harus mengatur ke conditionand(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main')).

Contoh pekerjaan 2

Dalam alur YAML berikut, pekerjaan B tergantung pada pekerjaan A yang berhasil. Pekerjaan B memiliki set condition untuk dijalankan setiap kali pekerjaan A berhasil dan cabang sumber build adalah main.

Jika Anda mengantre build di main cabang dan membatalkannya saat pekerjaan A berjalan, pekerjaan B tidak berjalan, meskipun memiliki build condition yang mengevaluasi ke true. Kondisi pekerjaan B dievaluasi false karena pekerjaan A tidak berhasil. Oleh karena itu, pekerjaan B dan langkah-langkahnya dilewati.

jobs:
- job: A
  steps:
  - script: sleep 30
- job: B
  dependsOn: A 
  steps:
    - script: echo step 2.1
  condition: and(eq(variables['Build.SourceBranch'], 'refs/heads/main'), succeeded())

Contoh hasil kondisi langkah

Anda juga dapat mengatur kondisi pada langkah-langkah. Dalam alur berikut, langkah 2.3 memiliki set condition untuk dijalankan setiap kali cabang sumber adalah main.

Jika Anda memulai build pada branch main dan membatalkannya saat langkah 2.1 atau 2.2 berjalan, langkah 2.3 masih berjalan, karena eq(variables['Build.SourceBranch'], 'refs/heads/main') dievaluasi menjadi 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')

Parameter pada kondisi

Anda dapat menggunakan parameter dalam kondisi. Ekspansi parameter terjadi sebelum alur berjalan dan mengganti nilai yang dikelilingi oleh ${{ }} dengan nilai parameter literal. Karena ekspansi parameter terjadi sebelum evaluasi kondisi, Anda dapat mendeklarasikan parameter dalam alur dan menyematkan parameter di dalam kondisi apa pun dalam alur tersebut.

Dalam condition contoh berikut menggabungkan dua fungsi: succeeded() dan ${{ eq(parameters.doThing, true) }}. Fungsi succeeded() memeriksa apakah langkah sebelumnya berhasil. Fungsi ini juga mengembalikan true jika tidak ada langkah sebelumnya.

Fungsi ${{ eq(parameters.doThing, true) }} memeriksa apakah doThing parameter sama dengan true. Langkah skrip dalam contoh berikut berjalan karena tidak ada langkah sebelumnya dan parameters.doThing secara true default.

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

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

Parameter templat dalam kondisi

Saat meneruskan parameter ke templat alur, Anda dapat mengatur nilai parameter dalam file templat atau menggunakan templateContext untuk meneruskan parameter ke templat.

File templat parameters.yml berikut mendeklarasikan doThing parameter dengan nilai true default dan menggunakan parameter dalam kondisi pekerjaan.

# parameters.yml
parameters:
- name: doThing
  default: true
  type: boolean

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

Definisi alur azure-pipelines.yml berikut mereferensikan pekerjaan dalam file templat parameters.yml . Output alur adalah I did a thing karena parameter doThing benar secara default.

# azure-pipelines.yml

extends:
  template: parameters.yml

Untuk contoh parameter templat lainnya, lihat Referensi penggunaan templat.

FAQ

Bagaimana cara memicu pekerjaan jika pekerjaan sebelumnya berhasil namun dengan beberapa masalah?

Anda dapat menggunakan hasil pekerjaan sebelumnya dalam kondisi tertentu. Dalam YAML berikut, kondisi eq(dependencies.A.result,'SucceededWithIssues') mengatur pekerjaan B untuk dijalankan setelah pekerjaan A berhasil dengan masalah.

jobs:
- job: A
  steps:
  - script: echo Job A ran
- job: B
  dependsOn: A
  condition: eq(dependencies.A.result,'SucceededWithIssues') # targets the result of the previous job 
  steps:
  - script: echo Job A had issues

Mengapa build saya masih berjalan setelah saya membatalkannya?

Anda dapat mengalami masalah ini jika kondisi yang dikonfigurasikan dalam tahap tidak menyertakan fungsi pengecekan status pekerjaan. Untuk mengatasi masalah ini, tambahkan fungsi pemeriksaan status pekerjaan ke kondisi tersebut. Untuk informasi selengkapnya, lihat Hasil kondisi saat build dibatalkan.