Po vazhdojmë shqyrtimin e mjetit të shkëlqyer për zhvillim në Windows dhe jo vetëm, Azure DevOps. Këtë herë, pasi përjetova vështirësi me variablat e ambientit, vendosa të përmbledh të gjithë përvojën në një artikull.
Duke filluar nga fakti që për secilën mjedis ekzekutimi ata kanë sintaksë të ndryshme, përfundon me mungesën e mundësisë standarde për të kaluar variablat nga një fazë e pipeline në një tjetër.
Të them se shembujt kryesorë do të jenë në Release Pipelines, sepse YAML ende nuk ka arritur aty dhe më duhet funksionaliteti i shumë etapave dhe artefakteve të shumta. Kjo, duket se është bërë e disponueshme në Pipelines të zakonshme, gjë që praktikisht i ka barazuar ato në funksionalitet. Në Pipelines YAML është përmirësuar dhe shtuar një sugjerim vizual të vogël me parametrat që mund të vendosen. Shumë e përshtatshme, nuk është nevoja të shkojmë në dokumentacion për çdo modul. Por këtë do ta përshkruaj në artikullin tjetër, ndërkohë ja pamja e vetë risisë.

Ruajtja dhe përdorimi
Të fillojmë me faktin se në sistem kemi variablat e paracaktuar. Ato fillojnë, në varësi të origjinës, me fjalët Release, System, etj. Lista e plotë (siç u zbulua, nuk është e plotë) është e disponueshme në . Të gjithë absurdësinë me sintaksën e ilustron shembulli nga dokumentacioni më poshtë. Për të njëjtin variabël ka tri prezantime, në varësi të vendit ku e thërrasim atë.
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 e vendosni variablin te agjenti, ku ekzekutohet detyra, kjo është $(System.AccessToken). Nëse dëshironi ta përdorni atë brenda një skripti powershell në të njëjtin agjent, atëherë do të jetë $env:SYSTEM_ACCESSTOKEN. Nëse, për fat të keq, dëshironi ta përdorni këtë variabël në një host të largët, duke përdorur detyrën PowerShell on target machines, duhet ta kaloni këtë përmes një argumenti në skript, duke përdorur . Me bash është më e thjeshtë, mund të kaloni brenda duke përdorur argumentin dhe sintaksën $SYSTEM_ACCESSTOKEN.
Të njëjtat rregulla nuk zbatohen për variablat tuaj të vet, këtu tashmë ju mbani përgjegjësi për sintaksën. Variablat mund të vendosen lokalisht në çdo detyrë.

Ose globalisht në depozitat e variablave dhe pastaj t'i lidhni ato nga depozita. Shumë e përshtatshme.

Si një bonus për këtë, nëse variablat janë tepër të fshehta, ato mund të ruhen në Azure në një depo të quajtur Azure Vault, dhe mund të lidhni Vault në projektin tuaj në Library.

Në tërësi, me variablat gjithçka është e qartë, në pipelines ato gjithashtu mund të vendosen manualisht për çdo ekzekutim, në lëshim nuk ka këtë funksionalitet. Mund të shihni se çfarë Po kaloni në pipeline edhe një herë në logjet e inkuadrimit të agjentit, por kini parasysh, atje janë tashmë në formën e transformuar.

Variablat dinamike
Më interesante fillon kur duam të marrim një vlerë në një etapë dhe ta kalojmë atë në tjetër.

Të tilla funksionalitete nuk na kanë sjell në sistem. Por duar tona nuk janë për qëllime të kota 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ë se sa është paraqitur në ndërfaqe.
Pra, na nevojitet thirrja për përditësimin e variablave globale, që do ta bëjmë direkt nga brenda pipeline-it. Adresa merret nga variablat e ambientit, ato të njëjtat për të cilat nuk ka asnjë fjalë në dokumentacion, siç e përmenda më parë. Ju mund t'i vendosni ato vetë ose, çfarë të dojë, t'i hardkodoni, nëse vulosja mbyllet.
$releaseurl = ('{0}{1}/_apis/release/releases/{2}?api-version=5.0' -f $($env:SYSTEM_TEAMFOUNDATIONSERVERURI), $($env:SYSTEM_TEAMPROJECTID), $($env:RELEASE_RELEASEID) )Vendosim njĂ« vlerĂ« bosh pĂ«r variablin qĂ« dĂ«shirojmĂ« tĂ« kalojmĂ«, vendosim Scope â Release

Për shembull, bëjmë një gjenerator të rastësishëm vlerash. Vini re sintaksën e shpalljes së variablit brenda kësaj etape, një funksionalitet i tillë është sjellë.

Në etapën e ardhshme ne i kalojmë variablin skriptit, po, po, drejtpërdrejt nuk mund, duhet përmes një argumenti.

Skripti nën spojlerin
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 input një variabël myVar dhe duke përdorur API vendos vlerën e kësaj variablit në stageVar. Në etapën e ardhshme, duke përdorur sintaksën e variablave sistemorë, ne mund ta shohim atë.

Shembulli është mjaft i thjeshtë, por funksionaliteti na hap mundësi të mira, në kombinim 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ë pas, madje disa paralelisht. Dhe faza përfundimtare është shkatërrimi i saj. Tani po ekzekutohen testet automatike të produktit çdo herë në makinat virtuale të reja. Duke marrë parasysh se ato jetojnë për 10 minuta, kjo nuk kushton shumë.
Në artikullin e ardhshëm, nëse do të jetë e nevojshme, do të flas për YAML pipeline, ku ka shumë inovacione interesante së fundmi.
Burimi: habr.com
