Vi fortsÀtter vÄr översikt av det fantastiska verktyget för utveckling pÄ Windows och mer, Azure DevOps. Den hÀr gÄngen, efter att ha kÀmpat med miljövariabler, bestÀmde jag mig för att sammanfatta all erfarenhet i en artikel.
FrÄn att varje körningsmiljö har olika syntax, till avsaknaden av en standardfunktion för att överföra variabler frÄn en pipeline-steg till en annan.
Jag vill nÀmna att de huvudsakliga exemplen kommer att vara pÄ Release Pipelines, eftersom YAML Ànnu inte har nÄtt dit, och jag behöver funktionaliteten med flera steg och flera artefakter. Det verkar ha blivit tillgÀngligt i vanliga Pipelines, vilket praktiskt taget har utjÀmnat deras funktionalitet. I Pipelines har YAML vidareutvecklats och en liten grafisk tips med parametrar som kan stÀllas in har lagts till textrepresentationen. Mycket praktiskt, man behöver inte gÄ till dokumentationen för varje modul. Men det kommer jag att beskriva i nÀsta artikel, för nu hÀr Àr en bild av sjÀlva nyheten.

Lagring och anvÀndning
LÄt oss börja med att i systemet har vi standardvariabler. De börjar, beroende pÄ kÀlla, med orden Release, System, etc. Den fullstÀndiga listan (som det visade sig, finns inte), finns i . Hela galenskapen med syntaxen illustreras av ett exempel frÄn dokumentationen nedan. En och samma variabel har tre representationer, beroende pÄ var vi anropar den.
steps:
- bash: echo Detta skript kan anvÀnda $SYSTEM_ACCESSTOKEN
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
- powershell: Write-Host "Detta Àr ett skript som kan anvÀnda $env:SYSTEM_ACCESSTOKEN"
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)Om du stÀller in en variabel pÄ agenten som utför uppgiften, Àr det $(System.AccessToken). Om du vill anvÀnda den i ett PowerShell-skript pÄ samma agent, blir det redan $env:SYSTEM_ACCESSTOKEN. Om du, gud förbjude, vill anvÀnda denna variabel pÄ en fjÀrrvÀrd, med uppgiften PowerShell pÄ mÄlenheter, mÄste du skicka den som ett argument till skriptet, med . Med bash Àr det enklare, man kan bara vidarebefordra den inuti med argument och syntax $SYSTEM_ACCESSTOKEN.
De samma regler gÀller inte för dina egna variabler, hÀr bÀr du ansvaret för syntaxen sjÀlv. Variabler kan stÀllas in lokalt i varje uppgift.

Eller globalt i variabelförrÄdet, och sedan lÀnka dem frÄn förrÄdet. Mycket praktiskt.

Som en bonus, om variablerna Àr extremt hemliga, kan de lagras i Azure-molnet i en lagring som kallas Azure Vault, och Vault kan kopplas till projektet i biblioteket.

Generellt sett Àr det klart med variabler, i pipelines kan de ocksÄ stÀllas in manuellt för varje körning, men den funktionen finns inte i release. Du kan se vad du skickar till pipelinen i loggarna för agentens initiering, men kom ihÄg att de redan Àr i transformerad form dÀr.

Dynamiska variabler
Det intressanta börjar nÀr vi vill fÄ ett visst vÀrde i ett steg och överföra det till nÀsta.

Denna funktion har vi tyvÀrr inte fÄtt. Men vÄra hÀnder Àr inte till för att vara sysslolösa, och med hjÀlp av Google hittade vi en lösning. Tack och lov har Azure DevOps ett API som gör att vi kan göra lite mer Àn vad som tecknades i grÀnssnittet.
SÄ vi behöver ett anrop för att uppdatera globala variabler, som vi kommer att göra direkt inifrÄn pipelinen. Adressen tas frÄn miljövariabler, de som inte nÀmns nÄgonstans i dokumentationen, som nÀmnts tidigare. Du kan stÀlla in dem sjÀlv eller, varför inte, hÄrdkoda dem om de stÀnger av möjligheten.
$releaseurl = ('{0}{1}\/apis\/release\/releases\/{2}?api-version=5.0' -f $($env:SYSTEM_TEAMFOUNDATIONSERVERURI), $($env:SYSTEM_TEAMPROJECTID), $($env:RELEASE_RELEASEID) )Vi sĂ€tter ett tomt vĂ€rde för variabeln som vi vill överföra och sĂ€tter Scope â Release

Som exempel skapar vi en viss slumpmÀssig vÀrdeskapare. Observera syntaxen för att deklarera variabeln inom detta steg, en sÄdan funktion har lagts till.

I nÀsta steg överför vi variabeln till skriptet, ja, ja, direkt kan vi inte, det mÄste göras via argument.

Skriptet under spoiler
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))
#endregionEller
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_URLKort sagt, vÄrt skript tar en variabel myVar som input och anvÀnder API:et för att lÀgga vÀrdet av denna variabel i stageVar. I nÀsta steg, med hjÀlp av syntaxen för systemvariabler, kan vi se den.

Exemplet Àr ganska enkelt, men funktionen ger oss bra möjligheter, tillsammans med min tidigare erfarenhet. , nÀr vi kan skapa en virtuell maskin i första teststeget, göra nÄgra manipulationer med den, dessutom parallellt med flera. Och som slutsteg förstöra den. Just nu kör vi automatiserade tester av produkten varje gÄng pÄ nya virtuella maskiner. Med tanke pÄ att de lever i ungefÀr 10 minuter kostar det en spottstyver.
I nÀsta artikel, om det behövs, kommer jag att berÀtta om YAML-pipelines, dÀr det har dykt upp ganska mÄnga intressanta nyheter pÄ sistone.
KĂ€lla: habr.com
