Definir variáveis em scripts
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
Quando você usa scripts PowerShell e Bash em seus pipelines, geralmente é útil poder definir variáveis que você pode usar em tarefas futuras. As variáveis recém-definidas não estão disponíveis na mesma tarefa.
Os scripts são ótimos para quando você deseja fazer algo que não é suportado por uma tarefa, como chamar uma API REST personalizada e analisar a resposta.
Você usará o task.setvariable
comando logging para definir variáveis em scripts PowerShell e Bash .
Nota
Os trabalhos de implantação usam uma sintaxe diferente para variáveis de saída. Para saber mais sobre o suporte para variáveis de saída em trabalhos de implantação, consulte Trabalhos de implantação.
Para usar uma variável com uma condição em um pipeline, consulte Especificar condições.
Sobre nós task.setvariable
Quando você adiciona uma variável com task.setvariable
, as tarefas a seguir podem usar a variável usando sintaxe de macro $(myVar)
. A variável só estará disponível para tarefas no mesmo trabalho por padrão. Se você adicionar o parâmetro isOutput
, a sintaxe para chamar sua variável será alterada. Consulte Definir uma variável de saída para uso no mesmo trabalho.
Defina a variável myVar
com o valor foo
.
- bash: |
echo "##vso[task.setvariable variable=myVar;]foo"
Leia a variável myVar
:
- bash: |
echo "You can use macro syntax for variables: $(myVar)"
Definir propriedades de variáveis
O task.setvariable
comando inclui propriedades para definir uma variável como secret, como uma variável de saída e como somente leitura. As propriedades disponíveis incluem:
-
variable
= nome da variável (Obrigatório) -
isSecret
= booleano (Opcional, padrão para false) -
isOutput
= booleano (Opcional, padrão para false) -
isReadOnly
= booleano (Opcional, padrão para false)
Para usar a variável na próxima etapa, defina a isOutput
propriedade como true
. Para fazer referência a uma variável com o isOutput
conjunto como true, você incluirá o nome da tarefa. Por exemplo, $(TaskName.myVar)
.
Quando você define uma variável como somente leitura, ela não pode ser substituída por tarefas downstream. Defina isreadonly
como true
. Definir uma variável como somente leitura aumenta a segurança, tornando essa variável imutável.
Definir uma variável como secreta
Quando issecret
for definido como true, o valor da variável será salvo como secreto e mascarado dos logs.
Nota
O Azure Pipelines faz um esforço para mascarar segredos ao emitir dados para logs de pipeline, para que você possa ver variáveis adicionais e dados mascarados na saída e logs que não estão definidos como segredos.
Defina a variável mySecretVal
secreta .
- bash: |
echo "##vso[task.setvariable variable=mySecretVal;issecret=true]secretvalue"
Obtenha a variável mySecretVal
secreta .
- bash: |
echo "##vso[task.setvariable variable=mySecretVal;issecret=true]secretvalue"
- bash: |
echo $(mySecretVal)
Saída variável secreta em bash.
Níveis de variáveis de saída
Existem quatro tipos diferentes de variáveis de saída com sintaxes distintas:
-
Variáveis de saída definidas no mesmo trabalho sem o
isOutput
parâmetro. Para fazer referência a essas variáveis, você usará a sintaxe de macro. Exemplo:$(myVar)
. -
Variáveis de saída definidas no mesmo trabalho com o
isOutput
parâmetro. Para fazer referência a essas variáveis, você incluirá o nome da tarefa. Exemplo:$(myTask.myVar)
. -
Variáveis de saída definidas em um trabalho futuro. Para fazer referência a essas variáveis, você fará referência à
variables
variável na seção comdependency
sintaxe. -
Variáveis de saída definidas em estágios futuros. Para fazer referência a essas variáveis, você fará referência à
variables
variável na seção comstageDependencies
sintaxe.
Nota
Estágios ou trabalhos futuros só podem acessar variáveis de saída se dependerem do estágio ou do trabalho em que a variável foi definida. Para tornar uma variável de saída acessível, certifique-se de que o próximo estágio ou trabalho depende do estágio ou trabalho onde você criou a variável. Se vários estágios ou trabalhos precisarem usar a mesma variável de saída, use a dependsOn
condição para estabelecer essa dependência.
Definir uma variável de saída para uso no mesmo trabalho
Quando você usa uma variável de saída no mesmo trabalho, não é necessário usar a isOutput
propriedade. Por padrão, a variável estará disponível para etapas a jusante dentro do mesmo trabalho. No entanto, se você adicionar a isOutput
propriedade, precisará fazer referência à variável com o nome da tarefa.
O script aqui define a variável myJobVar
de saída do mesmo trabalho sem especificar isOutput
e define myOutputJobVar
com 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 obtém as mesmas variáveis myJobVar
de trabalho e myOutputJobVar
. Observe que a sintaxe muda para referenciar uma variável de saída uma vez isOutput=true
que é adicionada.
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)
Definir uma variável de saída para uso em trabalhos futuros
Ao usar variáveis de saída entre trabalhos, você fará referência a elas com dependencies
. A sintaxe para acessar uma variável de saída em um trabalho ou estágio futuro varia com base na relação entre o setter e o consumidor da variável. Saiba mais sobre cada caso em dependências.
Primeiro, defina a variável myOutputVar
de saída .
jobs:
- job: A
steps:
- bash: |
echo "##vso[task.setvariable variable=myOutputVar;isOutput=true]this is from job A"
name: passOutput
Em seguida, acesse myOutputVar
em um trabalho futuro e produza a variável como myVarFromJobA
. Para usar dependencies
o , você precisa definir a dependsOn
propriedade no trabalho futuro usando o nome do trabalho passado no qual a variável de saída foi definida.
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)
Definir uma variável de saída para uso em estágios futuros
As variáveis de saída podem ser usadas entre estágios em pipelines. Você pode usar variáveis de saída para passar informações úteis, como a ID de uma saída gerada, de um estágio para o próximo.
Ao definir uma variável com a propriedade, você pode fazer referência a isOutput
essa variável em estágios posteriores com o nome da tarefa e a stageDependencies
sintaxe. Saiba mais sobre dependências.
As variáveis de saída só estão disponíveis na próxima etapa a jusante. Se vários estágios consumirem a mesma variável de saída, use a dependsOn
condição.
Primeiro, defina a variável myStageVal
de saída .
steps:
- bash: echo "##vso[task.setvariable variable=myStageVal;isOutput=true]this is a stage output variable"
name: MyOutputVar
Em seguida, em um estágio futuro, mapeie a variável myStageVal
de saída para um estágio, trabalho ou variável de escopo de tarefa como, por exemplo, myStageAVar
. Observe que a sintaxe de mapeamento usa uma expressão $[]
de tempo de execução e rastreia o caminho de até a variável de saída usando o nome do estágio (stageDependencies
) e o nome do A
trabalho (A1
) para qualificar totalmente a variável.
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)
Caso seu valor contenha novas linhas, você pode escapar delas e o agente automaticamente cancelará a fuga:
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
FAQ
Minha variável de saída não está renderizando. O que está a correr mal?
Existem algumas razões pelas quais a variável de saída pode não aparecer.
- As variáveis de saída definidas com
isOutput
não estão disponíveis no mesmo trabalho e, em vez disso, só estão disponíveis em trabalhos a jusante. - Dependendo da sintaxe da variável usada, uma variável que define o valor de uma variável de saída pode não estar disponível em tempo de execução. Por exemplo, variáveis com sintaxe de macro (
$(var)
) são processadas antes da execução de uma tarefa. Em contraste, as variáveis com sintaxe de modelo são processadas em tempo de execução ($[variables.var]
). Normalmente, você desejará usar a sintaxe de tempo de execução ao definir variáveis de saída. Para obter mais informações sobre sintaxe de variáveis, consulte Definir variáveis. - Pode haver espaços extras na sua expressão. Se a variável não estiver renderizando, verifique se há espaços extras ao redor
isOutput=true
do .
Você pode solucionar problemas de dependencies
saída para um trabalho ou estágio de pipeline adicionando uma variável para as dependências e, em seguida, imprimindo essa variável. Por exemplo, neste trabalho A
de pipeline define a variável MyTask
de saída . O segundo emprego (B
) depende do trabalho A
. Uma nova variável contém deps
a representação JSON das dependências de trabalho. A segunda etapa em Trabalho B
usa o PowerShell para imprimir para deps
que você possa ver as dependências do trabalho.
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)"