Condividi tramite


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 un'operazione non supportata da un'attività. Ad esempio, è possibile usare uno script per chiamare un'API REST personalizzata e analizzare la risposta.

Usi il comando di registrazione task.setvariable per impostare le variabili negli script 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.

Informazioni task.setvariable

Quando si aggiunge una variabile con task.setvariable, le attività seguenti possono usare la variabile usando la sintassi macro $(myVar). La variabile è, per impostazione predefinita, disponibile solo per le attività nello stesso processo. Se si aggiunge il parametro isOutput, cambierà la sintassi per chiamare la variabile. Per altre informazioni, 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 impostato su true, è necessario includere il nome dell'attività. Ad esempio: $(TaskName.myVar).

Quando si imposta una variabile come di sola lettura, le attività downstream non possono sovrascriverla. 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"

Ottieni la variabile mySecretVal segreta.

- bash: |
    echo "##vso[task.setvariable variable=mySecretVal;issecret=true]secretvalue"
- bash: |
    echo $(mySecretVal)

Output delle variabili segrete in bash.

Screenshot dell'output della variabile bash.

Livelli delle variabili di output

Esistono quattro diversi tipi di variabili di output con sintassi distinte:

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.

Il nome di una variabile di output può cambiare se la pipeline usa una strategia di esecuzione come un job di matrice. Per questi casi, visualizzare prima di tutto la variabile per testarla e verificarne il nome. È anche possibile stampare tutte le variabili disponibili in una pipeline con lo script env.

- script: env
  displayName: 'Print all variables'

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 è disponibile per i passaggi downstream all'interno dello stesso processo. Tuttavia, se si aggiunge la proprietà isOutput, è 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 lavoro e myOutputJobVar. Si noti che la sintassi cambia per fare riferimento a una variabile di output una volta che isOutput=true è stato aggiunto.

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 attività, è possibile farvi riferimento 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 myOutputVardi 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 myStageValdi 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 myStageVal a una variabile di fase, di processo o con ambito di 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)

Se il valore contiene nuove righe, è possibile eseguirne l'escape e l'agente lo annulla automaticamente:

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 visualizzata. 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 job della pipeline A imposta la variabile di output MyTask. Il secondo lavoro (B) dipende dal lavoro A. Una nuova variabile, deps contiene la rappresentazione JSON delle dipendenze del processo. Il secondo passaggio di Job B usa PowerShell per mostrare deps in modo da poter 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)"