Vazhdoni me shqyrtimin e mjetit të shkëlqyer për zhvillimin për Windows dhe më shumë, Azure DevOps. Këtë herë, pasi u përballa me variablat e mjedisit, vendosa të përmbledh tërë përvojën në një artikull.
Duke filluar nga fakti që për çdo mjedis ekzekutimi ata kanë sintaksë të ndryshme, deri te mungesa e mundësisë standarde për të transferuar variablat nga një fazë e pipeline-it në një tjetër.
Këtu do të përmend se shembujt kryesorë do të jenë në Release Pipelines, sepse YAML ende nuk ka arritur atje, dhe unë kam nevojë për funksionalitetin e disa fazave dhe disa artefakteve. Duket se kjo është bërë e aksesueshme në Pipeline-t e zakonshme, çka praktikisht i ka barazuar ato në funksionalitet. Në Pipeline-t YAML janë bërë përmirësime dhe janë shtuar një sugjerim grafik të vogël me parametrat që mund të vendosen. Shumë e përshtatshme, nuk ka nevojë të hidhesh në dokumentacion për çdo modul. Por këtë do ta përshkruaj në artikullin e ardhshëm, ndërsa për tani ja një pamje e risisë.

Ruajtja dhe përdorimi
Të fillojmë me faktin se në sistemin tonë kemi variabla me default. Ato fillojnë, varësisht nga origjina, me fjalët Release, System, etj. Lista e plotë (siç duket, nuk ekziston) është e disponueshme në . Të gjithë këtë çmenduri me sintaksën e ilustron shembulli nga dokumentacioni më poshtë. Një variabël e njëjtë ka tre përfaqësime, varësisht nga vendi ku e thërrasim.
steps:
- bash: echo Ky skript mund të përdorë $SYSTEM_ACCESSTOKEN
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
- powershell: Write-Host "Ky është një skript që mund të përdorë $env:SYSTEM_ACCESSTOKEN"
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)Nëse vendosni një variabël në agjentin ku ekzekutohet detyra, kjo është $(System.AccessToken). Nëse dëshironi ta përdorni atë brenda skriptit powershell në të njëjtin agjent, kjo do të jetë $env:SYSTEM_ACCESSTOKEN. Nëse, për fat të keq, dëshiron ta përdorni këtë variabël në ndonjë host të largët, duke përdorur detyrën PowerShell në makinat e targetuara, duhet ta kaloni atë përmes argumentit në skript, duke përdorur . Me bash është më e lehtë, mund ta kaloni brenda duke përdorur argumentin dhe sintaksën $SYSTEM_ACCESSTOKEN.
Të njëjtat rregulla nuk zbatohen për variablat tuaja, këtu ju mban përgjegjësi për sintaksën. Variablat mund të vendosen lokal në secilën detyrë.

Ose globalisht në depozitat e variablave dhe më pas lidhni ato nga depozita. Shumë e përshtatshme.

Si një bonus, nëse variablat janë shumë sekrete, mund t'i ruani në cloud Azure në një magazinë të quajtur Azure Vault, e cila mund të lidhët me projektin në Library.

Në përgjithësi, variablat janë të qarta, në pipelines ato mund të vendosen manualisht për çdo nisje, por në release kjo funksionalitet nuk ekziston. Mund të shihni se çfarë po dërgoni në pipeline edhe një herë në log-et e inicializimit të agjentit, megjithatë, kini parasysh se aty janë tashmë në formën e transformuar.

Variablat dinamikë
Gjëja më interesante fillon kur duam të marrim ndonjë vlerë në një hap dhe ta kalojmë atë në hapin tjetër.

Ky funksionalitet nuk na është sjellë. Por duartonat tona nuk janë për kot dhe me ndihmën e Google, u gjet një zgjidhje. Falë Zotit, Azure DevOps ka një API që na lejon të bëjmë pak më shumë sesa është vizatuar në ndërfaqe.
Pra, do të na nevojitet thirrja për përditësimin e variablave globale, të cilën do ta bëjmë direkt nga brenda pipeline. Adresa merret nga variablat e ambientit, ata të njëjtat për të cilët nuk ka asnjë fjalë në dokumentacion, siç u përmend më parë. Ju mund t'i caktoni vetë ose, çfarë të thoni, t'i kodoni në mënyrë të ngurtë, nëse e mbyllin dyqanin.
$releaseurl = ('{0}{1}\/apis\/release\/releases\/{2}?api-version=5.0' -f $($env:SYSTEM_TEAMFOUNDATIONSERVERURI), $($env:SYSTEM_TEAMPROJECTID), $($env:RELEASE_RELEASEID))CaktojmĂ« njĂ« vlerĂ« tĂ« zbrazĂ«t pĂ«r variablĂ«n qĂ« duam tĂ« kalojmĂ«, vendosim Scope â Release

Për shembull bëjmë një gjenerues të rastësishëm të vlerave. Vini re sintaksën e shpalljes së variablit brenda këtij etapi, një funksionalitet i tillë është futur.

Në etapin tjetër, kalojmë variablën në skript, po, po, direkt nuk është e mundur, duhet përmes argumentit.

Skripti nën spojler
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))
#endregionOse
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_URLNë dy fjalë, skripti ynë merr si hyrje variablën myVar dhe duke përdorur API, vendos vlerën e këtij variabli në stageVar. Në etapin tjetër, duke përdorur sintaksën e variablave sistemikë, mund ta shohim atë.

Shembulli është mjaft i thjeshtë, por funksionaliteti na hap mundësi të mira, së bashku me të kaluarën time. , kur ne mund të krijojmë një makinë virtuale në fazën e parë të testimit, të bëjmë disa manipulime me të më vonë, veçanërisht disa paralelisht. Dhe si një fazë përfundimtare ta shkatërrojmë atë. Tani po kryhen teste automatike të produktit çdo herë në makina virtuale të reja. Duke pasur parasysh se ato jetojnë 10 minuta, kjo kushton pak.
Në artikullin e ardhshëm, nëse do të ketë nevojë, do të flas për pipeline-t YAML, kanë dalë shumë novacione interesante kohët e fundit.
Burimi: habr.com
