Používanie premenných v kanáloch Azure DevOps

Pokračujeme v našej recenzii skvelého nástroja na vývoj pre Windows a ďalšie, Azure DevOps. Tentoraz, keďže som veľa trpel premennými prostredia, rozhodol som sa dať všetky skúsenosti do jedného článku.

Počnúc skutočnosťou, že majú odlišnú syntax pre každé prostredie vykonávania, končiac nedostatočnou štandardnou schopnosťou prenášať premenné z jednej fázy potrubia do druhej.

Urobím rezerváciu, že hlavné príklady budú na Release Pipelines, pretože YAML sa tam ešte nedostal a potrebujem funkčnosť mnohých fáz a mnohých artefaktov. Zdá sa, že sa to stalo dostupným v bežných Pipelines, čo sa im prakticky vyrovná vo funkčnosti. V Pipelines YAML sme k textovej reprezentácii pridali malý grafický tooltip s parametrami, ktoré je možné nastaviť. Je to veľmi pohodlné; nemusíte prechádzať dokumentáciou pre každý modul. Ale to popíšem v ďalšom článku, no zatiaľ tu je obrázok samotnej inovácie.

Používanie premenných v kanáloch Azure DevOps

Skladovanie a používanie

Začnime tým, že v systéme máme predvolené premenné. Začínajú sa v závislosti od pôvodu slovami Release, System atď. Úplný zoznam (ako sa ukázalo, nie) je k dispozícii na adrese dokumentáciu. Všetka schizofrénia so syntaxou je ilustrovaná príkladom z dokumentácie nižšie. Tá istá premenná má tri reprezentácie v závislosti od toho, kde ju nazývame.

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)

Ak nastavíte premennú na agentovi, na ktorom sa úloha vykonáva, je to $(System.AccessToken). Ak ho chcete použiť v rámci powershell skriptu na tom istom agentovi, bude to už $env:SYSTEM_ACCESSTOKEN. Ak, nedajbože, chcete použiť túto premennú na nejakom vzdialenom hostiteľovi pomocou úlohy PowerShell na cieľových počítačoch, musíte to odovzdať prostredníctvom argumentu skriptu pomocou moje peniaze. S bashom je to jednoduchšie, môžete ho jednoducho odovzdať pomocou argumentu a syntaxe $SYSTEM_ACCESSTOKEN.

Rovnaké zákony neplatia pre vaše vlastné premenné, tu už zodpovedáte za syntax. Premenné je možné nastaviť lokálne v každej úlohe.

Používanie premenných v kanáloch Azure DevOps

Alebo globálne do variabilného obchodu a potom ich prepojte z obchodu. Veľmi pohodlne.

Používanie premenných v kanáloch Azure DevOps

Ako bonus, ak sú premenné veľmi tajné, môžu byť uložené v cloude Azure v úložisku s názvom Azure Vault; Vault môžete prepojiť s projektom v knižnici.

Používanie premenných v kanáloch Azure DevOps

Vo všeobecnosti je všetko jasné s premennými; v kanáloch ich možno stále nastaviť manuálne pre každé spustenie; vo verzii takáto funkcia neexistuje. V protokoloch inicializácie agenta môžete znova vidieť, čo prenášate do potrubia, ale majte na pamäti, že sú tam už v konvertovanej podobe.

Používanie premenných v kanáloch Azure DevOps

Dynamické premenné

Zábava začína, keď chceme získať nejakú hodnotu v jednej fáze a odovzdať ju ďalšej.

Používanie premenných v kanáloch Azure DevOps

Takáto funkcia nám nebola poskytnutá. Ale naše ruky nie sú na nudu a s pomocou Google sa našlo riešenie. Vďaka Bohu, Azure DevOps má API, ktoré nám umožňuje robiť trochu viac, ako je znázornené v rozhraní.

Budeme teda potrebovať volanie na aktualizáciu globálnych premenných, ktoré vykonáme priamo z potrubia. Adresa je prevzatá z premenných prostredia, tých istých, o ktorých v dokumentácii nie je ani slovo, ako už bolo spomenuté. Môžete si ich nastaviť sami, alebo, čo je viac, napevno ich zakódovať, ak zatvoria obchod.

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

Nastavíme prázdnu hodnotu premennej, ktorú chceme preniesť, nastavíme Rozsah - Uvoľnenie

Používanie premenných v kanáloch Azure DevOps

Napríklad vytvoríme nejaký generátor náhodných hodnôt. Venujte pozornosť syntaxi deklarovania premennej v tejto fáze; táto funkcia bola zavedená.

Používanie premenných v kanáloch Azure DevOps

V ďalšom kroku odovzdáme premennú skriptu, áno, áno, nie je to možné priamo, musí to byť cez argument.

Používanie premenných v kanáloch Azure DevOps

Scenár pod spojlerom

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

tresnúť

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

Stručne povedané, náš skript berie premennú myVar ako vstup a používa API na vloženie hodnoty tejto premennej do stageVar. V ďalšom kroku pomocou syntaxe systémových premenných sa na to môžeme pozrieť.

Používanie premenných v kanáloch Azure DevOps

Príklad je celkom jednoduchý, ale funkčnosť nám okrem mojich predchádzajúcich otvára dobré príležitosti článok, kedy môžeme vytvoriť virtuálny stroj v prvej fáze testovania, vykonať s ním niekoľko ďalších manipulácií a niekoľko paralelne. A posledná fáza je zničiť ho. Teraz spúšťame autotesty produktu zakaždým na nových virtuálnych strojoch. Vzhľadom na to, že žijú asi 10 minút, stojí to cent.

V ďalšom článku, ak to bude potrebné, budem hovoriť o YAML pipeline, tam je v poslednej dobe pomerne veľa zaujímavých inovácií.

Zdroj: hab.com

Pridať komentár