Menggunakan variabel dalam pipa Azure DevOps

Kami terus meninjau alat luar biasa untuk pengembangan untuk Windows dan tidak hanya, Azure DevOps. Kali ini, tersiksa dengan variabel lingkungan, saya memutuskan untuk memasukkan semua pengalaman dalam satu artikel.

Mulai dari fakta bahwa untuk setiap lingkungan runtime mereka memiliki sintaks yang berbeda, diakhiri dengan kurangnya kemampuan standar untuk mentransfer variabel dari satu tahap pipa ke yang lain.

Saya akan membuat reservasi bahwa contoh-contoh utama akan ada di Release Pipelines, karena YAML belum mencapainya, dan saya membutuhkan fungsionalitas dari banyak tahapan dan banyak artefak. Ini, tampaknya, menjadi tersedia di Pipa biasa, yang praktis meratakan fungsionalitasnya. Di Pipelines, YAML ditambahkan dan ditambahkan ke tampilan teks tooltip grafik kecil dengan parameter yang dapat diatur. Sangat mudah, tidak perlu masuk ke dokumentasi untuk setiap modul. Tetapi saya akan menjelaskan ini pada artikel berikutnya, tetapi untuk sekarang, ini adalah gambar dari inovasi itu sendiri.



Penyimpanan dan penggunaan


Untuk memulainya, kita memiliki variabel default di sistem. Mereka mulai, tergantung pada asalnya, dengan kata-kata Release, System, dll. Daftar lengkap (ternyata, tidak) tersedia dalam dokumentasi . Semua skizofrenia dengan sintaks diilustrasikan oleh contoh dari dokumentasi di bawah ini. Variabel yang sama memiliki tiga representasi, tergantung di mana kami menyebutnya.

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 yang menjalankan tugas, ini adalah $ (System.AccessToken). Jika Anda ingin menggunakannya di dalam skrip powershell pada agen yang sama, itu akan menjadi $ env: SYSTEM_ACCESSTOKEN. Jika, Tuhan melarang, Anda ingin menggunakan variabel ini pada beberapa host jarak jauh menggunakan tugas PowerShell pada mesin target, Anda perlu meneruskan ini melalui argumen ke skrip menggunakan param . Karena bash lebih sederhana, Anda cukup melemparnya dengan menggunakan argumen dan sintaksis $ SYSTEM_ACCESSTOKEN.

Hukum yang sama tidak berlaku untuk variabel Anda sendiri, di sini Anda sudah bertanggung jawab atas sintaksis. Anda dapat mengatur variabel secara lokal di setiap tugas.



Atau secara global dalam repositori variabel, dan kemudian menautkannya dari repositori. Sangat nyaman.



Sebagai bonus untuk ini, jika variabelnya sangat rahasia, mereka dapat disimpan di cloud Azure dalam penyimpanan yang disebut Azure Vault, Vault dapat ditautkan ke proyek di Perpustakaan.



Secara umum, semuanya jelas dengan variabel, dalam pipa Anda masih dapat mengaturnya secara manual untuk setiap peluncuran, dalam rilis tidak ada fungsi seperti itu. Anda dapat melihat apa yang Anda transfer ke pipa lagi di log inisialisasi agen, tetapi perhatikan bahwa mereka sudah dalam bentuk yang dikonversi di sana.



Variabel dinamis


Bagian yang paling menarik dimulai ketika kita ingin mendapatkan nilai dalam satu tahap dan meneruskannya ke tahap berikutnya.



Fungsi seperti itu tidak dikirimkan kepada kami. Tetapi tangan kami bukan untuk kebosanan dan dengan bantuan Google solusi ditemukan. Alhamdulillah, Azure DevOps memiliki API yang memungkinkan kami melakukan sedikit lebih banyak daripada yang kami lakukan di antarmuka.

Jadi, kita perlu panggilan untuk memperbarui variabel global, yang akan kita lakukan langsung dari bagian dalam pipa. Alamat tersebut diambil dari variabel lingkungan, yang sama tidak ada kata dalam dokumentasi, seperti yang disebutkan sebelumnya. Anda dapat bertanya kepada mereka sendiri atau, apa yang ada di sana, hardcode jika mereka menutup toko.

$releaseurl = ('{0}{1}/_apis/release/releases/{2}?api-version=5.0' -f $($env:SYSTEM_TEAMFOUNDATIONSERVERURI), $($env:SYSTEM_TEAMPROJECTID), $($env:RELEASE_RELEASEID)  )

Tetapkan nilai kosong dari variabel yang ingin kita lewati, atur Lingkup - Rilis.



Misalnya, kita membuat beberapa generator nilai acak. Perhatikan sintaks deklarasi variabel di dalam tahap ini, fungsionalitas tersebut diperkenalkan.



Pada langkah berikutnya, kami meneruskan variabel ke skrip, ya ya, itu tidak mungkin secara langsung, perlu melalui argumen.



Script di bawah spoiler

Powerhell
#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

Pesta
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 kami mengambil variabel input myVar dan menggunakan API menempatkan nilai variabel ini di stageVar. Pada langkah selanjutnya, menggunakan sintaks variabel sistem, kita bisa melihatnya.



Contohnya cukup sederhana, tetapi fungsinya menawarkan kita peluang bagus, total dengan artikel terakhir saya , ketika kita dapat membuat mesin virtual pada tahap pertama pengujian, melakukan beberapa manipulasi lebih lanjut dengannya, dan pada saat yang sama beberapa. Dan langkah terakhir adalah menghancurkannya. Sekarang kami mengejar swa-uji produk setiap kali di mesin virtual yang baru. Mengingat bahwa mereka hidup selama 10 menit, itu sangat berharga.

Pada artikel selanjutnya, jika perlu, saya akan berbicara tentang saluran pipa YAML, ada cukup banyak inovasi menarik belakangan ini.

All Articles