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 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 mySecretValprivata .

- 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 di 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.

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 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 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 MyTaskdi 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)"