Impostare variabili negli script
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
Quando si usano script di PowerShell e Bash nelle pipeline, è spesso utile impostare le variabili che è possibile usare nelle attività future. Le variabili appena impostate non sono disponibili nella stessa attività.
Gli script sono ideali per quando si vuole eseguire operazioni che non sono supportate da un'attività come la chiamata di un'API REST personalizzata e l'analisi della risposta.
Si userà il task.setvariable
comando di registrazione per impostare le variabili negli script di PowerShell e Bash .
Nota
I processi di distribuzione usano una sintassi diversa per le variabili di output. Per altre informazioni sul supporto per le variabili di output nei processi di distribuzione, vedere Processi di distribuzione.
Per usare una variabile con una condizione in una pipeline, vedere Specificare le condizioni.
Circa task.setvariable
Quando si aggiunge una variabile con task.setvariable
, le attività seguenti possono usare la variabile usando la sintassi macro $(myVar)
. La variabile sarà disponibile solo per le attività nello stesso processo per impostazione predefinita. Se si aggiunge il parametro isOutput
, la sintassi per chiamare le modifiche della variabile. Vedere Impostare una variabile di output da usare nello stesso processo.
Impostare la variabile myVar
con il valore foo
.
- bash: |
echo "##vso[task.setvariable variable=myVar;]foo"
Leggere la variabile myVar
:
- bash: |
echo "You can use macro syntax for variables: $(myVar)"
Impostare le proprietà della variabile
Il task.setvariable
comando include proprietà per impostare una variabile come segreto, come variabile di output e come sola lettura. Le proprietà disponibili includono:
-
variable
= nome variabile (obbligatorio) -
isSecret
= booleano (facoltativo, il valore predefinito è false) -
isOutput
= booleano (facoltativo, il valore predefinito è false) -
isReadOnly
= booleano (facoltativo, il valore predefinito è false)
Per usare la variabile nella fase successiva, impostare la isOutput
proprietà su true
. Per fare riferimento a una variabile con il isOutput
set su true, si includerà il nome dell'attività. Ad esempio: $(TaskName.myVar)
.
Quando si imposta una variabile come di sola lettura, non può essere sovrascritta dalle attività downstream. Impostare isreadonly
su true
. L'impostazione di una variabile come di sola lettura migliora la sicurezza rendendo questa variabile non modificabile.
Impostare una variabile come segreto
Se issecret
è impostato su true, il valore della variabile verrà salvato come segreto e mascherato dai log.
Nota
Azure Pipelines si impegna a mascherare i segreti durante l'emissione di dati nei log della pipeline, pertanto è possibile visualizzare variabili aggiuntive e dati mascherati nell'output e nei log che non sono impostati come segreti.
Impostare la variabile segreta mySecretVal
.
- bash: |
echo "##vso[task.setvariable variable=mySecretVal;issecret=true]secretvalue"
Ottenere la variabile mySecretVal
privata .
- bash: |
echo "##vso[task.setvariable variable=mySecretVal;issecret=true]secretvalue"
- bash: |
echo $(mySecretVal)
Output delle variabili segrete in bash.
Livelli di variabili di output
Esistono quattro diversi tipi di variabili di output con sintassi distinte:
-
Variabili di output impostate nello stesso processo senza il
isOutput
parametro . Per fare riferimento a queste variabili, si userà la sintassi della macro. Esempio:$(myVar)
. -
Variabili di output impostate nello stesso processo con il
isOutput
parametro . Per fare riferimento a queste variabili, si includerà il nome dell'attività. Esempio:$(myTask.myVar)
. -
Variabili di output impostate in un processo futuro. Per fare riferimento a queste variabili, si farà riferimento alla variabile nella sezione con
variables
ladependency
sintassi . -
Variabili di output impostate in fasi future. Per fare riferimento a queste variabili, si farà riferimento alla variabile nella sezione con
variables
lastageDependencies
sintassi .
Nota
Le fasi o i processi futuri possono accedere solo alle variabili di output se dipendono dalla fase o dal processo in cui è stata impostata la variabile. Per rendere accessibile una variabile di output, assicurarsi che la fase o il processo successivo dipende dalla fase o dal processo in cui è stata creata la variabile. Se più fasi o processi devono usare la stessa variabile di output, usare la dependsOn
condizione per stabilire questa dipendenza.
Impostare una variabile di output da usare nello stesso processo
Quando si usa una variabile di output nello stesso processo, non è necessario usare la isOutput
proprietà . Per impostazione predefinita, la variabile sarà disponibile per i passaggi downstream all'interno dello stesso processo. Tuttavia, se si aggiunge la isOutput
proprietà , sarà necessario fare riferimento alla variabile con il nome dell'attività.
Lo script qui imposta la variabile myJobVar
di output dello stesso processo senza specificare isOutput
e impostare myOutputJobVar
con isOutput=true
.
jobs:
- job: A
steps:
- bash: |
echo "##vso[task.setvariable variable=myJobVar]this is the same job"
- bash: |
echo "##vso[task.setvariable variable=myOutputJobVar;isOutput=true]this is the same job too"
name: setOutput
Questo script ottiene le variabili myJobVar
dello stesso processo e myOutputJobVar
. Si noti che la sintassi cambia per fare riferimento a una variabile di output dopo isOutput=true
l'aggiunta.
jobs:
- job: A
steps:
- bash: |
echo "##vso[task.setvariable variable=myJobVar]this is the same job"
- bash: |
echo "##vso[task.setvariable variable=myOutputJobVar;isOutput=true]this is the same job too"
name: setOutput
- bash: |
echo $(myJobVar)
- bash: |
echo $(setOutput.myOutputJobVar)
Impostare una variabile di output da usare nei processi futuri
Quando si usano variabili di output tra processi, si farà riferimento a tali variabili con dependencies
. La sintassi per accedere a una variabile di output in un processo o una fase futura varia in base alla relazione tra il setter e il consumer della variabile. Informazioni su ogni caso nelle dipendenze.
Impostare prima di tutto la variabile myOutputVar
di output .
jobs:
- job: A
steps:
- bash: |
echo "##vso[task.setvariable variable=myOutputVar;isOutput=true]this is from job A"
name: passOutput
myOutputVar
Accedere quindi in un processo futuro e restituire la variabile come myVarFromJobA
. Per usare dependencies
, è necessario impostare la dependsOn
proprietà nel processo futuro usando il nome del processo precedente in cui è stata impostata la variabile di output.
jobs:
- job: A
steps:
- bash: |
echo "##vso[task.setvariable variable=myOutputVar;isOutput=true]this is from job A"
name: passOutput
- job: B
dependsOn: A
variables:
myVarFromJobA: $[ dependencies.A.outputs['passOutput.myOutputVar'] ]
steps:
- bash: |
echo $(myVarFromJobA)
Impostare una variabile di output da usare nelle fasi future
Le variabili di output possono essere usate in più fasi nelle pipeline. È possibile usare le variabili di output per passare informazioni utili, ad esempio l'ID di un output generato, da una fase all'altra.
Quando si imposta una variabile con la isOutput
proprietà , è possibile fare riferimento a tale variabile in fasi successive con il nome dell'attività e la stageDependencies
sintassi. Altre informazioni sulle dipendenze.
Le variabili di output sono disponibili solo nella fase downstream successiva. Se più fasi utilizzano la stessa variabile di output, usare la dependsOn
condizione .
Impostare prima di tutto la variabile myStageVal
di output .
steps:
- bash: echo "##vso[task.setvariable variable=myStageVal;isOutput=true]this is a stage output variable"
name: MyOutputVar
Quindi, in una fase futura, eseguire il mapping della variabile di output a una variabile myStageVal
di fase, processo o con ambito attività, ad esempio myStageAVar
. Si noti che la sintassi di mapping usa un'espressione $[]
di runtime e traccia il percorso da stageDependencies
alla variabile di output usando sia il nome della fase (A
) che il nome del processo (A1
) per qualificare completamente la variabile.
stages:
- stage: A
jobs:
- job: A1
steps:
- bash: echo "##vso[task.setvariable variable=myStageVal;isOutput=true]this is a stage output variable"
name: MyOutputVar
- stage: B
dependsOn: A
jobs:
- job: B1
variables:
myStageAVar: $[stageDependencies.A.A1.outputs['MyOutputVar.myStageVal']]
steps:
- bash: echo $(myStageAVar)
Nel caso in cui il valore contenga nuove righe, è possibile eseguirne l'escape e l'agente rimuoverà automaticamente l'escape:
steps:
- bash: |
escape_data() {
local data=$1
data="${data//'%'/'%AZP25'}"
data="${data//$'\n'/'%0A'}"
data="${data//$'\r'/'%0D'}"
echo "$data"
}
echo "##vso[task.setvariable variable=myStageVal;isOutput=true]$(escape_data $'foo\nbar')"
name: MyOutputVar
Domande frequenti
La variabile di output non viene eseguito il rendering. Che cosa sta andando storto?
Esistono alcuni motivi per cui la variabile di output potrebbe non essere visualizzata.
- Le variabili di output impostate con
isOutput
non sono disponibili nello stesso processo e sono invece disponibili solo nei processi downstream. - A seconda della sintassi della variabile usata, una variabile che imposta il valore di una variabile di output potrebbe non essere disponibile in fase di esecuzione. Ad esempio, le variabili con sintassi macro (
$(var)
) vengono elaborate prima dell'esecuzione di un'attività. Al contrario, le variabili con sintassi del modello vengono elaborate in fase di esecuzione ($[variables.var]
). In genere si vuole usare la sintassi di runtime quando si impostano le variabili di output. Per altre informazioni sulla sintassi delle variabili, vedere Definire le variabili. - Potrebbero essere presenti spazi aggiuntivi all'interno dell'espressione. Se la variabile non esegue il rendering, verificare la presenza di spazi aggiuntivi che circondano
isOutput=true
.
È possibile risolvere i problemi relativi all'output dependencies
per un processo o una fase della pipeline aggiungendo una variabile per le dipendenze e quindi stampando tale variabile. Ad esempio, in questo processo A
della pipeline viene impostata la variabile MyTask
di output . Il secondo processo (B
) dipende dal processo A
. Una nuova variabile contiene deps
la rappresentazione JSON delle dipendenze del processo. Il secondo passaggio di Job B
usa PowerShell per stampare deps
in modo da visualizzare le dipendenze del processo.
trigger:
- '*'
pool:
vmImage: 'ubuntu-latest'
jobs:
- job: A
steps:
- script: |
echo "##vso[task.setvariable variable=MyTask;isOutput=true]theoutputval"
name: ProduceVar
- job: B
dependsOn: A
variables:
varFromA: $[ dependencies.A.outputs['ProduceVar.MyTask'] ]
deps: $[convertToJson(dependencies)] # create a variable with the job dependencies
steps:
- script: echo $(varFromA) #
- powershell: Write-Host "$(deps)"