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.
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
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
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.
Alebo globálne do variabilného obchodu a potom ich prepojte z obchodu. Veľmi pohodlne.
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.
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.
Dynamické premenné
Zábava začína, keď chceme získať nejakú hodnotu v jednej fáze a odovzdať ju ďalšej.
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
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á.
V ďalšom kroku odovzdáme premennú skriptu, áno, áno, nie je to možné priamo, musí to byť cez argument.
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ť.
Príklad je celkom jednoduchý, ale funkčnosť nám okrem mojich predchádzajúcich otvára dobré príležitosti
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