Continuem la nostra revisió d'una meravellosa eina per al desenvolupament per a Windows i més, Azure DevOps. Aquesta vegada, després d'haver patit molt amb les variables d'entorn, vaig decidir posar tota l'experiència en un sol article.
A partir del fet que tenen una sintaxi diferent per a cada entorn d'execució, acabant amb la manca d'una capacitat estàndard per transferir variables d'una etapa del pipeline a una altra.
Faré una reserva que els exemples principals seran a Release Pipelines, perquè YAML encara no hi ha arribat i necessito la funcionalitat de moltes etapes i molts artefactes. Sembla que això s'ha fet disponible a Pipelines habituals, cosa que pràcticament els iguala en funcionalitat. A Pipelines YAML, hem afegit una petita informació gràfica a la representació del text amb paràmetres que es poden establir. És molt convenient, no cal que revises la documentació de cada mòdul. Però ho descriuré en el proper article, però de moment aquí teniu una imatge de la innovació en si.
Emmagatzematge i ús
Comencem pel fet que tenim variables per defecte al sistema. Comencen, segons el seu origen, amb les paraules Release, System, etc. La llista completa (com resulta que no), està disponible a
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)
Si configureu una variable a l'agent en què s'executa la tasca, és $(System.AccessToken). Si voleu utilitzar-lo dins d'un script de Powershell al mateix agent, ja serà $env:SYSTEM_ACCESSTOKEN. Si, Déu no ho vulgui, voleu utilitzar aquesta variable en algun host remot mitjançant la tasca PowerShell a les màquines de destinació, heu de passar-ho a través d'un argument a l'script mitjançant
Les mateixes lleis no s'apliquen a les vostres pròpies variables; aquí ja sou responsable de la sintaxi. Les variables es poden establir localment en cada tasca.
O globalment a la botiga de variables i, a continuació, enllaçeu-les des de la botiga. Molt còmodament.
Com a avantatge, si les variables són molt secretes, es poden emmagatzemar al núvol Azure en un emmagatzematge anomenat Azure Vault; podeu enllaçar Vault al projecte a la Biblioteca.
En general, tot està clar amb les variables; a les pipelines encara es poden configurar manualment per a cada llançament; en el llançament no hi ha aquesta funcionalitat. Podeu tornar a veure què esteu transferint a la canalització als registres d'inicialització de l'agent, però tingueu en compte que ja hi són en forma convertida.
Variables dinàmiques
La diversió comença quan volem rebre algun valor en una etapa i passar-la a la següent.
No ens van proporcionar aquesta funcionalitat. Però les nostres mans no estan per avorrir-se i amb l'ajuda de Google es va trobar una solució. Gràcies a Déu, Azure DevOps té una API que ens permet fer una mica més del que es mostra a la interfície.
Per tant, necessitarem una trucada per actualitzar les variables globals, cosa que farem directament des de la canalització. L'adreça està presa de variables d'entorn, les mateixes de les quals no hi ha cap paraula a la documentació, com s'ha esmentat anteriorment. Podeu configurar-los vosaltres mateixos o, a més, codificar-los si tanquen la botiga.
$releaseurl = ('{0}{1}/_apis/release/releases/{2}?api-version=5.0' -f $($env:SYSTEM_TEAMFOUNDATIONSERVERURI), $($env:SYSTEM_TEAMPROJECTID), $($env:RELEASE_RELEASEID) )
Establim el valor buit de la variable que volem transferir, establim Scope - Release
Per exemple, fem un generador de valors aleatoris. Fixeu-vos en la sintaxi de declarar una variable dins d'aquesta etapa; aquesta funcionalitat es va introduir.
En el següent pas, passem la variable a l'script, sí, sí, no és possible directament, ha de ser mitjançant un argument.
Guió sota 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))
#endregion
O
xoc
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
En poques paraules, el nostre script pren la variable myVar com a entrada i utilitza l'API per posar el valor d'aquesta variable a stageVar. En el següent pas, utilitzant la sintaxi de la variable del sistema, podem mirar-ho.
L'exemple és força senzill, però la funcionalitat ens obre bones oportunitats, a més de la meva anterior
En el següent article, si cal, parlaré dels pipelines YAML; darrerament hi ha hagut moltes innovacions interessants.
Font: www.habr.com