Utilizzo delle variabili nei pipeline di Azure DevOps

Continuiamo la nostra esplorazione della straordinaria tool di sviluppo per Windows e non solo, Azure DevOps. Questa volta, dopo diverse difficoltà con le variabili d'ambiente, ho deciso di raccogliere tutta la mia esperienza in un unico articolo.

A partire dal fatto che ogni ambiente di esecuzione ha una sintassi diversa, fino all'assenza di una possibilità standard per trasferire variabili da una fase del pipeline all'altra.

Preciso che i principali esempi saranno sui Release Pipelines, poiché il supporto per YAML non è ancora disponibile lì, e ho bisogno della funzionalità di molteplici fasi e artefatti. Pare che questo sia diventato disponibile nei Pipelines normali, il che ha praticamente livellato le loro funzionalità. Nei Pipelines YAML hanno apportato miglioramenti e aggiunto alla rappresentazione testuale un piccolo suggerimento grafico con i parametri che possono essere impostati. È molto comodo, non è necessario consultare la documentazione per ogni modulo. Ma descriverò tutto ciò in un articolo successivo, intanto ecco un'immagine dell'ultima novità.

Utilizzo delle variabili nei pipeline di Azure DevOps

Archiviazione e utilizzo

Iniziamo col dire che nel sistema abbiamo delle variabili predefinite. Esse cominciano, a seconda della provenienza, con le parole Release, System, ecc. L'elenco completo (come si è rivelato, no) è disponibile in documentazione. Tutta la sintassi relativa alla variabile è illustrata nell'esempio della documentazione qui sotto. La stessa variabile ha tre rappresentazioni, a seconda di dove viene richiamata.

steps:
 - bash: echo Questo script potrebbe utilizzare $SYSTEM_ACCESSTOKEN
    env:
      SYSTEM_ACCESSTOKEN: $(System.AccessToken)
  - powershell: Write-Host "Questo è uno script che potrebbe utilizzare $env:SYSTEM_ACCESSTOKEN"
    env:
      SYSTEM_ACCESSTOKEN: $(System.AccessToken)

Se stai impostando una variabile sull'agente in cui viene eseguito il task, questa è $(System.AccessToken). Se desideri utilizzarla all'interno di uno script PowerShell sullo stesso agente, questa sarà $env:SYSTEM_ACCESSTOKEN. Se, Dio non voglia, desideri utilizzare questa variabile su un host remoto, utilizzando il task PowerShell on target machines, devi passarla come argomento allo script, usando param. Con bash è più semplice, puoi semplicemente passarla usando l'argomento e la sintassi $SYSTEM_ACCESSTOKEN.

Le stesse regole non si applicano alle tue variabili, qui sei tu a dover prestare attenzione alla sintassi. Puoi definire variabili localmente in ciascun task.

Utilizzo delle variabili nei pipeline di Azure DevOps

O globalmente nello storage delle variabili e poi collegarle dallo storage. Molto comodo.

Utilizzo delle variabili nei pipeline di Azure DevOps

In aggiunta, se le variabili sono estremamente riservate, possono essere memorizzate nel cloud Azure in uno storage chiamato Azure Vault, che può essere collegato al progetto in Library.

Utilizzo delle variabili nei pipeline di Azure DevOps

In generale, le variabili sono chiare; nei pipelines possono anche essere impostate manualmente per ogni esecuzione, mentre in release questa funzionalità non è disponibile. Puoi verificare ciò che stai passando al pipeline nei log di inizializzazione dell'agente, ma tieni presente che lì saranno già in forma trasformata.

Utilizzo delle variabili nei pipeline di Azure DevOps

Variabili dinamiche

Le cose interessanti iniziano quando vogliamo ottenere un certo valore in un passaggio e trasferirlo al successivo.

Utilizzo delle variabili nei pipeline di Azure DevOps

Tale funzionalità non è stata introdotta. Ma le nostre mani non sono per nulla inattive e, con l'aiuto di Google, è stata trovata una soluzione. Grazie a Dio, Azure DevOps ha un'API che ci consente di fare un po' di più di quanto sia stato progettato nell'interfaccia.

Quindi, avremo bisogno di una chiamata per aggiornare le variabili globali, che faremo direttamente dal pipeline. L'indirizzo viene recuperato dalle variabili d'ambiente, quelle stesse di cui non si parla affatto nella documentazione, come accennato in precedenza. Puoi definirle autonomamente o, per dire, hardcodificarle se chiudono la baracca.

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

Impostiamo un valore vuoto per la variabile che vogliamo trasferire, impostiamo lo Scope — Release

Utilizzo delle variabili nei pipeline di Azure DevOps

Per esempio, creiamo un generatore casuale di valori. Attenzione alla sintassi per la dichiarazione della variabile in questa fase, questa funzionalità è stata appena introdotta.

Utilizzo delle variabili nei pipeline di Azure DevOps

Nella fase successiva, passiamo la variabile allo script, sì, direttamente non si può fare, bisogna farlo tramite un argomento.

Utilizzo delle variabili nei pipeline di Azure DevOps

Script sotto 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

Oppure

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

In breve, il nostro script riceve in input la variabile myVar e usando l'API inserisce il valore di questa variabile in stageVar. Nella fase successiva, utilizzando la sintassi delle variabili di sistema, possiamo osservarla.

Utilizzo delle variabili nei pipeline di Azure DevOps

L'esempio è abbastanza semplice, ma la funzionalità ci offre buone opportunità, sommandosi alla mia esperienza precedente articolo, quando possiamo creare una macchina virtuale nella prima fase di test, eseguire alcune operazioni su di essa e, nel contempo, gestirne più di una. E come fase finale, distruggerla. Attualmente, i test automatici del prodotto vengono eseguiti ogni volta su nuove macchine virtuali. Considerando che durano circa 10 minuti, il costo è irrisorio.

Nell'articolo successivo, se necessario, parlerò dei pipeline YAML, poiché ci sono diverse novità interessanti recentemente.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster