Používanie premenných v Azure DevOps pipelines

Pokračujeme v preskúmaní úžasného nástroja na vývoj pod Windows a nielen, Azure DevOps. Tentoraz, po trápení s premennými prostredia, som sa rozhodol zúžitkovať všetky skúsenosti do jedného článku.

Od rozdielneho syntaxu pre každé prostredie, až po absenciu štandardnej možnosti prenášať premenné z jednej fázy pipeline do druhej.

Musím podotknúť, že hlavné príklady budú na Release Pipelines, pretože YAML tam ešte nedorazil a ja potrebujem funkčnosť viacerých etáp a viacerých artefaktov. To sa, zdá sa, stalo dostupné v bežných Pipelines, čo prakticky vyrovnalo ich funkčnosť. V Pipelines YAML dopriali a pridali k textovému zobrazeniu malú grafickú nápovedu s parametrami, ktoré je možné nastaviť. Veľmi pohodlné, netreba sa hrabať v dokumentácii pre každý modul. Ale to budem popisovať v ďalšom článku, a zatiaľ priložím obrázok samotnej novinky.

Používanie premenných v Azure DevOps pipelines

Ukladanie a používanie

Začneme tým, že v systéme máme predvolené premenné. Rovnako začínajú, v závislosti od pôvodu, slovami Release, System, atď. Úplný zoznam (ako sa ukázalo, neexistuje) je dostupný v dokumenácie. Celú schizofréniu s syntaxou ilustruje príklad z dokumentácie nižšie. Tá istá premenná má tri zobrazenia, v závislosti od miesta, kde ju voláme.

steps:
 - bash: echo Tento skript by mohol používať $SYSTEM_ACCESSTOKEN
    env:
      SYSTEM_ACCESSTOKEN: $(System.AccessToken)
  - powershell: Write-Host "Toto je skript, ktorý by mohol používať $env:SYSTEM_ACCESSTOKEN"
    env:
      SYSTEM_ACCESSTOKEN: $(System.AccessToken)

Ak nastavíte premennú na agente, na ktorom sa úloha vykonáva, je to $(System.AccessToken). Ak ju chcete použiť vo vnútri powershell skriptu na tom istom agentovi, už to bude $env:SYSTEM_ACCESSTOKEN. Ak, nedej bože, chcete túto premennú použiť na nejakom vzdialenom hostiteľovi, pomocou úlohy PowerShell on target machines, musíte ju preniesť ako argument do skriptu, použitím param. S bash je to jednoduchšie, môžete ju jednoducho prenášať dovnútra pomocou argumentu a syntaxe $SYSTEM_ACCESSTOKEN.

Tieto isté zákony sa nevzťahujú na vaše vlastné premenné, tu už nesiete zodpovednosť za syntax. Premenné je možné nastaviť lokálne v každej úlohe.

Používanie premenných v Azure DevOps pipelines

Alebo globálne v úložisku premenných a potom ich prepojiť z úložiska. Veľmi pohodlné.

Používanie premenných v Azure DevOps pipelines

Bonusom k tomu, ak sú premenne veľmi tajné, môžu byť uložené v cloude Azure v úložisku s názvom Azure Vault, ktoré je možné prepojiť s projektom v knižnici.

Používanie premenných v Azure DevOps pipelines

Celkovo je s premennými všetko jasné, v pipelines ich je možné ešte nastaviť ručne pri každom spustení, avšak v release táto funkčnosť chýba. To, čo prechádzate do pipeline, si môžete znova pozrieť v logoch inicializácie agenta, ale vezmite na vedomie, že sú tam už v upravenom formáte.

Používanie premenných v Azure DevOps pipelines

Dynamické premenné

Najzaujímavejšie sa začína, keď chceme získať nejakú hodnotu v jednom kroku a odovzdať ju do nasledujúceho.

Používanie premenných v Azure DevOps pipelines

Takáto funkčnosť nám nebola poskytnutá. Ale naše ruky nie sú na nič, a s pomocou Googlu bolo nájdené riešenie. Chvalabohu, Azure DevOps má API, ktoré nám umožňuje urobiť trochu viac, než bolo zobrazené v rozhraní.

Takže, potrebujeme volanie na aktualizáciu globálnych premenných, ktoré budeme robiť priamo z vnútorného prostredia pipeline. Adresa sa berie z premenných prostredia, o ktorých sa v dokumentácii nič nehovorí, ako už bolo spomenuté. Môžete ich nastaviť sami alebo, čo už, zakódovať, ak by sa obchod zatvoril.

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

Nastavujeme prázdnu hodnotu premennej, ktorú chceme odovzdať, a nastavujeme Scope — Release

Používanie premenných v Azure DevOps pipelines

Pre príklad vytvárame nejaký náhodný generátor hodnôt. Všimnite si syntax deklarácie premennej v tomto kroku, takúto funkčnosť nám priniesli.

Používanie premenných v Azure DevOps pipelines

V nasledujúcom kroku odovzdávame premennú skriptu, áno, priamo to nie je možné, musí to byť cez argument.

Používanie premenných v Azure DevOps pipelines

Skript pod spoilerom

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

Alebo

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

V skratke, náš skript berie ako vstup premennú myVar a pomocou API ukladá hodnotu tejto premennej do stageVar. V nasledujúcom kroku, pomocou syntaxe systémových premenných, si ju môžeme pozrieť.

Používanie premenných v Azure DevOps pipelines

Príklad je dosť jednoduchý, ale funkčnosť nám otvára dobré možnosti, spolu s mojím predchádzajúcim článkom, keď môžeme vytvoriť virtuálny stroj v prvom kroku testovania, urobiť s ním nejaké operácie, a to dokonca súčasne s viacerými. A konečným krokom je jeho zničenie. Teraz sa u nás spúšťajú automatizované testy produktu vždy na čerstvých virtuálnych strojoch. Zohľadňujúc, že žijú približne 10 minút, stojí to pár centov.

V nasledujúcom článku, ak bude potreba, poviem niečo o YAML pipeline, tam je v poslednom čase dosť veľa zaujímavých noviniek.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster