Menggunakan variabel dalam alur Azure DevOps

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.

Menggunakan variabel dalam alur Azure DevOps

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 dokumentasi. Semua skizofrenia dengan sintaksis diilustrasikan dengan contoh dari dokumentasi di bawah. Variabel yang sama memiliki tiga representasi, bergantung pada tempat kita 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 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 berhenti. Dengan bash lebih sederhana, Anda cukup meneruskannya ke dalam menggunakan argumen dan sintaks $SYSTEM_ACCESSTOKEN.

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.

Menggunakan variabel dalam alur Azure DevOps

Atau secara global ke penyimpanan variabel, lalu tautkan dari penyimpanan tersebut. Sangat nyaman.

Menggunakan variabel dalam alur Azure DevOps

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.

Menggunakan variabel dalam alur Azure DevOps

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.

Menggunakan variabel dalam alur Azure DevOps

Variabel Dinamis

Kegembiraan dimulai ketika kita ingin menerima suatu nilai dalam satu tahap dan meneruskannya ke tahap berikutnya.

Menggunakan variabel dalam alur Azure DevOps

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

Menggunakan variabel dalam alur Azure DevOps

Misalnya, kami membuat generator nilai acak. Perhatikan sintaks mendeklarasikan variabel di dalam tahap ini; fungsi ini diperkenalkan.

Menggunakan variabel dalam alur Azure DevOps

Langkah berikutnya kita pass variabelnya ke script, ya, tidak bisa secara langsung, harus melalui argumen.

Menggunakan variabel dalam alur Azure DevOps

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.

Menggunakan variabel dalam alur Azure DevOps

Contohnya cukup sederhana, namun fungsinya membuka peluang bagus bagi kita, selain saya sebelumnya artikel, ketika kita dapat membuat mesin virtual pada tahap pertama pengujian, melakukan beberapa manipulasi lebih lanjut dengannya, dan beberapa manipulasi secara paralel. Dan tahap terakhir adalah menghancurkannya. Sekarang kami menjalankan tes otomatis produk setiap saat di mesin virtual baru. Mengingat mereka hidup sekitar 10 menit, maka biayanya sepeser pun.

Pada artikel selanjutnya, jika perlu saya akan membahas tentang pipeline YAML, cukup banyak inovasi menarik di sana akhir-akhir ini.

Sumber: www.habr.com

Tambah komentar