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.
Niveles de variables de salida
Hay cuatro tipos diferentes de variables de salida con distintas sintaxis:
- Variables de salida establecidas en el mismo trabajo sin el parámetro
isoutput
. Para hacer referencia a estas variables, deberá usar la sintaxis de macro. Ejemplo:$(myVar)
. - Variables de salida establecidas en el mismo trabajo con el parámetro
isoutput
. Para hacer referencia a estas variables, deberá incluir el nombre de la tarea. Ejemplo:$(myTask.myVar)
. - Variables de salida establecidas en un trabajo futuro. Para hacer referencia a estas variables, deberá hacer referencia a la variable de la sección
variables
con la sintaxisdependency
. - Variables de salida establecidas en fases futuras. Para hacer referencia a estas variables, hará referencia a la variable de la sección
variables
con sintaxisstageDependencies
.
Nota:
Las fases o trabajos futuros solo pueden acceder a variables de salida si dependen de la fase o del trabajo en el que se estableció la variable. Para que se pueda acceder a una variable de salida, asegúrese de que la siguiente fase o trabajo depende de la fase o del trabajo donde creó la variable. Si hay varias fases o trabajos que necesitan usar la misma variable de salida, use la condición dependsOn
para establecer esta dependencia.
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)"