Menetapkan variabel dalam skrip
Layanan Azure DevOps | Azure DevOps Server 2022 - Azure DevOps Server 2019
Saat Anda menggunakan skrip PowerShell dan Bash di alur Anda, seringkali berguna untuk dapat mengatur variabel yang kemudian dapat Anda gunakan dalam tugas mendatang. Variabel yang baru ditetapkan tidak tersedia dalam tugas yang sama.
Skrip sangat bagus ketika Anda ingin melakukan sesuatu yang tidak didukung oleh tugas seperti memanggil REST API kustom dan mengurai respons.
Anda akan menggunakan task.setvariable
perintah pengelogan untuk mengatur variabel di skrip PowerShell dan Bash .
Catatan
Pekerjaan penyebaran menggunakan sintaks yang berbeda untuk variabel output. Untuk mempelajari selengkapnya tentang dukungan untuk variabel output dalam pekerjaan penyebaran, lihat Pekerjaan penyebaran.
Untuk menggunakan variabel dengan kondisi dalam alur, lihat Menentukan kondisi.
Tentang task.setvariable
Saat Anda menambahkan variabel dengan task.setvariable
, tugas berikut dapat menggunakan variabel menggunakan sintaks $(myVar)
makro . Variabel hanya akan tersedia untuk tugas dalam pekerjaan yang sama secara default. Jika Anda menambahkan parameter isoutput
, sintaks untuk memanggil perubahan variabel Anda. Lihat Mengatur variabel output untuk digunakan dalam pekerjaan yang sama.
Atur variabel myVar
dengan nilai foo
.
- bash: |
echo "##vso[task.setvariable variable=myVar;]foo"
Baca variabel myVar
:
- bash: |
echo "You can use macro syntax for variables: $(myVar)"
Mengatur properti variabel
Perintah ini task.setvariable
mencakup properti untuk mengatur variabel sebagai rahasia, sebagai variabel output, dan sebagai baca saja. Properti yang tersedia meliputi:
variable
= nama variabel (Diperlukan)issecret
= boolean (Opsional, default ke false)isoutput
= boolean (Opsional, default ke false)isreadonly
= boolean (Opsional, default ke false)
Untuk menggunakan variabel di tahap berikutnya, atur properti ke isoutput
true
. Untuk mereferensikan variabel dengan set isoutput
ke true, Anda akan menyertakan nama tugas. Contohnya,$(TaskName.myVar)
.
Saat Anda mengatur variabel sebagai baca saja, variabel tersebut tidak dapat ditimpa oleh tugas hilir. Atur isreadonly
ke true
. Mengatur variabel sebagai baca hanya meningkatkan keamanan dengan membuat variabel tersebut tidak dapat diubah.
Mengatur variabel sebagai rahasia
Ketika issecret
diatur ke true, nilai variabel akan disimpan sebagai rahasia dan ditutupi dari log.
Catatan
Azure Pipelines berupaya menutupi rahasia saat memancarkan data ke log alur, sehingga Anda mungkin melihat variabel dan data tambahan yang diselubungi dalam output dan log yang tidak ditetapkan sebagai rahasia.
Atur variabel mySecretVal
rahasia .
- bash: |
echo "##vso[task.setvariable variable=mySecretVal;issecret=true]secretvalue"
Dapatkan variabel mySecretVal
rahasia .
- bash: |
echo "##vso[task.setvariable variable=mySecretVal;issecret=true]secretvalue"
- bash: |
echo $(mySecretVal)
Output variabel rahasia dalam bash.
Tingkat variabel output
Ada empat jenis variabel output yang berbeda dengan sintaks yang berbeda:
- Variabel output diatur dalam pekerjaan yang sama tanpa
isoutput
parameter . Untuk mereferensikan variabel ini, Anda akan menggunakan sintaks makro. Contoh:$(myVar)
. - Variabel output diatur dalam pekerjaan yang sama dengan
isoutput
parameter . Untuk mereferensikan variabel ini, Anda akan menyertakan nama tugas. Contoh:$(myTask.myVar)
. - Variabel output diatur dalam pekerjaan di masa mendatang. Untuk mereferensikan variabel ini, Anda akan mereferensikan variabel di bagian
variables
dengandependency
sintaks. - Variabel output diatur pada tahap mendatang. Untuk mereferensikan variabel ini, Anda akan mereferensikan variabel di bagian
variables
denganstageDependencies
sintaks.
Mengatur variabel output untuk digunakan dalam pekerjaan yang sama
Saat Anda menggunakan variabel output dalam pekerjaan yang sama, Anda tidak perlu menggunakan isoutput
properti . Secara default, variabel akan tersedia untuk langkah-langkah hilir dalam pekerjaan yang sama. Namun, jika Anda menambahkan isoutput
properti , Anda harus mereferensikan variabel dengan nama tugas.
Skrip di sini mengatur variabel myJobVar
output pekerjaan yang sama tanpa menentukan isoutput
dan mengatur myOutputJobVar
dengan isoutput=true
.
jobs:
- job: A
steps:
- bash: |
echo "##vso[task.setvariable variable=myJobVar]this is the same job"
- bash: |
echo "##vso[task.setvariable variable=myOutputJobVar;isoutput=true]this is the same job too"
name: setOutput
Skrip ini mendapatkan variabel myJobVar
pekerjaan yang sama dan myOutputJobVar
. Perhatikan bahwa perubahan sintaks untuk mereferensikan variabel output setelah isoutput=true
ditambahkan.
jobs:
- job: A
steps:
- bash: |
echo "##vso[task.setvariable variable=myJobVar]this is the same job"
- bash: |
echo "##vso[task.setvariable variable=myOutputJobVar;isoutput=true]this is the same job too"
name: setOutput
- bash: |
echo $(myJobVar)
- bash: |
echo $(setOutput.myOutputJobVar)
Mengatur variabel output untuk digunakan dalam pekerjaan di masa mendatang
Saat Anda menggunakan variabel output di seluruh pekerjaan, Anda akan mereferensikannya dengan dependencies
. Sintaks untuk mengakses variabel output dalam pekerjaan atau tahap mendatang bervariasi berdasarkan hubungan antara setter dan konsumen variabel. Pelajari tentang setiap kasus dalam dependensi.
Pertama, atur variabel myOutputVar
output .
jobs:
- job: A
steps:
- bash: |
echo "##vso[task.setvariable variable=myOutputVar;isoutput=true]this is from job A"
name: passOutput
Selanjutnya, akses myOutputVar
dalam pekerjaan di masa mendatang dan keluarkan variabel sebagai myVarFromJobA
. Untuk menggunakan dependencies
, Anda perlu mengatur dependsOn
properti pada pekerjaan di masa mendatang menggunakan nama pekerjaan sebelumnya di mana variabel output diatur.
jobs:
- job: A
steps:
- bash: |
echo "##vso[task.setvariable variable=myOutputVar;isoutput=true]this is from job A"
name: passOutput
- job: B
dependsOn: A
variables:
myVarFromJobA: $[ dependencies.A.outputs['passOutput.myOutputVar'] ]
steps:
- bash: |
echo $(myVarFromJobA)
Mengatur variabel output untuk digunakan pada tahap mendatang
Variabel output dapat digunakan di seluruh tahap dalam alur. Anda dapat menggunakan variabel output untuk meneruskan informasi yang berguna, seperti ID output yang dihasilkan, dari satu tahap ke tahap berikutnya.
Saat Anda mengatur variabel dengan properti , Anda dapat mereferensikan variabel tersebut isoutput
di tahap selanjutnya dengan nama tugas dan stageDependencies
sintaks. Pelajari selengkapnya tentang dependensi.
Variabel output hanya tersedia di tahap hilir berikutnya. Jika beberapa tahap menggunakan variabel output yang sama, gunakan kondisi tersebut dependsOn
.
Pertama, atur variabel myStageVal
output .
steps:
- bash: echo "##vso[task.setvariable variable=myStageVal;isOutput=true]this is a stage output variable"
name: MyOutputVar
Kemudian, pada tahap mendatang, petakan variabel output ke variabel myStageVal
tahap, pekerjaan, atau cakupan tugas seperti, misalnya, myStageAVar
. Perhatikan sintaks pemetaan menggunakan ekspresi $[]
runtime dan melacak jalur dari stageDependencies
ke variabel output menggunakan nama tahap (A
) dan nama pekerjaan (A1
) untuk sepenuhnya memenuhi syarat variabel.
stages:
- stage: A
jobs:
- job: A1
steps:
- bash: echo "##vso[task.setvariable variable=myStageVal;isOutput=true]this is a stage output variable"
name: MyOutputVar
- stage: B
dependsOn: A
jobs:
- job: B1
variables:
myStageAVar: $[stageDependencies.A.A1.outputs['MyOutputVar.myStageVal']]
steps:
- bash: echo $(myStageAVar)
Jika nilai Anda berisi baris baru, Anda dapat menghindarinya dan agen akan secara otomatis membukanya:
steps:
- bash: |
escape_data() {
local data=$1
data="${data//'%'/'%AZP25'}"
data="${data//$'\n'/'%0A'}"
data="${data//$'\r'/'%0D'}"
echo "$data"
}
echo "##vso[task.setvariable variable=myStageVal;isOutput=true]$(escape_data $'foo\nbar')"
name: MyOutputVar
FAQ
Variabel output saya tidak dirender. Apa yang salah?
Ada beberapa alasan mengapa variabel output Anda mungkin tidak muncul.
- Variabel output yang diatur dengan
isoutput
tidak tersedia dalam pekerjaan yang sama dan sebaliknya hanya tersedia dalam pekerjaan hilir. - Bergantung pada sintaks variabel apa yang Anda gunakan, variabel yang mengatur nilai variabel output mungkin tidak tersedia saat runtime. Misalnya, variabel dengan sintaks makro (
$(var)
) diproses sebelum tugas berjalan. Sebaliknya, variabel dengan sintaks templat diproses saat runtime ($[variables.var]
). Anda biasanya ingin menggunakan sintaks runtime saat mengatur variabel output. Untuk informasi selengkapnya tentang sintaks variabel, lihat Menentukan variabel. - Mungkin ada ruang tambahan dalam ekspresi Anda. Jika variabel Anda tidak dirender, periksa ruang tambahan di sekitarnya
isOutput=true
.
Anda dapat memecahkan masalah dependencies
output untuk pekerjaan atau tahap alur dengan menambahkan variabel untuk dependensi lalu mencetak variabel tersebut. Misalnya, dalam pekerjaan A
alur ini mengatur variabel MyTask
output . Pekerjaan kedua (B
) tergantung pada pekerjaan A
. Variabel baru, deps
menyimpan representasi JSON dari dependensi pekerjaan. Langkah kedua dalam Pekerjaan B
menggunakan PowerShell untuk mencetak deps
sehingga Anda dapat melihat dependensi pekerjaan.
trigger:
- '*'
pool:
vmImage: 'ubuntu-latest'
jobs:
- job: A
steps:
- script: |
echo "##vso[task.setvariable variable=MyTask;isOutput=true]theoutputval"
name: ProduceVar
- job: B
dependsOn: A
variables:
varFromA: $[ dependencies.A.outputs['ProduceVar.MyTask'] ]
deps: $[convertToJson(dependencies)] # create a variable with the job dependencies
steps:
- script: echo $(varFromA) #
- powershell: Write-Host "$(deps)"