Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Layanan Azure DevOps | Azure DevOps Server | Azure DevOps Server 2022
Penting
Pilih versi artikel ini yang sesuai dengan platform dan versi Anda. Pemilih versi berada di atas daftar isi. Cari platform dan versi Azure DevOps Anda.
Gunakan ekspresi saat Anda perlu menentukan string, boolean, atau nilai angka saat menulis alur. Saat ekspresi mengembalikan array, aturan pengindeksan normal berlaku dan indeks dimulai dengan 0.
Penggunaan ekspresi yang paling umum adalah dalam kondisi untuk menentukan apakah pekerjaan atau langkah harus dijalankan.
# Expressions are used to define conditions for a step, job, or stage
steps:
- task: ...
condition: <expression>
Penggunaan umum ekspresi lainnya adalah dalam menentukan variabel.
Anda dapat mengevaluasi ekspresi pada waktu kompilasi atau pada waktu proses.
Gunakan ekspresi waktu kompilasi di mana saja; gunakan ekspresi runtime dalam variabel dan kondisi. Gunakan ekspresi runtime untuk menghitung konten variabel dan status (misalnya: condition).
# Two examples of expressions used to define variables
# The first one, a, is evaluated when the YAML file is compiled into a plan.
# The second one, b, is evaluated at runtime.
# Note the syntax ${{}} for compile time and $[] for runtime expressions.
variables:
a: ${{ <expression> }}
b: $[ <expression> ]
Perbedaan antara sintaks ekspresi waktu proses dan waktu kompilasi terutama pada konteks apa yang tersedia.
Dalam ekspresi waktu kompilasi (${{ <expression> }}), Anda memiliki akses ke parameters dan variables yang ditentukan secara statis.
Dalam ekspresi runtime ($[ <expression> ]), Anda memiliki akses ke elemen tambahan variables tetapi tidak ada parameter.
Dalam contoh ini, ekspresi runtime mengatur nilai $(isMain). Variabel statis dalam ekspresi kompilasi mengatur nilai $(compileVar).
variables:
staticVar: 'my value' # static variable
compileVar: ${{ variables.staticVar }} # compile time expression
isMain: $[eq(variables['Build.SourceBranch'], 'refs/heads/main')] # runtime expression
steps:
- script: |
echo ${{variables.staticVar}} # outputs my value
echo $(compileVar) # outputs my value
echo $(isMain) # outputs True
Ekspresi dapat berupa literal, referensi ke variabel, referensi ke dependensi, fungsi, atau kombinasi berlapis yang valid dari jenis ini.
Harfiah
Sebagai bagian dari ekspresi, Anda dapat menggunakan boolean, null, angka, string, atau literal versi.
# Examples
variables:
someBoolean: ${{ true }} # case insensitive, so True or TRUE also works
someNumber: ${{ -1.2 }}
someString: ${{ 'a b c' }}
someVersion: ${{ 1.2.3 }}
Boolean
True dan False adalah ekspresi harfiah boolean.
Nol
Null adalah ekspresi harfiah khusus yang dikembalikan dari kesalahan kamus, misalnya (variables['noSuch']). Null bisa menjadi output ekspresi tetapi tidak dapat dipanggil langsung dalam ekspresi.
Nomor
Dimulai dengan '-', '.', atau '0' hingga '9'.
string
Harus menggunakan tanda kutip tunggal. Misalnya: 'this is a string'.
Untuk mengekspresikan kutipan tunggal harfiah, lepaskan dengan satu kutipan.
Misalnya: 'It''s OK if they''re using contractions.'.
Anda dapat menggunakan karakter pipa (|) untuk string multibaris.
myKey: |
one
two
three
Versi
Nomor versi yang terdiri dari hingga empat segmen.
Harus dimulai dengan angka dan berisi dua atau tiga karakter titik (.).
Misalnya: 1.2.3.4.
Variabel
Sebagai bagian dari ekspresi, Anda dapat mengakses variabel dengan menggunakan salah satu dari dua sintaks:
- Sintaks indeks:
variables['MyVar'] - Sintaksis dereferensi properti:
variables.MyVar
Untuk menggunakan sintaks dereferensi properti, nama properti harus:
- Mulai dengan
a-Zatau_ - Diikuti oleh
a-Z, ,0-9atau_
Variabel yang berbeda tersedia tergantung pada konteks eksekusi.
- Jika Anda membuat alur menggunakan YAML, variabel alur tersedia.
- Jika Anda membuat alur build menggunakan editor klasik, maka variabel build tersedia.
- Jika Anda membuat alur rilis menggunakan editor klasik, variabel rilis tersedia.
Variabel selalu string. Jika Anda ingin menggunakan nilai yang ditik, gunakan parameter.
Catatan
Ada batasan untuk menggunakan variabel dengan ekspresi dalam alur kerja Klasik dan YAML saat menyetel variabel tersebut melalui antarmuka pengguna tab variabel. Variabel yang didefinisikan sebagai ekspresi tidak boleh bergantung pada variabel lain dengan ekspresi dalam nilai karena tidak dijamin bahwa kedua ekspresi akan dievaluasi dengan benar. Misalnya kita memiliki variabel a yang nilainya $[ <expression> ] digunakan sebagai bagian untuk nilai variabel b. Karena urutan pemrosesan variabel tidak dijamin variabel b dapat memiliki nilai variabel a yang salah setelah evaluasi.
Anda hanya dapat menggunakan konstruksi ini saat menyiapkan variabel melalui kata kunci variabel dalam alur YAML. Anda perlu menempatkan variabel dalam urutan yang harus diproses untuk mendapatkan nilai yang benar setelah pemrosesan.
Functions
Anda dapat menggunakan fungsi bawaan berikut dalam ekspresi.
dan
- Mengevaluasi ke
Truejika semua parameter adalahTrue. - Parameter minimal: 2. Parameter maksimum: N.
- Mentransmisikan parameter ke Boolean untuk evaluasi.
- Sirkuit pendek setelah pertama
False. - Contoh:
and(eq(variables.letters, 'ABC'), eq(variables.numbers, 123))
gabungkan
- Mengevaluasi parameter secara berurutan (kiri ke kanan), dan mengembalikan nilai pertama yang bukan null atau string kosong.
- Tidak mengembalikan nilai jika semua nilai parameter adalah string null atau kosong.
- Parameter minimal: 2. Parameter maksimum: N.
- Contoh:
coalesce(variables.couldBeNull, variables.couldAlsoBeNull, 'literal so it always works')
mengandung
- Mengevaluasi ke
Truejika string parameter kiri berisi parameter yang tepat. - Parameter minimum: 2. Parameter maksimum: 2.
- Mentransmisikan parameter ke string untuk evaluasi.
- Melakukan perbandingan ordinal ignore-case.
- Contoh:
contains('ABCDE', 'BCD')(mengembalikan True).
mengandungNilai
- Mengevaluasi
Trueapakah parameter kiri adalah array, dan apakah ada item yang sama dengan parameter di sebelah kanan. Juga mengevaluasiTrueapakah parameter kiri adalah objek, dan nilai properti apa pun sama dengan parameter yang tepat. - Parameter minimum adalah: 2. Parameter maksimum: 2.
- Jika parameter kiri adalah array, konversikan setiap item agar sesuai dengan jenis parameter kanan. Jika parameter kiri adalah objek, konversikan nilai setiap properti agar sesuai dengan jenis parameter kanan. Perbandingan kesetaraan untuk setiap item tertentu akan mengevaluasi
Falsejika konversi gagal. - Perbandingan abaikan kasus ordinal untuk string.
- Sirkuit pendek setelah pertandingan pertama
Catatan
Tidak ada sintaksis harfiah dalam alur YAML untuk menentukan array. Fungsi ini memiliki kegunaan terbatas dalam alur kerja umumnya. Ini ditujukan untuk digunakan dalam konteks dekorator pipeline dengan array yang disediakan sistem seperti daftar langkah.
Anda dapat menggunakan containsValue ekspresi untuk menemukan nilai yang cocok dalam objek. Berikut adalah contoh yang menunjukkan cara mencari di daftar cabang asal untuk menemukan kecocokan dengan Build.SourceBranch.
parameters:
- name: branchOptions
displayName: Source branch options
type: object
default:
- refs/heads/main
- refs/heads/test
jobs:
- job: A1
steps:
- ${{ each value in parameters.branchOptions }}:
- script: echo ${{ value }}
- job: B1
condition: ${{ containsValue(parameters.branchOptions, variables['Build.SourceBranch']) }}
steps:
- script: echo "Matching branch found"
konversiToJson
- Ambil objek yang kompleks dan keluarkan sebagai JSON.
- Parameter minimum: 1. Parameter maks: 1.
parameters:
- name: listOfValues
type: object
default:
this_is:
a_complex: object
with:
- one
- two
steps:
- script: |
echo "${MY_JSON}"
env:
MY_JSON: ${{ convertToJson(parameters.listOfValues) }}
Keluaran skrip
{
"this_is": {
"a_complex": "object",
"with": [
"one",
"two"
]
}
}
penghitung
- Gunakan fungsi ini hanya dalam ekspresi yang menentukan variabel. Jangan gunakan sebagai bagian dari kondisi untuk langkah, tugas, atau tahapan.
- Mengevaluasi angka yang meningkat dengan setiap kali jalankan pipeline.
- Mengambil dua parameter:
prefixdanseed. -
prefixadalah ekspresi string. Fungsi ini melacak nilai penghitung terpisah untuk setiap nilai unikprefix. Gunakan karakter UTF-16 diprefix. -
seedadalah nilai awal penghitung.
Anda dapat membuat penghitung yang secara otomatis bertambah satu per satu setiap kali pipeline Anda dijalankan. Saat Anda menentukan penghitung, berikan prefix dan seed. Contoh berikut menunjukkan konsep ini.
variables:
major: 1
# define minor as a counter with the prefix as variable major, and seed as 100.
minor: $[counter(variables['major'], 100)]
steps:
- bash: echo $(minor)
Nilai minor dalam contoh sebelumnya adalah 100 selama eksekusi pertama alur. Dalam eksekusi kedua, nilainya adalah 101, selama nilai major tetap 1.
Jika Anda mengedit file YAML dan memperbarui nilai variabel major menjadi 2, nilainya minor adalah 100 dalam eksekusi alur berikutnya. Eksekusi berikutnya akan menaikkan penghitung ke 101, 102, 103, dan sebagainya.
Jika nanti Anda mengedit file YAML dan mengatur nilai major kembali ke 1, nilai penghitung dimulai dari tempat yang terakhir untuk awalan tersebut. Dalam contoh ini, dilanjutkan pada 102.
Contoh berikut menunjukkan cara mengatur variabel untuk bertindak sebagai penghitung yang dimulai dari 100, berinkrement 1 setiap kali dijalankan, dan kembali ke 100 setiap hari.
Catatan
pipeline.startTime tidak tersedia di luar ekspresi.
pipeline.startTime memformat system.pipelineStartTime ke dalam objek tanggal dan waktu untuk dapat digunakan oleh ekspresi.
Zona waktu default untuk pipeline.startTime adalah UTC. Anda dapat mengubah zona waktu untuk organisasi Anda.
jobs:
- job:
variables:
a: $[counter(format('{0:yyyyMMdd}', pipeline.startTime), 100)]
steps:
- bash: echo $(a)
Contoh berikut menunjukkan penghitung yang mempertahankan nilai terpisah untuk eksekusi PR dan CI.
variables:
patch: $[counter(variables['build.reason'], 0)]
Penghitung dilingkup ke alur. Dengan kata lain, alur menaikkan nilai penghitung untuk setiap eksekusi. Tidak ada penghitung yang khusus untuk proyek.
berakhir dengan
- Mengevaluasi
Trueapakah parameter string di sebelah kiri berakhir dengan parameter di sebelah kanan. - Parameter minimal: 2. Parameter maksimum: 2.
- Mentransmisikan parameter ke string untuk evaluasi.
- Melakukan perbandingan ordinal ignore-case.
- Contoh:
endsWith('ABCDE', 'DE')(mengembalikan True)
Eq
- Mengevaluasi
Trueapakah parameter sama - Parameter minimum: 2. Parameter maksimum: 2.
- Mengonversi parameter kanan untuk mencocokkan jenis parameter kiri. Mengembalikan
Falsejika konversi gagal. - Perbandingan abaikan kasus ordinal untuk string.
- Contoh:
eq(variables.letters, 'ABC')
bentuk
- Mengevaluasi parameter berikutnya dan menyisipkannya ke dalam string parameter terkemuka
- Parameter minimum: 1. Parameter maks: N
- Contoh:
format('Hello {0} {1}', 'John', 'Doe') - Menggunakan spesifikasi format tanggal dan waktu kustom .NET untuk pemformatan tanggal (,
yyyy,yy,MM,M,dd,d,HH,H,m,mm,ss,s,f,ff,ffff,K) - Contoh:
format('{0:yyyyMMdd}', pipeline.startTime). Dalam halpipeline.startTimeini adalah variabel objek waktu tanggal khusus. - Lolos dengan menggandakan kurung kurawal. Misalnya:
format('literal left brace {{ and literal right brace }}')
Ge
- Mengevaluasi
Trueapakah parameter kiri lebih besar dari atau sama dengan parameter kanan - Parameter minimum: 2. Parameter maksimum: 2.
- Mengonversi parameter kanan untuk mencocokkan jenis parameter kiri. Kesalahan jika konversi gagal.
- Perbandingan ordinal tanpa memperhatikan huruf besar-kecil untuk string.
- Contoh:
ge(5, 5)(mengembalikan True)
GT
- Mengevaluasi
Trueapakah parameter kiri lebih besar dari parameter kanan - Parameter minimumnya: 2. Parameter maksimum: 2.
- Mengonversi parameter kanan untuk mencocokkan jenis parameter kiri. Kesalahan jika konversi gagal.
- Perbandingan abaikan kasus ordinal untuk string.
- Contoh:
gt(5, 2)(mengembalikan True)
di
- Mengevaluasi
Trueapakah parameter kiri sama dengan parameter kanan apa pun - Parameter minimum: 1. Parameter maks: N
- Mengonversi parameter kanan untuk mencocokkan jenis parameter kiri. Perbandingan kesetaraan mengevaluasi
Falseapakah konversi gagal. - Perbandingan ordinal tanpa memperhatikan huruf besar/kecil untuk string.
- Sirkuit pendek setelah pertandingan pertama
- Contoh:
in('B', 'A', 'B', 'C')(mengembalikan True)
iif
- Mengembalikan parameter kedua jika parameter pertama mengevaluasi ke
True, dan parameter ketiga sebaliknya - Parameter minimum: 1. Parameter maks: 3
- Parameter pertama harus berupa kondisi
- Contoh:
iif(eq(variables['Build.Reason'], 'PullRequest'), 'ManagedDevOpsPool', 'Azure Pipelines')mengembalikan 'ManagedDevOpsPool' saat alur berjalan sebagai respons terhadap PR.
gabung
- Menghubungkan semua elemen dalam array parameter di sebelah kanan, dipisahkan oleh string parameter di sebelah kiri.
- Parameter minimumnya: 2. Parameter maksimum: 2.
- Setiap elemen dalam array dikonversi menjadi string. Objek kompleks dikonversi menjadi string kosong.
- Jika parameter yang tepat bukan array, hasilnya adalah parameter yang tepat yang dikonversi menjadi string.
Dalam contoh ini, titik koma ditambahkan di antara setiap item dalam array. Jenis parameter adalah objek.
parameters:
- name: myArray
type: object
default:
- FOO
- BAR
- ZOO
variables:
A: ${{ join(';',parameters.myArray) }}
steps:
- script: echo $A # outputs FOO;BAR;ZOO
Le
- Mengevaluasi
Trueapakah parameter kiri kurang dari atau sama dengan parameter kanan - Parameter minimum: 2. Parameter maksimum: 2.
- Mengonversi parameter kanan untuk mencocokkan jenis parameter kiri. Kesalahan jika konversi gagal.
- Melakukan perbandingan ordinal yang mengabaikan kasus untuk string.
- Contoh:
le(2, 2)(mengembalikan True)
panjang
- Mengembalikan panjang string atau array, baik yang berasal dari sistem atau yang berasal dari parameter
- Parameter yang minimum: 1. Parameter maksimum: 1.
- Contoh:
length('fabrikam')mengembalikan 8.
rendah
- Mengonversi string atau nilai variabel ke semua karakter huruf kecil.
- Parameter minimum: 1. Parameter maksimum: 1.
- Mengembalikan versi huruf kecil dari sebuah string.
- Contoh:
lower('FOO')mengembalikanfoo.
liter
- Mengevaluasi
Trueapakah parameter kiri kurang dari parameter kanan. - Parameter minimum: 2. Parameter maksimum: 2.
- Mengonversi parameter kanan untuk mencocokkan jenis parameter kiri. Kesalahan jika konversi gagal.
- Perbandingan abaikan kasus ordinal untuk string.
- Contoh:
lt(2, 5)(mengembalikan True)
Ne
- Mengevaluasi
Trueapakah parameter tidak sama - Parameter minimum: 2. Parameter maksimum: 2.
- Mengonversi parameter kanan untuk mencocokkan jenis parameter kiri. Mengembalikan
Truejika konversi gagal. - Perbandingan abaikan kasus ordinal untuk string.
- Contoh:
ne(1, 2)mengembalikanTrue.
tidak
- Mengevaluasi
Truejika parameter adalahFalse - Parameter minimum: 1. Parameter maks: 1
- Mengonversi nilai ke Boolean untuk evaluasi
- Contoh:
not(eq(1, 2))(mengembalikan True)
tidakDiDalam
- Mengevaluasi
Trueapakah parameter kiri tidak sama dengan parameter kanan apa pun - Parameter minimum: 1. Parameter maks: N
- Mengonversi parameter kanan untuk mencocokkan jenis parameter kiri. Perbandingan kesetaraan mengevaluasi
Falseapakah konversi gagal. - Perbandingan ordinal tanpa memperhatikan huruf besar-kecil pada string.
- Sirkuit pendek setelah pertandingan pertama
- Contoh:
notIn('D', 'A', 'B', 'C')(mengembalikan True)
atau
- Mengevaluasi
Truejika ada parameterTrue - Parameter minimum: 2. Parameter maksimum: N.
- Mentransmisikan parameter ke Boolean untuk evaluasi.
- Hubungan arus pendek setelah yang pertama
True - Contoh:
or(eq(1, 1), eq(2, 3))(mengembalikan True, penghentian lebih awal)
ganti
- Mengembalikan string baru di mana semua instans string dalam instans saat ini diganti dengan string lain.
- Parameter minimum: 3. Parameter maksimum: 3.
-
replace(a, b, c): mengembalikana, dengan semua instansbdigantikan olehc. - Contoh:
replace('https://www.tinfoilsecurity.com/saml/consume','https://www.tinfoilsecurity.com','http://server')(mengembalikanhttp://server/saml/consume).
belah
- Memisahkan string menjadi substring berdasarkan karakter pembatas yang ditentukan.
- Parameter minimum adalah: 2. Parameter maksimum: 2.
- Parameter pertama adalah string yang akan dipisahkan.
- Parameter kedua adalah karakter pembatas.
- Mengembalikan serangkaian substring. Array menyertakan string kosong saat karakter pembatas muncul secara berturut-turut atau di akhir string.
- Contoh:
variables: - name: environments value: prod1,prod2 steps: - ${{ each env in split(variables.environments, ',')}}: - script: ./deploy.sh --environment ${{ env }} - Contoh penggunaan split() dengan replace():
parameters: - name: resourceIds type: object default: - /subscriptions/mysubscription/resourceGroups/myResourceGroup/providers/Microsoft.Network/loadBalancers/kubernetes-internal - /subscriptions/mysubscription02/resourceGroups/myResourceGroup02/providers/Microsoft.Network/loadBalancers/kubernetes - name: environments type: object default: - prod1 - prod2 trigger: - main steps: - ${{ each env in parameters.environments }}: - ${{ each resourceId in parameters.resourceIds }}: - script: echo ${{ replace(split(resourceId, '/')[8], '-', '_') }}_${{ env }}
startsWith (dimulaiDengan)
- Mengevaluasi
Trueapakah string parameter kiri dimulai dengan parameter kanan - Parameter yang minimum: 2. Parameter maksimum: 2.
- Mentransmisikan parameter ke string untuk evaluasi.
- Melakukan perbandingan ordinal ignore-case.
- Contoh:
startsWith('ABCDE', 'AB')(mengembalikan True).
pangkas
- Mengembalikan parameter tanpa spasi putih di awal dan akhir
- Parameter minimum: 1. Parameter maks: 1
- Contoh:
trim(' variable ')mengembalikan 'variabel'
atas
- Mengonversi string atau nilai variabel ke semua karakter huruf besar
- Parameter minimum: 1. Parameter maksimum: 1.
- Mengembalikan huruf besar yang setara dengan string
- Contoh:
upper('bah')mengembalikanBAH
xor
- Mengevaluasi
Truejika hanya ada satu parameter yangTrue - Parameter yang minimum: 2. Parameter maksimum: 2.
- Mentransmisikan parameter ke Boolean untuk evaluasi.
- Contoh:
xor(True, False)(mengembalikan True)
Fungsi pemeriksaan status pekerjaan
Gunakan fungsi pemeriksaan status berikut sebagai ekspresi dalam kondisi, tetapi tidak dalam definisi variabel.
selalu
- Selalu menghasilkan
True(meskipun ketika dibatalkan). Catatan: Kegagalan kritis mungkin masih mencegah tugas berjalan. Misalnya, jika gagal mendapatkan sumber.
dibatalkan
- Akan menjadi
Truejika alur dibatalkan.
gagal
- Untuk satu langkah, setara dengan
eq(variables['Agent.JobStatus'], 'Failed'). - Untuk pekerjaan:
- Tanpa adanya argumen, akan bernilai
Truejika ada pekerjaan sebelumnya dalam grafik dependensi yang gagal. - Dengan nama pekerjaan sebagai argumen, mengevaluasi ke
Truejika salah satu pekerjaan tersebut gagal.
- Tanpa adanya argumen, akan bernilai
berhasil
- Untuk satu langkah, setara dengan
in(variables['Agent.JobStatus'], 'Succeeded', 'SucceededWithIssues'). - Gunakan dengan
dependsOnsaat mengerjakan tugas dan Anda ingin memeriksa apakah tugas sebelumnya berhasil. Pekerjaan berjalan secara paralel, sementara tahapan berjalan secara berurutan. - Untuk pekerjaan:
- Tanpa argumen, akan dievaluasi ke
Truejika semua pekerjaan sebelumnya pada graf dependensi berhasil atau sebagian berhasil. - Dengan nama pekerjaan sebagai argumen, mengevaluasi apakah
Truesemua pekerjaan tersebut berhasil atau sebagian berhasil. - Akan menjadi
Falsejika alur dibatalkan.
- Tanpa argumen, akan dievaluasi ke
berhasilAtauGagal
Untuk satu langkah, setara dengan
in(variables['Agent.JobStatus'], 'Succeeded', 'SucceededWithIssues', 'Failed').Untuk pekerjaan:
- Tanpa argumen, akan menghasilkan
Trueterlepas dari apakah ada pekerjaan dalam grafik dependensi yang berhasil atau gagal. - Dengan nama pekerjaan sebagai argumen, mengevaluasi
Trueapakah salah satu pekerjaan tersebut berhasil atau gagal. - Anda mungkin ingin menggunakan
not(canceled())sebagai gantinya ketika pekerjaan sebelumnya dalam grafik dependensi dilewati.
Fungsi ini seperti
always(), kecuali akan bernilaiFalseketika alur dibatalkan.- Tanpa argumen, akan menghasilkan
Penyisipan bersyarat
Gunakan ifklausa , elseif, dan else untuk menetapkan nilai variabel secara kondisional atau mengatur input untuk tugas. Anda juga dapat menjalankan langkah secara kondisional saat kondisi terpenuhi.
Kondisi hanya berfungsi saat Anda menggunakan sintaks template. Untuk informasi selengkapnya, lihat sintaks variabel.
Untuk templat, Anda dapat menggunakan penyisipan kondisi saat menambahkan urutan atau pemetaan. Untuk informasi selengkapnya, lihat penyisipan bersyarat dalam templat.
Menetapkan variabel secara kondisional
variables:
${{ if eq(variables['Build.SourceBranchName'], 'main') }}: # only works if you have a main branch
stageName: prod
pool:
vmImage: 'ubuntu-latest'
steps:
- script: echo ${{variables.stageName}}
Mengatur input tugas secara kondisional
pool:
vmImage: 'ubuntu-latest'
steps:
- task: PublishPipelineArtifact@1
inputs:
targetPath: '$(Pipeline.Workspace)'
${{ if eq(variables['Build.SourceBranchName'], 'main') }}:
artifact: 'prod'
${{ else }}:
artifact: 'dev'
publishLocation: 'pipeline'
Menjalankan langkah secara kondisional
Jika tidak ada set variabel, atau nilai foo tidak cocok dengan if kondisi, else pernyataan akan berjalan. Dalam contoh ini, nilai foo memberikan hasil true dalam kondisi elseif.
variables:
- name: foo
value: contoso # triggers elseif condition
pool:
vmImage: 'ubuntu-latest'
steps:
- script: echo "start"
- ${{ if eq(variables.foo, 'adaptum') }}:
- script: echo "this is adaptum"
- ${{ elseif eq(variables.foo, 'contoso') }}: # true
- script: echo "this is contoso"
- ${{ else }}:
- script: echo "the value is not adaptum or contoso"
Setiap kata kunci
Gunakan kata kunci each untuk mengulang melalui parameter dengan jenis objek.
parameters:
- name: listOfStrings
type: object
default:
- one
- two
steps:
- ${{ each value in parameters.listOfStrings }}:
- script: echo ${{ value }}
Anda juga dapat melakukan iterasi melalui elemen berlapis dalam objek.
parameters:
- name: listOfFruits
type: object
default:
- fruitName: 'apple'
colors: ['red','green']
- fruitName: 'lemon'
colors: ['yellow']
steps:
- ${{ each fruit in parameters.listOfFruits }} :
- ${{ each fruitColor in fruit.colors}} :
- script: echo ${{ fruit.fruitName}} ${{ fruitColor }}
Dependensi
Ekspresi dapat menggunakan konteks dependensi untuk mereferensikan pekerjaan atau tahap sebelumnya. Gunakan ketergantungan untuk:
- Mereferensikan status pekerjaan dari pekerjaan sebelumnya
- Mereferensikan status tahap dari tahap sebelumnya
- Variabel output referensi dalam pekerjaan sebelumnya dalam tahap yang sama
- Referensi variabel output pada tahap sebelumnya dalam sebuah tahap.
- Variabel output referensi dalam pekerjaan di tahap sebelumnya pada tahap berikut
Konteks dipanggil dependencies untuk pekerjaan dan tahapan dan berfungsi seperti variabel.
Jika Anda merujuk ke variabel output dari pekerjaan di tahap lain, konteksnya disebut stageDependencies.
Jika Anda mengalami masalah dengan variabel output yang memiliki karakter kutipan (' atau ") di dalamnya, lihat panduan pemecahan masalah ini.
Gambaran Umum Sintaksis Dependensi
Sintaks mereferensikan variabel output dengan dependensi bervariasi tergantung pada keadaannya. Berikut adalah gambaran umum skenario yang paling umum. Mungkin ada kalanya sintaks alternatif juga berfungsi.
Jenis
Keterangan
dependensi antara tahap (tahap yang berbeda)
Gunakan variabel output dari tahap sebelumnya di sebuah pekerjaan pada tahap yang berbeda dalam kondisi di stages.
- Sintaks:
and(succeeded(), eq(stageDependencies.<stage-name>.outputs['<job-name>.<step-name>.<variable-name>'], 'true')) - Contoh:
and(succeeded(), eq(stageDependencies.A.outputs['A1.printvar.shouldrun'], 'true'))
dependensi pekerjaan ke pekerjaan (pada tahapan yang sama)
Referensikan variabel output dalam pekerjaan yang berbeda dalam tahap yang sama di stages.
- Sintaks:
and(succeeded(), eq(dependencies.<job-name>.outputs['<step-name>.<variable-name>'], 'true')) - Contoh:
and(succeeded(), eq(dependencies.A.outputs['printvar.shouldrun'], 'true'))
Pekerjaan untuk mengatur tahapan dependensi (tahapan yang berbeda)
Referensikan variabel output dalam tahap yang berbeda dalam job.
- Sintaks:
eq(stageDependencies.<stage-name>.<job-name>.outputs['<step-name>.<variable-name>'], 'true') - Contoh:
eq(stageDependencies.A.A1.outputs['printvar.shouldrun'], 'true')
Keterkaitan antar tahap (tugas penyebaran)
Variabel output referensi dalam tugas penyebaran dalam tahap yang berbeda di stages.
- Sintaks:
eq(dependencies.<stage-name>.outputs['<deployment-job-name>.<deployment-job-name>.<step-name>.<variable-name>'], 'true') - Contoh:
eq(dependencies.build.outputs['build_job.build_job.setRunTests.runTests'], 'true')
Ketergantungan tahap ke tahap (pekerjaan penyebaran dengan sumber daya)
Referensikan variabel output dalam pekerjaan penyebaran yang menyertakan sumber daya dalam tahap yang berbeda di stages.
- Sintaks:
eq(dependencies.<stage-name>.outputs['<deployment-job-name>.<Deploy_resource-name>.<step-name>.<variable-name>'], 'true') - Contoh:
eq(dependencies.build.outputs['build_job.Deploy_winVM.setRunTests.runTests'], 'true')
Sintaks untuk variabel output dalam tugas penyebaran berbeda-beda tergantung pada strategi penyebaran. Untuk informasi selengkapnya, lihat Tugas penyebaran.
Keterhubungan tahapan ke tahapan ketergantungan
Secara struktural, objek dependencies adalah struktur yang menggambarkan nama pekerjaan dan tahapan ke results dan outputs.
Dinyatakan sebagai JSON, terlihat seperti:
"dependencies": {
"<STAGE_NAME>" : {
"result": "Succeeded|SucceededWithIssues|Skipped|Failed|Canceled",
"outputs": {
"jobName.stepName.variableName": "value"
}
},
"...": {
// another stage
}
}
Catatan
Contoh berikut menggunakan sintaks alur standar. Jika Anda menggunakan alur penyebaran, sintaks variabel dan variabel bersyarat berbeda. Untuk informasi tentang sintaksis tertentu yang akan digunakan, lihat Pekerjaan penyebaran.
Gunakan bentuk dependencies ini untuk memetakan variabel atau memeriksa kondisi pada tahap.
Dalam contoh ini, ada dua tahap, A dan B. Tahap A memiliki kondisi false dan tidak berjalan. Tahap B berjalan jika hasil Tahap A adalah Succeeded, , SucceededWithIssuesatau Skipped. Tahap B berjalan karena Tahap A diabaikan.
stages:
- stage: A
condition: false
jobs:
- job: A1
steps:
- script: echo Job A1
- stage: B
condition: in(dependencies.A.result, 'Succeeded', 'SucceededWithIssues', 'Skipped')
jobs:
- job: B1
steps:
- script: echo Job B1
Tahapan juga dapat menggunakan variabel output dari tahap lain.
Dalam contoh ini, ada dua tahap. Tahap A mencakup pekerjaan, A1, yang mengatur variabel shouldrun output ke true. Tahap B berjalan ketika shouldrun adalah true. Karena shouldrun adalah true, Tahap B dijalankan.
stages:
- stage: A
jobs:
- job: A1
steps:
- bash: echo "##vso[task.setvariable variable=shouldrun;isOutput=true]true"
# or on Windows:
# - script: echo ##vso[task.setvariable variable=shouldrun;isOutput=true]true
name: printvar
- stage: B
condition: and(succeeded(), eq(dependencies.A.outputs['A1.printvar.shouldrun'], 'true'))
dependsOn: A
jobs:
- job: B1
steps:
- script: echo hello from Stage B
Catatan
Secara default, setiap tahapan dalam alur bergantung pada satu tahapan tepat sebelum tahapan tersebut di file YAML.
Jika Anda perlu merujuk ke tahap yang tidak langsung sebelum tahap saat ini, Anda dapat mengubah pengaturan default otomatis ini dengan menambahkan bagian dependsOn ke tahap tersebut.
Dependensi antar pekerjaan dalam satu tahap
Pada tingkat pekerjaan dalam satu tahap, data dependencies tidak berisi informasi pada tingkat tahap.
"dependencies": {
"<JOB_NAME>": {
"result": "Succeeded|SucceededWithIssues|Skipped|Failed|Canceled",
"outputs": {
"stepName.variableName": "value1"
}
},
"...": {
// another job
}
}
Dalam contoh ini, ada tiga pekerjaan (a, b, dan c). Pekerjaan a selalu dilewati karena condition: false.
Pekerjaan b berjalan karena tidak memiliki kondisi terkait.
Pekerjaan c berjalan karena semua dependensinya berhasil (pekerjaan b) atau dilewati (pekerjaan a).
jobs:
- job: a
condition: false
steps:
- script: echo Job a
- job: b
steps:
- script: echo Job b
- job: c
dependsOn:
- a
- b
condition: |
and
(
in(dependencies.a.result, 'Succeeded', 'SucceededWithIssues', 'Skipped'),
in(dependencies.b.result, 'Succeeded', 'SucceededWithIssues', 'Skipped')
)
steps:
- script: echo Job c
Dalam contoh ini, Job B bergantung pada variabel output dari Pekerjaan A.
jobs:
- job: A
steps:
- bash: echo "##vso[task.setvariable variable=shouldrun;isOutput=true]true"
# or on Windows:
# - script: echo ##vso[task.setvariable variable=shouldrun;isOutput=true]true
name: printvar
- job: B
condition: and(succeeded(), eq(dependencies.A.outputs['printvar.shouldrun'], 'true'))
dependsOn: A
steps:
- script: echo hello from B
Dependensi antar pekerjaan di berbagai tahap
Pada tingkat pekerjaan, Anda juga dapat mereferensikan output dari pekerjaan di tahap sebelumnya.
Ini memerlukan penggunaan stageDependencies konteks.
"stageDependencies": {
"<STAGE_NAME>" : {
"<JOB_NAME>": {
"result": "Succeeded|SucceededWithIssues|Skipped|Failed|Canceled",
"outputs": {
"stepName.variableName": "value"
}
},
"...": {
// another job
}
},
"...": {
// another stage
}
}
Dalam contoh ini, pekerjaan B1 akan berjalan jika pekerjaan A1 dilewati. Job B2 memeriksa nilai variabel output dari pekerjaan A1 untuk menentukan apakah variabel tersebut harus berjalan.
stages:
- stage: A
jobs:
- job: A1
steps:
- bash: echo "##vso[task.setvariable variable=shouldrun;isOutput=true]true"
# or on Windows:
# - script: echo ##vso[task.setvariable variable=shouldrun;isOutput=true]true
name: printvar
- stage: B
dependsOn: A
jobs:
- job: B1
condition: in(stageDependencies.A.A1.result, 'Skipped') # change condition to `Succeeded and stage will be skipped`
steps:
- script: echo hello from Job B1
- job: B2
condition: eq(stageDependencies.A.A1.outputs['printvar.shouldrun'], 'true')
steps:
- script: echo hello from Job B2
Jika pekerjaan bergantung pada variabel yang ditentukan oleh pekerjaan penyebaran dalam tahap yang berbeda, maka sintaksnya berbeda. Dalam contoh berikut, pekerjaan run_tests berjalan jika pekerjaan penerapan build_job diatur runTests ke true. Perhatikan bahwa kunci yang digunakan untuk outputs kamus adalah build_job.setRunTests.runTests.
stages:
- stage: build
jobs:
- deployment: build_job
environment:
name: Production
strategy:
runOnce:
deploy:
steps:
- task: PowerShell@2
name: setRunTests
inputs:
targetType: inline
pwsh: true
script: |
$runTests = "true"
echo "setting runTests: $runTests"
echo "##vso[task.setvariable variable=runTests;isOutput=true]$runTests"
- stage: test
dependsOn:
- 'build'
jobs:
- job: run_tests
condition: eq(stageDependencies.build.build_job.outputs['build_job.setRunTests.runTests'], 'true')
steps:
...
Variabel output pekerjaan penyebaran
Jika tahap tergantung pada variabel yang ditentukan oleh pekerjaan penyebaran dalam tahap yang berbeda, maka sintaksnya berbeda. Dalam contoh berikut, tahap test bergantung pada pengaturan penyebaran build_job untuk shouldTest hingga true. Perhatikan bahwa di condition dari tahap test, build_job muncul dua kali.
stages:
- stage: build
jobs:
- deployment: build_job
environment:
name: Production
strategy:
runOnce:
deploy:
steps:
- task: PowerShell@2
name: setRunTests
inputs:
targetType: inline
pwsh: true
script: |
$runTests = "true"
echo "setting runTests: $runTests"
echo "##vso[task.setvariable variable=runTests;isOutput=true]$runTests"
- stage: test
dependsOn:
- 'build'
condition: eq(dependencies.build.outputs['build_job.build_job.setRunTests.runTests'], 'true')
jobs:
- job: A
steps:
- script: echo Hello from job A
Dalam contoh di atas, kondisi mereferensikan lingkungan dan bukan sumber daya lingkungan. Untuk mereferensikan sumber daya lingkungan, Anda harus menambahkan nama sumber daya lingkungan ke kondisi dependensi. Dalam contoh berikut, kondisi mereferensikan sumber daya komputer virtual lingkungan bernama vmtest.
stages:
- stage: build
jobs:
- deployment: build_job
environment:
name: vmtest
resourceName: winVM2
resourceType: VirtualMachine
strategy:
runOnce:
deploy:
steps:
- task: PowerShell@2
name: setRunTests
inputs:
targetType: inline
pwsh: true
script: |
$runTests = "true"
echo "setting runTests: $runTests"
echo "##vso[task.setvariable variable=runTests;isOutput=true]$runTests"
- stage: test
dependsOn:
- 'build'
condition: eq(dependencies.build.outputs['build_job.Deploy_winVM2.setRunTests.runTests'], 'true')
jobs:
- job: A
steps:
- script: echo Hello from job A
Array yang difilter
Saat Anda bekerja dengan kumpulan item, gunakan * sintaks untuk menerapkan array yang difilter. Array yang difilter mengembalikan semua objek atau elemen terlepas dari namanya.
Misalnya, pertimbangkan array objek bernama foo. Anda ingin mendapatkan array dari nilai properti id pada setiap objek di dalam array Anda.
[
{ "id": 1, "a": "avalue1"},
{ "id": 2, "a": "avalue2"},
{ "id": 3, "a": "avalue3"}
]
Gunakan ekspresi berikut:
foo.*.id
Ekspresi ini memberi tahu sistem untuk memperlakukan foo sebagai array yang difilter lalu memilih id properti dari setiap objek.
Ekspresi ini mengembalikan:
[ 1, 2, 3 ]
Pengubahan tipe
Nilai dalam ekspresi mungkin dikonversi dari satu jenis ke jenis lainnya saat ekspresi dievaluasi. Saat Anda mengevaluasi ekspresi, proses mengonversi parameter ke jenis data yang relevan lalu mengubahnya kembali menjadi string.
Misalnya, dalam YAML ini, nilai True dan False konversi ke 1 dan 0 saat ekspresi dievaluasi.
Fungsi lt() mengembalikan True ketika parameter kiri kurang dari parameter kanan.
variables:
firstEval: $[lt(False, True)] # 0 vs. 1, True
secondEval: $[lt(True, False)] # 1 vs. 0, False
steps:
- script: echo $(firstEval)
- script: echo $(secondEval)
Saat Anda menggunakan eq() ekspresi untuk mengevaluasi kesetaraan, nilai secara implisit dikonversi menjadi angka (false ke 0 dan true ke 1).
variables:
trueAsNumber: $[eq('true', true)] # 1 vs. 1, True
falseAsNumber: $[eq('false', true)] # 0 vs. 1, False
steps:
- script: echo $(trueAsNumber)
- script: echo $(falseAsNumber)
Dalam contoh berikutnya ini, nilai variables.emptyString dan string kosong dievaluasi sebagai string kosong.
Fungsi coalesce() mengevaluasi parameter secara berurutan, dan mengembalikan nilai pertama yang bukan null atau string kosong.
variables:
coalesceLiteral: $[coalesce(variables.emptyString, '', 'literal value')]
steps:
- script: echo $(coalesceLiteral) # outputs literal value
Aturan konversi terperinci tercantum lebih lanjut di bawah ini.
| Dari / Ke | Boolean | Nol | Nomor | string | Versi |
|---|---|---|---|---|---|
| Boolean | - | - | Ya | Ya | - |
| Nol | Ya | - | Ya | Ya | - |
| Angka | Ya | - | - | Ya | Sebagian |
| Tali | Ya | Sebagian | Sebagian | - | Sebagian |
| Versi | Ya | - | - | Ya | - |
Boolean
Ke angka:
-
False→0 -
True→1
Untuk string:
-
False→'False' -
True→'True'
Nol
- Untuk Boolean:
False - Menuju nomor:
0 - Ke string:
''(string kosong)
Nomor
- Ke Boolean:
0→False, bilangan lainnya →True - Ke versi: Harus lebih besar dari nol dan harus mengandung angka desimal yang tidak nol. Harus kurang dari Int32.MaxValue (komponen desimal juga).
- Ke string: Mengonversi angka menjadi string tanpa pemisah ribuan atau desimal.
string
- Untuk Boolean:
''(string kosong) →False, string lainnya →True - Untuk null:
''(string kosong) →Null, string lain yang tidak dapat dikonversi - Menerjemahkan ke angka:
''(string kosong) menjadi 0, sebaliknya, menjalankan fungsiInt32.TryParsedari bahasa C# menggunakan InvariantCulture dengan aturan berikut: AllowDecimalPoint | AllowLeadingSign | AllowLeadingWhite | AllowThousands | AllowTrailingWhite. JikaTryParsegagal, maka tidak dapat dikonversi. - Ke versi: menjalankan versi C#
Version.TryParse. Harus minimal berisi komponen Major dan Minor. JikaTryParsegagal, maka tidak dapat dikonversi.
Versi
- Untuk Boolean:
True - Untuk string: Major.Minor atau Major.Minor.Build atau Major.Minor.Build.Revisi.
FAQ
Saya ingin melakukan sesuatu yang ekspresi tidak mendukung. Opsi apa yang saya miliki untuk memperluas fungsionalitas Alur?
Anda dapat mengkustomisasi alur dengan menggunakan skrip yang menyertakan ekspresi. Misalnya, cuplikan BUILD_BUILDNUMBER ini mengambil variabel dan membaginya dengan menggunakan Bash. Skrip ini menghasilkan dua variabel baru, $MAJOR_RUN dan $MINOR_RUN, untuk nomor eksekusi utama dan minor.
Kedua variabel kemudian digunakan untuk membuat dua variabel alur, $major dan $minor dengan menggunakan task.setvariable. Variabel ini tersedia untuk langkah-langkah hilir. Untuk berbagi variabel di seluruh alur, lihat Grup variabel.
steps:
- bash: |
MAJOR_RUN=$(echo $BUILD_BUILDNUMBER | cut -d '.' -f1)
echo "This is the major run number: $MAJOR_RUN"
echo "##vso[task.setvariable variable=major]$MAJOR_RUN"
MINOR_RUN=$(echo $BUILD_BUILDNUMBER | cut -d '.' -f2)
echo "This is the minor run number: $MINOR_RUN"
echo "##vso[task.setvariable variable=minor]$MINOR_RUN"
- bash: echo "My pipeline variable for major run is $(major)"
- bash: echo "My pipeline variable for minor run is $(minor)"