Establecer variables en scripts

Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2019

Cuando se usan scripts de PowerShell y Bash en las canalizaciones, a menudo resulta útil establecer variables que puede usar en tareas futuras. Las variables recién establecidas no están disponibles en la misma tarea.

Los scripts son excelentes para cuando quiere hacer algo que no es compatible con una tarea como llamar a una API REST personalizada y analizar la respuesta.

Usará el comando de registro task.setvariable para establecer variables en scripts de PowerShell y Bash.

Nota:

Los trabajos de implementación usan una sintaxis diferente para las variables de salida. Para más información sobre la compatibilidad con variables de salida en trabajos de implementación, consulte Trabajos de implementación.

Para usar una variable con una condición en una canalización, consulte Especificación de condiciones.

Acerca de task.setvariable

Al agregar una variable con task.setvariable, las tareas siguientes pueden usar la variable mediante la sintaxis de macros $(myVar). La variable solo estará disponible para las tareas del mismo trabajo de manera predeterminada. Si agrega el parámetro isoutput, la sintaxis para llamar a la variable cambia. Consulte Establecimiento de una variable de salida para su uso en el mismo trabajo.

Establezca la variable myVar con el valor foo.

- bash: |
    echo "##vso[task.setvariable variable=myVar;]foo"

Lea la variable myVar:

- bash: |
    echo "You can use macro syntax for variables: $(myVar)"

Establecer propiedades de las variables

El comando task.setvariable incluye propiedades para establecer una variable como secreto, como una variable de salida y como de solo lectura. Las propiedades disponibles incluyen:

  • variable = nombre de la variable (obligatorio)
  • issecret = booleano (opcional, el valor predeterminado es false)
  • isoutput = booleano (opcional, el valor predeterminado es false)
  • isreadonly = booleano (opcional, el valor predeterminado es false)

Para usar la variable en la fase siguiente, establezca la propiedad isoutput en true. Para hacer referencia a una variable con el valor isoutput establecido en true, deberá incluir el nombre de la tarea. Por ejemplo, $(TaskName.myVar).

Cuando se establece una variable como de solo lectura, las tareas de nivel inferior no la pueden sobrescribir. Establezca isreadonly en true. Establecer una variable como de solo lectura mejora la seguridad haciendo que esa variable sea inmutable.

Establecimiento de una variable como secreto

Cuando issecret se establece en true, el valor de la variable se guardará como secreto y se enmascarará en los registros.

Nota:

Azure Pipelines realiza un esfuerzo para enmascarar secretos al emitir datos a registros de canalización, por lo que es posible que vea variables adicionales y datos enmascarados en los registros y de salida que no están establecidos como secretos.

Establezca la variable secreta mySecretVal.

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

Obtenga la variable secreta mySecretVal.

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

Salida de variable secreta en Bash.

Captura de pantalla de la salida de la variable de Bash.

Niveles de variables de salida

Hay cuatro tipos diferentes de variables de salida con distintas sintaxis:

Establecimiento de una variable de salida para su uso en el mismo trabajo

Cuando se usa una variable de salida en el mismo trabajo, no es necesario usar la propiedad isoutput. De manera predeterminada, la variable estará disponible para los pasos de bajada dentro del mismo trabajo. Sin embargo, si agrega la propiedad isoutput, deberá hacer referencia a la variable con el nombre de la tarea.

El script aquí establece la variable de salida del mismo trabajo myJobVar sin especificar isoutput y establece 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

Este script obtiene las variables del mismo trabajo myJobVar y myOutputJobVar. Observe que la sintaxis cambia para hacer referencia a una variable de salida una vez que se agrega 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
  - bash: |
     echo $(myJobVar) 
  - bash: |
     echo $(setOutput.myOutputJobVar)

Establecimiento de una variable de salida para su uso en trabajos futuros

Al usar variables de salida en los trabajos, deberá hacer referencia a ellas con dependencies. La sintaxis para acceder a una variable de salida en un trabajo o fase futuros varía en función de la relación entre el establecedor y el consumidor de la variable. Obtenga información sobre cada caso en las dependencias.

En primer lugar, establezca la variable de salida myOutputVar.

jobs:
- job: A
  steps:
  - bash: |
     echo "##vso[task.setvariable variable=myOutputVar;isoutput=true]this is from job A"
    name: passOutput

A continuación, acceda a myOutputVar en un trabajo futuro y genere la variable como myVarFromJobA. Para usar dependencies, debe establecer la propiedad dependsOn en el trabajo futuro con el nombre del trabajo anterior en el que se estableció la variable de salida.

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)

Establecimiento de una variable de salida para su uso en fases futuras

Las variables de salida se pueden usar en las distintas fases de las canalizaciones. Puede usar variables de salida para pasar información útil, como el identificador de una salida generada, de una fase a la siguiente.

Al establecer una variable con la propiedad isoutput, puede hacer referencia a esa variable en fases posteriores con el nombre de la tarea y la sintaxis stageDependencies. Obtenga más información sobre las dependencias.

Las variables de salida solo están disponibles en la siguiente fase de bajada. Si varias fases consumen la misma variable de salida, use la condición dependsOn.

En primer lugar, establezca la variable de salida myStageVal.

steps:
  - bash: echo "##vso[task.setvariable variable=myStageVal;isOutput=true]this is a stage output variable"
    name: MyOutputVar

A continuación, en una fase futura, asigne la variable de salida myStageVal a una variable de ámbito de fase, trabajo o tarea como, por ejemplo, myStageAVar. Tenga en cuenta que la sintaxis de asignación usa una expresión en tiempo de ejecución $[] y realiza un seguimiento de la ruta de acceso desde stageDependencies a la variable de salida, mediante el nombre de la fase (A) y el nombre del trabajo (A1) a fin de calificar completamente la variable.

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)

En caso de que el valor contenga nuevas líneas, puede aplicarles un escape y el agente automáticamente lo quitará de la secuencia de 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

Preguntas más frecuentes

No se representa mi variable de salida. ¿Qué es lo que va mal?

Hay algunas razones que explican por qué la variable de salida no aparece.

  • Las variables de salida que se establecen con isoutput no están disponibles en el mismo trabajo y, en su lugar, solo están disponibles en trabajos descendentes.
  • Dependiendo de la sintaxis de variable que use, es posible que una variable que establezca el valor de una variable de salida no esté disponible en tiempo de ejecución. Por ejemplo, las variables con sintaxis de macro ($(var)) se procesan antes de que se ejecute una tarea. En cambio, las variables con sintaxis de plantilla se procesan en tiempo de ejecución ($[variables.var]). Por lo general, querrá usar la sintaxis en tiempo de ejecución al establecer variables de salida. Para más información sobre la sintaxis de variables, consulte Definición de variables.
  • Puede haber espacios adicionales dentro de la expresión. Si la variable no se representa, compruebe si hay espacios adicionales que alrededor de isOutput=true.

Puede solucionar los problemas de salida de dependencies de un trabajo o fase de canalización agregando una variable para las dependencias y, a continuación, imprimiendo esa variable. Por ejemplo, en este trabajo de canalización, A establece la variable de salida MyTask. El segundo trabajo (B) depende del trabajo A. Una nueva variable, deps, contiene la representación JSON de las dependencias del trabajo. El segundo paso del trabajo B usa PowerShell para imprimir deps para que pueda ver las dependencias del trabajo.

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