Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Serviços de DevOps do Azure | Azure DevOps Server | Azure DevOps Server 2022
Importante
Selecione a versão deste artigo que corresponde à sua plataforma e versão. O seletor de versão está acima do índice. Procure a sua plataforma e versão do Azure DevOps.
Use expressões quando precisar de especificar um valor de string, booleano ou número ao criar um pipeline. Quando uma expressão retorna uma matriz, regras normais de indexação se aplicam e o índice começa com 0.
O uso mais comum de expressões é em condições para determinar se um trabalho ou etapa deve ser executado.
# Expressions are used to define conditions for a step, job, or stage
steps:
- task: ...
condition: <expression>
Outro uso comum de expressões é na definição de variáveis.
Pode avaliar expressões em tempo de compilação ou em tempo de execução.
Use expressões em tempo de compilação em qualquer lugar; use expressões em tempo de execução em variáveis e condições. Use expressões de tempo de execução para calcular o conteúdo das variáveis e do estado (exemplo: condition).
# Two examples of expressions used to define variables
# The first one, a, is evaluated when the YAML file is compiled into a plan.
# The second one, b, is evaluated at runtime.
# Note the syntax ${{}} for compile time and $[] for runtime expressions.
variables:
a: ${{ <expression> }}
b: $[ <expression> ]
A diferença entre as sintaxes de expressão em tempo de execução e em tempo de compilação reside principalmente no contexto disponível.
Em uma expressão em tempo de compilação (${{ <expression> }}), você tem acesso a parameters e a variables definidas estaticamente.
Em uma expressão de tempo de execução ($[ <expression> ]), você tem acesso a mais variables , mas nenhum parâmetro.
Neste exemplo, uma expressão de tempo de execução define o valor de $(isMain). Uma variável estática em uma expressão de compilação define o valor de $(compileVar).
variables:
staticVar: 'my value' # static variable
compileVar: ${{ variables.staticVar }} # compile time expression
isMain: $[eq(variables['Build.SourceBranch'], 'refs/heads/main')] # runtime expression
steps:
- script: |
echo ${{variables.staticVar}} # outputs my value
echo $(compileVar) # outputs my value
echo $(isMain) # outputs True
Uma expressão pode ser um literal, uma referência a uma variável, uma referência a uma dependência, uma função ou uma combinação aninhada válida destes tipos.
Literais
Como parte de uma expressão, é possível usar literais booleanos, nulas, numéricos, strings ou de versão.
# Examples
variables:
someBoolean: ${{ true }} # case insensitive, so True or TRUE also works
someNumber: ${{ -1.2 }}
someString: ${{ 'a b c' }}
someVersion: ${{ 1.2.3 }}
booleano
True e False são expressões literais booleanas.
Nulo
Nulo é uma expressão literal especial que é retornada de uma falha de dicionário, por exemplo (variables['noSuch']). Nulo pode ser a saída de uma expressão, mas não pode ser chamado diretamente dentro de uma expressão.
Número
Começa com '-', '.', ou '0' a '9'.
Cordão
Deve ser cotado simples. Por exemplo: 'this is a string'.
Para expressar uma única citação literal, escape-a com uma única citação.
Por exemplo: 'It''s OK if they''re using contractions.'.
Você pode usar um caractere de pipe (|) para cadeias de caracteres de várias linhas.
myKey: |
one
two
three
Versão
Um número de versão com até quatro segmentos.
Deve começar com um número e conter dois ou três caracteres de ponto (.).
Por exemplo: 1.2.3.4.
Variáveis
Como parte de uma expressão, pode aceder a variáveis usando uma de duas sintaxes:
- Sintaxe do índice:
variables['MyVar'] - Sintaxe de desreferência de propriedade:
variables.MyVar
Para usar a sintaxe de desreferência de propriedades, o nome da propriedade deve:
- Comece com
a-Zou_ - Segue-se
a-Z,0-9, ou_
Diferentes variáveis estão disponíveis dependendo do contexto de execução.
- Se você criar pipelines usando YAML, as variáveis de pipeline estarão disponíveis.
- Se você criar pipelines de compilação usando o editor clássico, as variáveis de compilação estarão disponíveis.
- Se você criar pipelines de liberação usando o editor clássico, as variáveis de liberação estarão disponíveis.
As variáveis são sempre strings. Se quiseres usar valores tipados, usa parâmetros.
Nota
Há uma limitação para o uso de variáveis com expressões para pipelines Classical e YAML ao configurar essas variáveis por meio da interface do usuário da guia variáveis. As variáveis que são definidas como expressões não devem depender de outra variável com expressão em valor, uma vez que não é garantido que ambas as expressões serão avaliadas corretamente. Por exemplo, temos variável a cujo valor $[ <expression> ] é usado como parte para o valor da variável b. Uma vez que a ordem de processamento das variáveis não é garantida, a variável b pode ter um valor incorreto de variável a após a avaliação.
Só podes usar estas construções quando configuras variáveis através da palavra-chave variáveis num pipeline YAML. Tens de colocar as variáveis na ordem em que devem ser processadas para obter os valores corretos após o processamento.
Funções
Pode usar as seguintes funções incorporadas nas expressões.
e
- Avalia para
Truese todos os parâmetros sãoTrue. - Parâmetros mínimos: 2. Parâmetros máximos: N.
- Converte parâmetros para Booleano para avaliação.
- Curto-circuito após o primeiro
False. - Exemplo:
and(eq(variables.letters, 'ABC'), eq(variables.numbers, 123))
unir
- Avalia os parâmetros por ordem (da esquerda para a direita) e devolve o primeiro valor que não é nulo nem uma cadeia vazia.
- Não retorna valor se todos os valores dos parâmetros forem nulos ou cadeias vazias.
- Parâmetros mínimos: 2. Parâmetros máximos: N.
- Exemplo:
coalesce(variables.couldBeNull, variables.couldAlsoBeNull, 'literal so it always works')
contém
- Avalia se
Truea cadeia de parâmetros à esquerda contém o parâmetro direito. - Parâmetros mínimos: 2. Parâmetros máximos: 2.
- Lança parâmetros para uma cadeia para avaliação.
- Realiza a comparação ordinal ignorar e caso.
- Exemplo:
contains('ABCDE', 'BCD')(devolve Verdadeiro).
contémValor
- Avalia
Truese o parâmetro left é uma matriz, e qualquer item é igual ao parâmetro right. Também avaliaTruese o parâmetro left é um objeto e o valor de qualquer propriedade é igual ao parâmetro right. - Parâmetros mínimos: 2. Parâmetros máximos: 2.
- Se o parâmetro esquerdo for um array, converta cada item para corresponder ao tipo do parâmetro direito. Se o parâmetro esquerdo for um objeto, converta o valor de cada propriedade para se adaptar ao tipo do parâmetro direito. A comparação de igualdade para cada item específico avalia
Falsese a conversão falha. - Comparação ordinal ignorando maiúsculas para cadeias de caracteres.
- Curto-circuitos após a primeira partida
Nota
Não há sintaxe literal em um pipeline YAML para especificar uma matriz. Esta função é de uso limitado em pipelines gerais. Destina-se ao uso no contexto do decorador de pipeline com matrizes fornecidas pelo sistema, como a lista de etapas.
Você pode usar a containsValue expressão para encontrar um valor correspondente em um objeto. Este é um exemplo que demonstra procurar na lista de ramificações de origem uma correspondência para Build.SourceBranch.
parameters:
- name: branchOptions
displayName: Source branch options
type: object
default:
- refs/heads/main
- refs/heads/test
jobs:
- job: A1
steps:
- ${{ each value in parameters.branchOptions }}:
- script: echo ${{ value }}
- job: B1
condition: ${{ containsValue(parameters.branchOptions, variables['Build.SourceBranch']) }}
steps:
- script: echo "Matching branch found"
convertToJson
- Pegue um objeto complexo e produza-o como JSON.
- Parâmetros mínimos: 1. Parâmetros máximos: 1.
parameters:
- name: listOfValues
type: object
default:
this_is:
a_complex: object
with:
- one
- two
steps:
- script: |
echo "${MY_JSON}"
env:
MY_JSON: ${{ convertToJson(parameters.listOfValues) }}
Saída do script:
{
"this_is": {
"a_complex": "object",
"with": [
"one",
"two"
]
}
}
contador
- Use esta função apenas numa expressão que defina uma variável. Não a uses como parte de uma condição para um passo, trabalho ou etapa.
- Avalia um número que é incrementado a cada execução de um pipeline.
- Toma dois parâmetros:
prefixeseed. -
prefixé uma expressão de cadeia. A função acompanha um valor de contador separado para cadaprefixúnico. Use caracteres UTF-16 noprefix. -
seedé o valor inicial do contador.
Pode criar um contador que é incrementado automaticamente por um cada vez que o seu pipeline é executado. Quando defines um contador, fornece um prefix e um seed. O exemplo seguinte demonstra este conceito.
variables:
major: 1
# define minor as a counter with the prefix as variable major, and seed as 100.
minor: $[counter(variables['major'], 100)]
steps:
- bash: echo $(minor)
O valor de minor no exemplo anterior é 100 durante a primeira execução do pipeline. Na segunda sequência, o valor é 101, desde que o valor de major permaneça 1.
Se editar o ficheiro YAML e atualizar o valor da variável major para 2, o valor de minor é 100 na próxima execução do pipeline. As corridas seguintes incrementam o contador para 101, 102, 103, e assim sucessivamente.
Se mais tarde editar o ficheiro YAML e definir novamente o valor de major para 1, o valor do contador retoma onde ficou para esse prefixo. Neste exemplo, retoma-se em 102.
O exemplo seguinte mostra como definir uma variável para funcionar como contador que começa em 100, incrementa 1 para cada corrida e reinicia para 100 todos os dias.
Nota
pipeline.startTime não está disponível fora das expressões.
pipeline.startTime formata system.pipelineStartTime num objeto de data e hora para que as expressões possam usá-lo.
O fuso horário padrão para pipeline.startTime é UTC.
Pode alterar o fuso horário da sua organização.
jobs:
- job:
variables:
a: $[counter(format('{0:yyyyMMdd}', pipeline.startTime), 100)]
steps:
- bash: echo $(a)
O exemplo seguinte mostra um contador que mantém um valor separado para PRs e execuções de CI.
variables:
patch: $[counter(variables['build.reason'], 0)]
Os contadores estão limitados a um pipeline. Ou seja, o pipeline incrementa o valor do contador para cada execução. Nenhum contador é definido pelo âmbito do projeto.
termina com
- Avalia se a String do parâmetro esquerdo termina com o parâmetro direito
- Parâmetros mínimos: 2. Parâmetros máximos: 2.
- Lança parâmetros para uma cadeia para avaliação.
- Realiza a comparação ordinal ignorar e caso.
- Exemplo:
endsWith('ABCDE', 'DE')(retorna True)
equação
- Avalia se os
Trueparâmetros são iguais - Parâmetros mínimos: 2. Parâmetros máximos: 2.
- Converte o parâmetro direito para corresponder ao tipo de parâmetro esquerdo. Retorna
Falsese a conversão falhar. - Comparação ordinal ignorar diferenciação de maiúsculas e minúsculas para strings.
- Exemplo:
eq(variables.letters, 'ABC')
formato
- Avalia os parâmetros à direita e insere-os na string de parâmetro principal
- Parâmetros mínimos: 1. Parâmetros máximos: N
- Exemplo:
format('Hello {0} {1}', 'John', 'Doe') - Usa especificadores de formato de data e hora personalizados do .NET para formatação de data (
yyyy,yy,MM,M,dd,dHHHmmmsssfffffffK) - Exemplo:
format('{0:yyyyMMdd}', pipeline.startTime). Neste casopipeline.startTime, é uma variável de objeto de data e hora especial. - Fuja dobrando chaves. Por exemplo:
format('literal left brace {{ and literal right brace }}')
GE
- Avalia
Truese o parâmetro esquerdo é maior ou igual ao parâmetro direito - Parâmetros mínimos: 2. Parâmetros máximos: 2.
- Converte o parâmetro direito para corresponder ao tipo de parâmetro esquerdo. Erros se a conversão falhar.
- Comparação ordinal ignorar maiúsculas para cadeias de caracteres.
- Exemplo:
ge(5, 5)(retorna True)
GT
- Avalia
Truese o parâmetro esquerdo é maior que o parâmetro direito - Parâmetros mínimos: 2. Parâmetros máximos: 2.
- Converte o parâmetro direito para corresponder ao tipo de parâmetro esquerdo. Erros se a conversão falhar.
- Comparação ordinal ignorando maiúsculas e minúsculas para cadeias.
- Exemplo:
gt(5, 2)(retorna True)
em
- Avalia se o
Trueparâmetro esquerdo é igual a qualquer parâmetro direito - Parâmetros mínimos: 1. Parâmetros máximos: N
- Converte parâmetros à direita para corresponder ao tipo de parâmetro esquerdo. A comparação de igualdade avalia se a
Falseconversão falhar. - Comparação ordinal sem diferenciar maiúsculas de minúsculas para cadeias de caracteres.
- Curto-circuitos após o primeiro jogo
- Exemplo:
in('B', 'A', 'B', 'C')(retorna True)
IFI
- Retorna o segundo parâmetro se o primeiro parâmetro for avaliado como
True, e o terceiro parâmetro caso contrário - Parâmetros mínimos: 1. Parâmetros máximos: 3
- O primeiro parâmetro deve ser uma condição
- Exemplo:
iif(eq(variables['Build.Reason'], 'PullRequest'), 'ManagedDevOpsPool', 'Azure Pipelines')retorna 'ManagedDevOpsPool' quando o pipeline é executado em resposta a um Pull Request (PR).
aderir
- Concatena todos os elementos na matriz de parâmetros direita, separados pela cadeia de caracteres de parâmetro esquerda.
- Parâmetros mínimos: 2. Parâmetros máximos: 2.
- Cada elemento na matriz é convertido em uma cadeia de caracteres. Objetos complexos são convertidos em cadeia de caracteres vazia.
- Se o parâmetro certo não for uma matriz, o resultado será o parâmetro certo convertido em uma cadeia de caracteres.
Neste exemplo, um ponto-e-vírgula é adicionado entre cada item na matriz. O tipo de parâmetro é um objeto.
parameters:
- name: myArray
type: object
default:
- FOO
- BAR
- ZOO
variables:
A: ${{ join(';',parameters.myArray) }}
steps:
- script: echo $A # outputs FOO;BAR;ZOO
le
- Avalia
Truese o parâmetro esquerdo é menor ou igual ao parâmetro direito - Parâmetros mínimos: 2. Parâmetros máximos: 2.
- Converte o parâmetro direito para corresponder ao tipo de parâmetro esquerdo. Erros se a conversão falhar.
- Comparação ordinal sem diferenciar maiúsculas de minúsculas para cadeias.
- Exemplo:
le(2, 2)(retorna True)
comprimento
- Retorna o comprimento de uma cadeia de caracteres ou de uma matriz, seja uma que vem do sistema ou que vem de um parâmetro
- Parâmetros mínimos: 1. Parâmetros máximos: 1.
- Exemplo:
length('fabrikam')retorna 8.
mais baixo
- Converte uma cadeia ou valor variável para todos os caracteres minúsculos.
- Parâmetros mínimos: 1. Parâmetros máximos: 1.
- Retorna a versão em minúsculas de uma cadeia de caracteres.
- Exemplo:
lower('FOO')devolvefoo.
litro
- Avalia
Truese o parâmetro esquerdo é menor que o parâmetro direito. - Parâmetros mínimos: 2. Parâmetros máximos: 2.
- Converte o parâmetro direito para corresponder ao tipo de parâmetro esquerdo. Erros se a conversão falhar.
- Comparação ordinal sem distinção entre maiúsculas e minúsculas para cadeias.
- Exemplo:
lt(2, 5)(retorna True)
NE
- Avalia se os
Trueparâmetros não são iguais - Parâmetros mínimos: 2. Parâmetros máximos: 2.
- Converte o parâmetro direito para corresponder ao tipo de parâmetro esquerdo. Retorna
Truese a conversão falhar. - Comparação ordinal sem distinguir maiúsculas de minúsculas para strings.
- Exemplo:
ne(1, 2)devolveTrue.
não
- Avalia se o
Trueparâmetro éFalse - Parâmetros mínimos: 1. Parâmetros máximos: 1
- Converte valor em booleano para avaliação
- Exemplo:
not(eq(1, 2))(retorna True)
nãoEm
- Avalia
Truese o parâmetro left não é igual a nenhum parâmetro right - Parâmetros mínimos: 1. Parâmetros máximos: N
- Converte parâmetros à direita para corresponder ao tipo de parâmetro esquerdo. A comparação de igualdade avalia se a
Falseconversão falhar. - Comparação ordinal ignorando maiúsculas para cadeias de caracteres.
- Curto-circuitos após o primeiro jogo
- Exemplo:
notIn('D', 'A', 'B', 'C')(retorna True)
ou
- Avalia
Truese algum parâmetro éTrue - Parâmetros mínimos: 2. Parâmetros máximos: N.
- Converte parâmetros para Booleano para avaliação.
- Curto-circuitos após o primeiro
True - Exemplo:
or(eq(1, 1), eq(2, 3))(retorna True, curto-circuitos)
substituir
- Devolve uma nova cadeia em que todas as instâncias de uma cadeia na instância atual são substituídas por outra cadeia.
- Parâmetros mínimos: 3. Parâmetros máximos: 3.
-
replace(a, b, c): devolvea, com todas as instâncias debsubstituídas porc. - Exemplo:
replace('https://www.tinfoilsecurity.com/saml/consume','https://www.tinfoilsecurity.com','http://server')(devolvehttp://server/saml/consume).
dividir
- Divide uma cadeia em subcadeias com base nos caracteres delimitadores especificados.
- Parâmetros mínimos: 2. Parâmetros máximos: 2.
- O primeiro parâmetro é a cadeia a dividir.
- O segundo parâmetro são os caracteres delimitadores.
- Retorna uma matriz de substrings. O array inclui cadeias vazias quando os caracteres delimitadores aparecem consecutivamente ou no final da cadeia.
- Exemplo:
variables: - name: environments value: prod1,prod2 steps: - ${{ each env in split(variables.environments, ',')}}: - script: ./deploy.sh --environment ${{ env }} - Exemplo de utilização de split() com replace():
parameters: - name: resourceIds type: object default: - /subscriptions/mysubscription/resourceGroups/myResourceGroup/providers/Microsoft.Network/loadBalancers/kubernetes-internal - /subscriptions/mysubscription02/resourceGroups/myResourceGroup02/providers/Microsoft.Network/loadBalancers/kubernetes - name: environments type: object default: - prod1 - prod2 trigger: - main steps: - ${{ each env in parameters.environments }}: - ${{ each resourceId in parameters.resourceIds }}: - script: echo ${{ replace(split(resourceId, '/')[8], '-', '_') }}_${{ env }}
começaCom
- Avalia se a
Truecadeia de caracteres do parâmetro esquerdo começa com o parâmetro direito - Parâmetros mínimos: 2. Parâmetros máximos: 2.
- Lança parâmetros para uma cadeia para avaliação.
- Realiza a comparação ordinal ignorar e caso.
- Exemplo:
startsWith('ABCDE', 'AB')(devolve Verdadeiro).
cortar
- Retorna o parâmetro sem espaços em branco à esquerda e à direita
- Parâmetros mínimos: 1. Parâmetros máximos: 1
- Exemplo:
trim(' variable ')retorna 'variável'
superior
- Converte uma cadeia de caracteres ou um valor de variável em todos os caracteres maiúsculos
- Parâmetros mínimos: 1. Parâmetros máximos: 1.
- Devolve o equivalente em maiúsculas de uma cadeia de caracteres
- Exemplo:
upper('bah')retornaBAH
XOR
- Avalia
Truese exatamente um parâmetro éTrue - Parâmetros mínimos: 2. Parâmetros máximos: 2.
- Converte parâmetros para Booleano para avaliação.
- Exemplo:
xor(True, False)(retorna True)
Funções de verificação do status do trabalho
Use as seguintes funções de verificação de estado como expressões em condições, mas não em definições de variáveis.
sempre
- Sempre avalia para
True(mesmo quando cancelado). Nota: Uma falha crítica pode ainda impedir a execução de uma tarefa. Por exemplo, se não foi possível obter fontes.
Cancelado
- Avalia se
Trueo pipeline foi cancelado.
com falhas
- Para uma etapa, equivalente a
eq(variables['Agent.JobStatus'], 'Failed'). - Para um emprego:
- Sem argumentos, resulta em
Truese algum trabalho anterior no grafo de dependência falhou. - Com os nomes das tarefas como argumentos, avalia-se para
Truese alguma dessas tarefas falhou.
- Sem argumentos, resulta em
bem-sucedido
- Para uma etapa, equivalente a
in(variables['Agent.JobStatus'], 'Succeeded', 'SucceededWithIssues'). - Usa com
dependsOnquando trabalhas com empregos e queres verificar se um emprego anterior foi bem-sucedido. Os trabalhos correm em paralelo, enquanto os estágios correm sequencialmente. - Para um emprego:
- Sem argumentos, avalia para
Truese todos os trabalhos anteriores no grafo de dependência tiveram sucesso ou tiveram sucesso parcial. - Com nomes de trabalho como argumentos, avalia se todos esses trabalhos foram bem-sucedidos
Trueou parcialmente bem-sucedidos. - Avalia se
Falseo pipeline foi cancelado.
- Sem argumentos, avalia para
sucessoOuFalha
Para uma etapa, equivalente a
in(variables['Agent.JobStatus'], 'Succeeded', 'SucceededWithIssues', 'Failed').Para um emprego:
- Sem argumentos, avalia para
Trueindependentemente se algum trabalho no gráfico de dependência foi bem-sucedido ou falhou. - Com nomes de cargos como argumentos, avalia
Truese algum desses trabalhos teve sucesso ou fracasso. - Podes querer usar
not(canceled())em vez disso quando os trabalhos anteriores no grafo de dependências forem saltados.
Esta função é semelhante a
always(), exceto que se avalia paraFalsequando o pipeline é cancelado.- Sem argumentos, avalia para
Inserção condicional
Use if, elseif, e else cláusulas para atribuir condicionalmente valores de variáveis ou definir entradas para tarefas. Você também pode executar condicionalmente uma etapa quando uma condição for atendida.
Os condicionais só funcionam quando usas sintaxe de modelos. Para mais informações, consulte a sintaxe das variáveis.
Para modelos, você pode usar a inserção condicional ao adicionar uma sequência ou mapeamento. Para mais informações, veja inserção condicional nos modelos.
Atribuir condicionalmente uma variável
variables:
${{ if eq(variables['Build.SourceBranchName'], 'main') }}: # only works if you have a main branch
stageName: prod
pool:
vmImage: 'ubuntu-latest'
steps:
- script: echo ${{variables.stageName}}
Definir condicionalmente uma entrada de tarefa
pool:
vmImage: 'ubuntu-latest'
steps:
- task: PublishPipelineArtifact@1
inputs:
targetPath: '$(Pipeline.Workspace)'
${{ if eq(variables['Build.SourceBranchName'], 'main') }}:
artifact: 'prod'
${{ else }}:
artifact: 'dev'
publishLocation: 'pipeline'
Executar condicionalmente uma etapa
Se não houver um conjunto de variáveis ou se o valor de foo não corresponder às if condições, a else instrução será executada. Neste exemplo, o valor de foo retorna verdadeiro na elseif condição.
variables:
- name: foo
value: contoso # triggers elseif condition
pool:
vmImage: 'ubuntu-latest'
steps:
- script: echo "start"
- ${{ if eq(variables.foo, 'adaptum') }}:
- script: echo "this is adaptum"
- ${{ elseif eq(variables.foo, 'contoso') }}: # true
- script: echo "this is contoso"
- ${{ else }}:
- script: echo "the value is not adaptum or contoso"
Cada palavra-chave
Use a each palavra-chave para percorrer parâmetros com o tipo de objeto.
parameters:
- name: listOfStrings
type: object
default:
- one
- two
steps:
- ${{ each value in parameters.listOfStrings }}:
- script: echo ${{ value }}
Também podes iterar por elementos aninhados num objeto.
parameters:
- name: listOfFruits
type: object
default:
- fruitName: 'apple'
colors: ['red','green']
- fruitName: 'lemon'
colors: ['yellow']
steps:
- ${{ each fruit in parameters.listOfFruits }} :
- ${{ each fruitColor in fruit.colors}} :
- script: echo ${{ fruit.fruitName}} ${{ fruitColor }}
Dependências
As expressões podem usar o contexto de dependências para fazer referência a trabalhos ou estágios anteriores. Usar dependências para:
- Fazer referência ao status do trabalho de um trabalho anterior
- Fazer referência ao estado de uma fase anterior
- Variáveis de saída de referência no trabalho anterior no mesmo estágio
- Variáveis de saída de referência na etapa anterior de um estágio
- Referenciar variáveis de saída num trabalho num estágio anterior no estágio seguinte.
O contexto é chamado dependencies para tarefas e estágios e funciona de forma semelhante a variáveis.
Se te referires a uma variável de saída de um trabalho noutro estágio, o contexto será denominado stageDependencies.
Se tiver problemas com variáveis de saída que têm caracteres de aspas (' ou ") nelas, consulte este guia de resolução de problemas.
Visão geral da sintaxe de dependência
A sintaxe de referenciação de variáveis de saída com dependências varia dependendo das circunstâncias. Aqui está uma visão geral dos cenários mais comuns. Pode haver momentos em que a sintaxe alternativa também funcione.
Tipo
Descrição
dependência de estágio para estágio (diferentes estágios)
Fazer referência a uma variável de saída de uma etapa anterior num trabalho numa etapa diferente numa condição em stages.
- Sintaxe:
and(succeeded(), eq(stageDependencies.<stage-name>.outputs['<job-name>.<step-name>.<variable-name>'], 'true')) - Exemplo:
and(succeeded(), eq(stageDependencies.A.outputs['A1.printvar.shouldrun'], 'true'))
dependência entre tarefas (mesmo estágio)
Faça referência a uma variável de saída em um trabalho diferente no mesmo estágio em stages.
- Sintaxe:
and(succeeded(), eq(dependencies.<job-name>.outputs['<step-name>.<variable-name>'], 'true')) - Exemplo:
and(succeeded(), eq(dependencies.A.outputs['printvar.shouldrun'], 'true'))
Dependência de tarefa para etapa (diferentes estágios)
Referenciar uma variável output num estágio diferente em um job.
- Sintaxe:
eq(stageDependencies.<stage-name>.<job-name>.outputs['<step-name>.<variable-name>'], 'true') - Exemplo:
eq(stageDependencies.A.A1.outputs['printvar.shouldrun'], 'true')
Dependência entre estágios (trabalho de implantação)
Variável de saída de referência numa tarefa de implementação numa fase diferente no stages.
- Sintaxe:
eq(dependencies.<stage-name>.outputs['<deployment-job-name>.<deployment-job-name>.<step-name>.<variable-name>'], 'true') - Exemplo:
eq(dependencies.build.outputs['build_job.build_job.setRunTests.runTests'], 'true')
Dependência de estágio a estágio (trabalho de implantação com recurso)
Faça referência a uma variável de saída em um trabalho de implantação que inclua um recurso em estágio diferente no stages.
- Sintaxe:
eq(dependencies.<stage-name>.outputs['<deployment-job-name>.<Deploy_resource-name>.<step-name>.<variable-name>'], 'true') - Exemplo:
eq(dependencies.build.outputs['build_job.Deploy_winVM.setRunTests.runTests'], 'true')
A sintaxe das variáveis de saída em tarefas de implementação varia consoante a estratégia de implementação. Para obter mais informações, consulte Trabalhos de implantação.
Dependências de estágio a estágio
Estruturalmente, o dependencies objeto é um mapa de nomes de trabalho e estágio para results e outputs.
Expresso como JSON, assemelha-se a:
"dependencies": {
"<STAGE_NAME>" : {
"result": "Succeeded|SucceededWithIssues|Skipped|Failed|Canceled",
"outputs": {
"jobName.stepName.variableName": "value"
}
},
"...": {
// another stage
}
}
Nota
Os exemplos a seguir usam sintaxe de pipeline padrão. Se estiveres a usar pipelines de implementação, a sintaxe para variáveis e variáveis condicionais diferem. Para obter informações sobre a sintaxe específica a ser usada, consulte Trabalhos de implantação.
Use esta forma de dependencies para mapear variáveis ou verificar condições a um nível de estágio.
Neste exemplo, existem dois estágios, A e B. O Estágio A tem a condição false e não corre. O estágio B é executado se o resultado do estágio A for Succeeded, SucceededWithIssues, ou Skipped. A etapa B ocorre porque a etapa A foi ignorada.
stages:
- stage: A
condition: false
jobs:
- job: A1
steps:
- script: echo Job A1
- stage: B
condition: in(dependencies.A.result, 'Succeeded', 'SucceededWithIssues', 'Skipped')
jobs:
- job: B1
steps:
- script: echo Job B1
Os estágios também podem usar variáveis de saída de outro estágio.
Neste exemplo, existem dois estágios. O estágio A inclui um trabalho, A1, que define uma variável shouldrun de saída como true. O estágio B é executado quando shouldrun é true. Porque shouldrun é true, executa-se o Estágio B.
stages:
- stage: A
jobs:
- job: A1
steps:
- bash: echo "##vso[task.setvariable variable=shouldrun;isOutput=true]true"
# or on Windows:
# - script: echo ##vso[task.setvariable variable=shouldrun;isOutput=true]true
name: printvar
- stage: B
condition: and(succeeded(), eq(dependencies.A.outputs['A1.printvar.shouldrun'], 'true'))
dependsOn: A
jobs:
- job: B1
steps:
- script: echo hello from Stage B
Nota
Por padrão, cada estágio em um pipeline depende daquele imediatamente anterior no arquivo YAML.
Se você precisar se referir a um estágio que não seja imediatamente anterior ao atual, poderá substituir esse padrão automático adicionando uma dependsOn seção ao estágio.
Dependências de tarefa para tarefa em uma fase
No nível de trabalho dentro de um único estágio, os dependencies dados não contêm informações de nível de estágio.
"dependencies": {
"<JOB_NAME>": {
"result": "Succeeded|SucceededWithIssues|Skipped|Failed|Canceled",
"outputs": {
"stepName.variableName": "value1"
}
},
"...": {
// another job
}
}
Neste exemplo, há três trabalhos (a, b e c). A tarefa a é sempre ignorada por causa de condition: false.
O trabalho b executa-se porque não tem condições associadas.
O trabalho c é executado porque todas as suas dependências são bem-sucedidas (trabalho b) ou foram ignoradas (trabalho a).
jobs:
- job: a
condition: false
steps:
- script: echo Job a
- job: b
steps:
- script: echo Job b
- job: c
dependsOn:
- a
- b
condition: |
and
(
in(dependencies.a.result, 'Succeeded', 'SucceededWithIssues', 'Skipped'),
in(dependencies.b.result, 'Succeeded', 'SucceededWithIssues', 'Skipped')
)
steps:
- script: echo Job c
Neste exemplo, o trabalho B depende de uma variável de saída do trabalho A.
jobs:
- job: A
steps:
- bash: echo "##vso[task.setvariable variable=shouldrun;isOutput=true]true"
# or on Windows:
# - script: echo ##vso[task.setvariable variable=shouldrun;isOutput=true]true
name: printvar
- job: B
condition: and(succeeded(), eq(dependencies.A.outputs['printvar.shouldrun'], 'true'))
dependsOn: A
steps:
- script: echo hello from B
Dependências de tarefa para tarefa entre estágios
No nível do trabalho, você também pode fazer referência aos resultados de um trabalho em um estágio anterior.
Para isso, é necessário usar o stageDependencies contexto.
"stageDependencies": {
"<STAGE_NAME>" : {
"<JOB_NAME>": {
"result": "Succeeded|SucceededWithIssues|Skipped|Failed|Canceled",
"outputs": {
"stepName.variableName": "value"
}
},
"...": {
// another job
}
},
"...": {
// another stage
}
}
Neste exemplo, o trabalho B1 é executado caso o trabalho A1 seja ignorado. O trabalho B2 verifica o valor da variável de saída do trabalho A1 para determinar se ele deve ser executado.
stages:
- stage: A
jobs:
- job: A1
steps:
- bash: echo "##vso[task.setvariable variable=shouldrun;isOutput=true]true"
# or on Windows:
# - script: echo ##vso[task.setvariable variable=shouldrun;isOutput=true]true
name: printvar
- stage: B
dependsOn: A
jobs:
- job: B1
condition: in(stageDependencies.A.A1.result, 'Skipped') # change condition to `Succeeded and stage will be skipped`
steps:
- script: echo hello from Job B1
- job: B2
condition: eq(stageDependencies.A.A1.outputs['printvar.shouldrun'], 'true')
steps:
- script: echo hello from Job B2
Se um trabalho depender de uma variável definida por um trabalho de implantação em um estágio diferente, a sintaxe será diferente. No exemplo a seguir, o trabalho run_tests será executado se o trabalho de implantação build_job estiver configurado runTests para true. Observe que a chave usada para o outputs dicionário é build_job.setRunTests.runTests.
stages:
- stage: build
jobs:
- deployment: build_job
environment:
name: Production
strategy:
runOnce:
deploy:
steps:
- task: PowerShell@2
name: setRunTests
inputs:
targetType: inline
pwsh: true
script: |
$runTests = "true"
echo "setting runTests: $runTests"
echo "##vso[task.setvariable variable=runTests;isOutput=true]$runTests"
- stage: test
dependsOn:
- 'build'
jobs:
- job: run_tests
condition: eq(stageDependencies.build.build_job.outputs['build_job.setRunTests.runTests'], 'true')
steps:
...
Variáveis de saída do trabalho de implantação
Se um estágio depende de uma variável definida por um trabalho de implantação em um estágio diferente, a sintaxe é diferente. No exemplo a seguir, o estágio test depende da configuração build_job de implantação shouldTest como true. Repare que na condition da etapa test, build_job aparece duas vezes.
stages:
- stage: build
jobs:
- deployment: build_job
environment:
name: Production
strategy:
runOnce:
deploy:
steps:
- task: PowerShell@2
name: setRunTests
inputs:
targetType: inline
pwsh: true
script: |
$runTests = "true"
echo "setting runTests: $runTests"
echo "##vso[task.setvariable variable=runTests;isOutput=true]$runTests"
- stage: test
dependsOn:
- 'build'
condition: eq(dependencies.build.outputs['build_job.build_job.setRunTests.runTests'], 'true')
jobs:
- job: A
steps:
- script: echo Hello from job A
No exemplo acima, a condição faz referência a um ambiente e não a um recurso ambiental. Para fazer referência a um recurso de ambiente, você precisará adicionar o nome do recurso de ambiente à condição de dependências. No exemplo a seguir, a condição faz referência a um recurso de máquina virtual de ambiente chamado vmtest.
stages:
- stage: build
jobs:
- deployment: build_job
environment:
name: vmtest
resourceName: winVM2
resourceType: VirtualMachine
strategy:
runOnce:
deploy:
steps:
- task: PowerShell@2
name: setRunTests
inputs:
targetType: inline
pwsh: true
script: |
$runTests = "true"
echo "setting runTests: $runTests"
echo "##vso[task.setvariable variable=runTests;isOutput=true]$runTests"
- stage: test
dependsOn:
- 'build'
condition: eq(dependencies.build.outputs['build_job.Deploy_winVM2.setRunTests.runTests'], 'true')
jobs:
- job: A
steps:
- script: echo Hello from job A
Matrizes filtradas
Quando trabalhas com uma coleção de itens, usa a * sintaxe para aplicar um array filtrado. Um array filtrado devolve todos os objetos ou elementos independentemente dos seus nomes.
Por exemplo, considere um array de objetos chamados foo. Queres obter um array dos valores da id propriedade em cada objeto do teu array.
[
{ "id": 1, "a": "avalue1"},
{ "id": 2, "a": "avalue2"},
{ "id": 3, "a": "avalue3"}
]
Use a seguinte expressão:
foo.*.id
Esta expressão diz ao sistema para tratar foo como um array filtrado e depois selecionar a propriedade id de cada objeto.
Esta expressão retorna:
[ 1, 2, 3 ]
Tipo de fundição
Os valores numa expressão podem ser convertidos de um tipo para outro à medida que a expressão é avaliada. Quando avalias uma expressão, o processo converte parâmetros para o tipo de dado relevante e depois volta a transformá-los em cadeias de caracteres.
Por exemplo, neste YAML, os valores True e False convertem-se em 1 e 0 quando a expressão é avaliada.
A função lt() retorna True quando o parâmetro left é menor que o parâmetro right.
variables:
firstEval: $[lt(False, True)] # 0 vs. 1, True
secondEval: $[lt(True, False)] # 1 vs. 0, False
steps:
- script: echo $(firstEval)
- script: echo $(secondEval)
Quando você usa a expressão para avaliar a equivalência, os eq() valores são implicitamente convertidos em números (false para 0 e true para 1).
variables:
trueAsNumber: $[eq('true', true)] # 1 vs. 1, True
falseAsNumber: $[eq('false', true)] # 0 vs. 1, False
steps:
- script: echo $(trueAsNumber)
- script: echo $(falseAsNumber)
Neste próximo exemplo, os valores variables.emptyString e a cadeia de caracteres vazia são avaliados como cadeias de caracteres vazias.
A função coalesce() avalia os parâmetros por ordem e devolve o primeiro valor que não é nulo ou uma cadeia vazia.
variables:
coalesceLiteral: $[coalesce(variables.emptyString, '', 'literal value')]
steps:
- script: echo $(coalesceLiteral) # outputs literal value
As regras de conversão detalhadas são listadas mais abaixo.
| De / Para | booleano | Nulo | Número | Cordão | Versão |
|---|---|---|---|---|---|
| Booleano | - | - | Sim | Sim | - |
| Nulo | Sim | - | Sim | Sim | - |
| Número | Sim | - | - | Sim | Parcial |
| Cadeia | Sim | Parcial | Parcial | - | Parcial |
| Versão | Sim | - | - | Sim | - |
booleano
Para numerar:
-
False→0 -
True→1
Para cadeia de caracteres:
-
False→'False' -
True→'True'
Nulo
- Para Booleano:
False - Para numerar:
0 - Para string:
''(a cadeia de caracteres vazia)
Número
- Para Booleano:
0→False, qualquer outro número →True - Para versão: Deve ser maior que zero e deve conter um decimal diferente de zero. Deve ser menor que Int32.MaxValue (componente decimal também).
- Para string: Converte o número em uma string sem separador de milhares e sem separador decimal.
Cordão
- Para Booleano:
''(a cadeia vazia) →False, qualquer outra cadeia →True - Para null:
''(a string vazia) →Null, qualquer outra string não conversível - Para numerar:
''(a cadeia vazia) → 0, caso contrário, executa oInt32.TryParsedo C# usando InvariantCulture e as seguintes regras: AllowDecimalPoint | AllowLeadingSign | AllowLeadingWhite | AllowThousands | AllowTrailingWhite. SeTryParsefalhar, então não é conversível. - Para a versão: executa C#
Version.TryParse. Deve conter componentes principais e secundários no mínimo. SeTryParsefalhar, então não é conversível.
Versão
- Para Booleano:
True - Para string: Major.Minor ou Major.Minor.Build ou Major.Minor.Build.Revision.
FAQ
Quero fazer algo que as expressões não consigam suportar. Que opções tenho para estender a funcionalidade de Pipelines?
Pode personalizar o seu pipeline usando um script que inclua uma expressão. Por exemplo, este excerto pega na BUILD_BUILDNUMBER variável e divide-a usando Bash. Este script produz duas novas variáveis $MAJOR_RUN e $MINOR_RUN, para os números de execução principais e secundários.
As duas variáveis são então usadas para criar duas variáveis de pipeline, $major e $minor usando a variável task.set. Essas variáveis estão disponíveis para etapas subsequentes. Para compartilhar variáveis entre pipelines, consulte Grupos de variáveis.
steps:
- bash: |
MAJOR_RUN=$(echo $BUILD_BUILDNUMBER | cut -d '.' -f1)
echo "This is the major run number: $MAJOR_RUN"
echo "##vso[task.setvariable variable=major]$MAJOR_RUN"
MINOR_RUN=$(echo $BUILD_BUILDNUMBER | cut -d '.' -f2)
echo "This is the minor run number: $MINOR_RUN"
echo "##vso[task.setvariable variable=minor]$MINOR_RUN"
- bash: echo "My pipeline variable for major run is $(major)"
- bash: echo "My pipeline variable for minor run is $(minor)"