Kami melanjutkan peninjauan kami terhadap alat luar biasa untuk pengembangan untuk Windows dan lainnya, Azure DevOps. Kali ini, karena banyak menderita dengan variabel lingkungan, saya memutuskan untuk memasukkan semua pengalaman itu ke dalam satu artikel.
Mulai dari fakta bahwa mereka memiliki sintaks yang berbeda untuk setiap lingkungan eksekusi, diakhiri dengan kurangnya kemampuan standar untuk mentransfer variabel dari satu tahap pipeline ke tahap lainnya.
Saya akan membuat reservasi bahwa contoh utama akan ada di Release Pipelines, karena YAML belum sampai di sana, dan saya memerlukan fungsionalitas dari banyak tahapan dan banyak artefak. Tampaknya, hal ini telah tersedia di Pipeline biasa, yang secara praktis menyamai fungsionalitasnya. Di Pipelines YAML, kami menambahkan tooltip grafis kecil ke representasi teks dengan parameter yang dapat diatur. Ini sangat mudah; Anda tidak perlu membaca dokumentasi untuk setiap modul. Namun akan saya uraikan pada artikel selanjutnya, namun untuk saat ini berikut adalah gambaran dari inovasi itu sendiri.
Penyimpanan dan penggunaan
Mari kita mulai dengan fakta bahwa kita memiliki variabel default di sistem. Mereka memulai, tergantung pada asalnya, dengan kata Rilis, Sistem, dll. Daftar lengkapnya (ternyata tidak), tersedia di
steps:
- bash: echo This script could use $SYSTEM_ACCESSTOKEN
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
- powershell: Write-Host "This is a script that could use $env:SYSTEM_ACCESSTOKEN"
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
Jika Anda menetapkan variabel pada agen tempat tugas dijalankan, itu adalah $(System.AccessToken). Jika Anda ingin menggunakannya di dalam skrip PowerShell pada agen yang sama, itu sudah menjadi $env:SYSTEM_ACCESSTOKEN. Jika Anda, amit-amit, ingin menggunakan variabel ini pada beberapa host jarak jauh menggunakan tugas PowerShell pada mesin target, Anda harus meneruskannya melalui argumen ke skrip menggunakan
Hukum yang sama tidak berlaku untuk variabel Anda sendiri; di sini Anda sudah bertanggung jawab atas sintaksisnya. Variabel dapat diatur secara lokal di setiap tugas.
Atau secara global ke penyimpanan variabel, lalu tautkan dari penyimpanan tersebut. Sangat nyaman.
Sebagai bonus, jika variabelnya sangat rahasia, variabel tersebut dapat disimpan di cloud Azure dalam penyimpanan yang disebut Azure Vault; Anda dapat menautkan Vault ke proyek di Perpustakaan.
Secara umum, semuanya jelas dengan variabel; dalam pipeline mereka masih dapat diatur secara manual untuk setiap peluncuran; dalam rilis tidak ada fungsi seperti itu. Anda dapat melihat lagi apa yang Anda transfer ke alur di log inisialisasi agen, namun perlu diingat bahwa log tersebut sudah ada di sana dalam bentuk yang dikonversi.
Variabel Dinamis
Kegembiraan dimulai ketika kita ingin menerima suatu nilai dalam satu tahap dan meneruskannya ke tahap berikutnya.
Kami tidak diberikan fungsi seperti itu. Tapi tangan kami bukan untuk bosan dan dengan bantuan Google solusi ditemukan. Syukurlah, Azure DevOps memiliki API yang memungkinkan kami melakukan lebih dari apa yang digambarkan di antarmuka.
Jadi, kita memerlukan panggilan untuk memperbarui variabel global, yang akan kita lakukan langsung dari dalam pipeline. Alamatnya diambil dari variabel lingkungan, variabel yang sama yang tidak disebutkan dalam dokumentasi, seperti yang disebutkan sebelumnya. Anda dapat mengaturnya sendiri atau, terlebih lagi, melakukan hardcode jika tokonya tutup.
$releaseurl = ('{0}{1}/_apis/release/releases/{2}?api-version=5.0' -f $($env:SYSTEM_TEAMFOUNDATIONSERVERURI), $($env:SYSTEM_TEAMPROJECTID), $($env:RELEASE_RELEASEID) )
Kita atur nilai kosong dari variabel yang ingin kita transfer, atur Scope - Release
Misalnya, kami membuat generator nilai acak. Perhatikan sintaks mendeklarasikan variabel di dalam tahap ini; fungsi ini diperkenalkan.
Langkah berikutnya kita pass variabelnya ke script, ya, tidak bisa secara langsung, harus melalui argumen.
Skrip di bawah spoiler
PowerShell
#Script requires stageVar variable in release variables set to Release scope
param ( [string] $expVar )
#region variables
$ReleaseVariableName = 'StageVar'
$releaseurl = ('{0}{1}/_apis/release/releases/{2}?api-version=5.0' -f $($env:SYSTEM_TEAMFOUNDATIONSERVERURI), $($env:SYSTEM_TEAMPROJECTID), $($env:RELEASE_RELEASEID) )
#endregion
#region Get Release Definition
Write-Host "URL: $releaseurl"
$Release = Invoke-RestMethod -Uri $releaseurl -Headers @{
Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
}
#endregion
#region Output current Release Pipeline
Write-Output ('Release Pipeline variables output: {0}' -f $($Release.variables | ConvertTo-Json -Depth 10))
#endregion
#region Update StageVar with new value
$release.variables.($ReleaseVariableName).value = "$expVar"
#endregion
#region update release pipeline
Write-Output ('Updating Release Definition')
$json = @($release) | ConvertTo-Json -Depth 99
Invoke-RestMethod -Uri $releaseurl -Method Put -Body $json -ContentType "application/json" -Headers @{Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN" }
#endregion
#region Get updated Release Definition
Write-Output ('Get updated Release Definition')
Write-Host "URL: $releaseurl"
$Release = Invoke-RestMethod -Uri $releaseurl -Headers @{
Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
}
#endregion
#region Output Updated Release Pipeline
Write-Output ('Updated Release Pipeline variables output: {0}' -f $($Release.variables | ConvertTo-Json -Depth 10))
#endregion
Atau
Menampar
INPUT_VAR=$1
RELEASE_VAR=$2
echo Test ID: ${INPUT_VAR}
RELEASE_URL="${SYSTEM_TEAMFOUNDATIONSERVERURI}${SYSTEM_TEAMPROJECTID}/_apis/release/releases/${RELEASE_RELEASEID}?api-version=5.0"
echo release url: $RELEASE_URL
RELEASE_JSON=$(curl -H "Authorization: Bearer $SYSTEM_ACCESSTOKEN" $RELEASE_URL)
OUTPUT=`jq ''.variables.${RELEASE_VAR}.value' = '"${INPUT_VAR}"'' <<< $RELEASE_JSON`
curl -H "Authorization: Bearer $SYSTEM_ACCESSTOKEN" -H "Content-Type: application/json" -X PUT -d "$OUTPUT" $RELEASE_URL
Singkatnya, skrip kita mengambil variabel myVar sebagai masukan dan menggunakan API untuk memasukkan nilai variabel ini ke stageVar. Pada langkah selanjutnya, dengan menggunakan sintaks variabel sistem, kita dapat melihatnya.
Contohnya cukup sederhana, namun fungsinya membuka peluang bagus bagi kita, selain saya sebelumnya
Pada artikel selanjutnya, jika perlu saya akan membahas tentang pipeline YAML, cukup banyak inovasi menarik di sana akhir-akhir ini.
Sumber: www.habr.com