Nastavljamo naš pregled divnog alata za razvoj za Windows i više, Azure DevOps. Ovaj put, pošto sam mnogo patio sa varijablama okruženja, odlučio sam da sve iskustvo stavim u jedan članak.
Počevši od činjenice da imaju različitu sintaksu za svako okruženje izvršavanja, završavajući nedostatkom standardne mogućnosti prijenosa varijabli iz jedne faze cjevovoda u drugu.
Rezervirat ću da će glavni primjeri biti na Release Pipelines-u, jer YAML još nije stigao, a meni je potrebna funkcionalnost mnogih faza i mnogih artefakata. Ovo je, čini se, postalo dostupno u redovnim Pipeline-ima, što im je praktično izjednačeno u funkcionalnosti. U Pipelines YAML, dodali smo mali grafički opis alata u tekstualni prikaz sa parametrima koji se mogu podesiti. Vrlo je zgodno; ne morate prolaziti kroz dokumentaciju za svaki modul. Ali to ću opisati u sljedećem članku, ali za sada evo slike same inovacije.
Skladištenje i upotreba
Počnimo s činjenicom da imamo zadane varijable u sistemu. Počinju, ovisno o porijeklu, riječima Izdanje, Sistem itd. Kompletna lista (kako se ispostavilo, nije) dostupna je na
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)
Ako postavite varijablu na agentu na kojem se zadatak izvršava, to je $(System.AccessToken). Ako želite da ga koristite unutar powershell skripte na istom agentu, to će već biti $env:SYSTEM_ACCESSTOKEN. Ako, ne daj Bože, želite da koristite ovu varijablu na nekom udaljenom hostu koristeći zadatak PowerShell na ciljnim mašinama, morate ovo proslediti kroz argument u skriptu koristeći
Isti zakoni se ne primjenjuju na vaše vlastite varijable; ovdje ste već odgovorni za sintaksu. Varijable se mogu postaviti lokalno u svakom zadatku.
Ili globalno u spremište varijabli, a zatim ih povežite iz trgovine. Vrlo udobno.
Kao bonus, ako su varijable vrlo tajne, mogu se pohraniti u Azure oblak u skladištu pod nazivom Azure Vault; možete povezati Vault sa projektom u biblioteci.
Općenito, sve je jasno s varijablama; u cjevovodima se još uvijek mogu ručno postaviti za svako pokretanje; u izdanju nema takve funkcionalnosti. Možete ponovo vidjeti šta prenosite u cjevovod u dnevnikima inicijalizacije agenta, ali imajte na umu da su oni već tamo u konvertovanom obliku.
Dinamičke varijable
Zabava počinje kada želimo da dobijemo neku vrednost u jednoj fazi i da je prenesemo na sledeću.
Takva funkcionalnost nam nije pružena. Ali naše ruke nisu za dosadu i uz pomoć Gugla je pronađeno rješenje. Hvala Bogu, Azure DevOps ima API koji nam omogućava da uradimo nešto više od onoga što je prikazano u interfejsu.
Dakle, biće nam potreban poziv da ažuriramo globalne varijable, što ćemo uraditi direktno iz cevovoda. Adresa je preuzeta iz varijabli okruženja, istih onih o kojima nema ni riječi u dokumentaciji, kao što je ranije spomenuto. Možete ih sami postaviti ili, štoviše, hardkodirati ako zatvore radnju.
$releaseurl = ('{0}{1}/_apis/release/releases/{2}?api-version=5.0' -f $($env:SYSTEM_TEAMFOUNDATIONSERVERURI), $($env:SYSTEM_TEAMPROJECTID), $($env:RELEASE_RELEASEID) )
Postavljamo praznu vrijednost varijable koju želimo prenijeti, postavljamo Scope - Release
Na primjer, napravimo neki generator slučajnih vrijednosti. Obratite pažnju na sintaksu deklarisanja varijable unutar ove faze; ova funkcionalnost je uvedena.
U sljedećem koraku, prosljeđujemo varijablu skripti, da, da, nije moguće direktno, mora biti kroz argument.
Skripta ispod spojlera
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
Or
bash
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
Ukratko, naša skripta uzima promenljivu myVar kao ulaz i koristi API da stavi vrednost ove varijable u stageVar. U sljedećem koraku, koristeći sintaksu sistemske varijable, možemo je pogledati.
Primjer je prilično jednostavan, ali funkcionalnost nam otvara dobre mogućnosti, pored mojih prethodnih
U sljedećem članku, ako bude potrebno, govorit ću o YAML cjevovodima; tamo je u posljednje vrijeme bilo dosta zanimljivih inovacija.
izvor: www.habr.com