Compartilhar via


Expressões

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

Importante

Selecione uma versão do seletor de Versão de Conteúdo do Azure DevOps.

Selecione a versão deste artigo que corresponde à sua plataforma e versão. O seletor de versão está acima do índice. pesquise sua plataforma e versão do Azure DevOps.

Use expressões quando precisar especificar um valor de cadeia de caracteres, booliano ou número durante a criação de um pipeline. Quando uma expressão retorna uma matriz, regras de indexação normais são aplicáveis, e o índice começa com 0.

O uso mais comum de expressões está 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. Você pode avaliar expressões em tempo de compilação ou em tempo de execução. Use expressões de tempo de compilação em qualquer lugar; use expressões de runtime em variáveis e condições. Use expressões de runtime para calcular o conteúdo de variáveis e 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 de tempo de compilação e de runtime é principalmente o contexto disponível. Em uma expressão de tempo de compilação (${{ <expression> }}), você tem acesso a parameters e definiu variables estaticamente. Em uma expressão de runtime ($[ <expression> ]), você tem acesso a mais variables, mas sem parâmetros.

Neste exemplo, uma expressão de runtime 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 desses tipos.

Literais

Como parte de uma expressão, você pode usar literais boolianos, nulos, numéricos, de cadeia de caracteres 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 boolianas.

Nulo

Nulo é uma expressão literal especial que é retornada de um erro 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'.

fio

Deve estar entre aspas simples. Por exemplo: 'this is a string'.

Para expressar uma aspa única literal, escape-a com uma aspa única. 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 período (.). Por exemplo: 1.2.3.4.

Variáveis

Como parte de uma expressão, você pode acessar variáveis usando uma das duas sintaxes:

  • Sintaxe de índice: variables['MyVar']
  • Sintaxe de desreferência de propriedade: variables.MyVar

Para usar a sintaxe de desreferência de propriedade, o nome da propriedade deve:

  • Começar com a-Z ou _
  • Ser seguido por a-Z, 0-9, ou _

Variáveis diferentes estão disponíveis dependendo do contexto de execução.

As variáveis são sempre cadeias de caracteres. Caso deseje usar valores tipados, use parâmetros.

Observação

Há uma limitação para usar variáveis com expressões para pipelines Clássico e YAML, ao configurar essas variáveis usando a interface do usuário da guia de variáveis. As variáveis definidas como expressões não devem depender de outra variável com expressão em valor, pois não é garantido que ambas as expressões serão avaliadas corretamente. Por exemplo, temos uma variável a cujo valor $[ <expression> ] é usado como parte para o valor da variável b. Como a ordem das variáveis de processamento não é garantida, a variável b pode ter um valor incorreto da variável a após a avaliação.

Você só pode usar essas construções ao configurar variáveis por meio da palavra-chave variáveis em um pipeline YAML. Você precisa colocar as variáveis na ordem em que elas devem ser processadas para obter os valores corretos após o processamento.

Functions

Você pode usar as seguintes funções internas em expressões.

e

  • Resulta em True se todos os parâmetros forem True.
  • Parâmetros mínimos: 2. Parâmetros máximos: N.
  • Converte parâmetros em Boolean para avaliação.
  • Curtos-circuitos após o primeiro False.
  • Exemplo: and(eq(variables.letters, 'ABC'), eq(variables.numbers, 123))

unir

  • Avalia os parâmetros em ordem (da esquerda para a direita) e retorna o primeiro valor que não é nulo ou uma cadeia de caracteres vazia.
  • Não retornará nenhum valor se todos os valores de parâmetro forem cadeias de caracteres nulas ou 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 a True cadeia de caracteres do parâmetro esquerdo contém o parâmetro direito.
  • Parâmetros mínimos: 2. Parâmetros máximos: 2.
  • Converte parâmetros em cadeia de caracteres para avaliação.
  • Executa uma comparação ordinal que ignora maiúsculas e minúsculas.
  • Exemplo: contains('ABCDE', 'BCD') (retorna True).

contémValor

  • Avalia True, se o parâmetro à esquerda for uma matriz e qualquer item for igual ao parâmetro à direita. Também avalia True, se o parâmetro à esquerda for um objeto e o valor de qualquer propriedade for igual ao parâmetro à direita.
  • Parâmetros mínimos: 2. Parâmetros máximos: 2.
  • Se o parâmetro à esquerda for uma matriz, converta cada item para corresponder ao tipo do parâmetro à direita. Se o parâmetro à esquerda for um objeto, converta o valor de cada propriedade para corresponder ao tipo do parâmetro à direita. A comparação de igualdade para cada item específico é avaliada False, se a conversão falhar.
  • Comparação ordinal de ignorar maiúsculas e minúsculas para cadeias de caracteres.
  • Curtos-circuitos após a primeira correspondência

Observação

Não há sintaxe literal em um pipeline YAML para especificar uma matriz. Essa função é de uso limitado em pipelines gerais. Ela se destina ao uso no contexto do decorador de pipeline com matrizes fornecidas pelo sistema, como a lista de etapas.

Você pode usar a expressão containsValue para encontrar um valor correspondente em um objeto. Aqui está um exemplo que demonstra a procura de uma correspondência na lista de ramificações de origem 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

  • Pega um objeto complexo e o gera 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 de script:

{
  "this_is": {
    "a_complex": "object",
    "with": [
      "one",
      "two"
    ]
  }
}

contador

  • Use essa função apenas em uma expressão que defina uma variável. Não o use como parte de uma condição para uma etapa, trabalho ou estágio.
  • Avalia um número que é incrementado a cada execução de uma pipeline.
  • Usa dois parâmetros: prefix e seed.
  • prefix é uma expressão de cadeia de caracteres. A função rastreia um valor de contador separado para cada prefix único. Use caracteres UTF-16 no prefix.
  • seed é o valor inicial do contador.

Você pode criar um contador que incrementa automaticamente por um cada vez que o pipeline é executado. Ao definir um contador, forneça um prefix e um seed. O exemplo a seguir demonstra esse 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 execução, o valor é 101, desde que o valor permaneça major 1.

Se você editar o arquivo YAML e atualizar o valor da variável major para 2, o valor será minor 100 na próxima execução do pipeline. As execuções subsequentes incrementam o contador para 101, 102, 103 e assim por diante.

Se você editar posteriormente o arquivo YAML e definir o valor de major de volta para 1, o valor do contador retoma de onde parou para aquele prefixo. Neste exemplo, ele é retomado em 102.

O exemplo a seguir mostra como definir uma variável para atuar como um contador que começa em 100, incrementa em 1 para cada execução e redefine para 100 todos os dias.

Observação

pipeline.startTime não está disponível fora das expressões. pipeline.startTime formata system.pipelineStartTime em um objeto de data e hora para que as expressões possam usá-lo. O fuso horário padrão para pipeline.startTime é UTC. Você 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 a seguir mostra um contador que mantém um valor separado para PRs e execuções de CI.

variables:
  patch: $[counter(variables['build.reason'], 0)]

O escopo dos contadores é um pipeline. Em outras palavras, o pipeline incrementa o valor do contador para cada execução. Nenhum contador tem escopo de projeto.

terminaCom

  • Avalia True, se o parâmetro à esquerda Cadeia de Caracteres contiver o parâmetro à direita
  • Parâmetros mínimos: 2. Parâmetros máximos: 2.
  • Converte parâmetros em cadeia de caracteres para avaliação.
  • Executa uma comparação ordinal que ignora maiúsculas e minúsculas.
  • Exemplo: endsWith('ABCDE', 'DE') (returna True)

Eq

  • Avalia True, se os parâmetros forem iguais
  • Parâmetros mínimos: 2. Parâmetros máximos: 2.
  • Converte o parâmetro à direita para corresponder ao tipo de parâmetro à esquerda. Retorna False, se a conversão falhar.
  • Comparação ordinal sem distinção entre maiúsculas e minúsculas para strings.
  • Exemplo: eq(variables.letters, 'ABC')

formato

  • Avalia os parâmetros à direita e os insere na cadeia de caracteres de parâmetro à esquerda
  • 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, d, HH, H, m, mm, ss, s, f, ff, ffff, K)
  • Exemplo: format('{0:yyyyMMdd}', pipeline.startTime). Nesse caso, pipeline.startTime é uma variável de objeto de data e hora especial.
  • Escape dobrando as chaves. Por exemplo: format('literal left brace {{ and literal right brace }}')

Ge

  • Avalia True, se o parâmetro à esquerda for maior que ou igual ao parâmetro à direita
  • Parâmetros mínimos: 2. Parâmetros máximos: 2.
  • Converte o parâmetro à direita para corresponder ao tipo de parâmetro à esquerda. Erros, se a conversão falhar.
  • Comparação ordinal sem distinção entre maiúsculas e minúsculas para strings.
  • Exemplo: ge(5, 5) (returna True)

Gt

  • Avalia True, se o parâmetro à esquerda for maior que o parâmetro à direita
  • Parâmetros mínimos: 2. Parâmetros máximos: 2.
  • Converte o parâmetro à direita para corresponder ao tipo de parâmetro à esquerda. Erros, se a conversão falhar.
  • Comparação ordinal de cadeias de caracteres sem distinção entre maiúsculas e minúsculas.
  • Exemplo: gt(5, 2) (returna True)

em

  • Avalia True, se o parâmetro à esquerda for igual a qualquer parâmetro à direita
  • Parâmetros mínimos: 1. Parâmetros máximos: N
  • Converte os parâmetros à direita para corresponder ao tipo de parâmetro à esquerda. A comparação de igualdade avalia False, se a conversão falhar.
  • Comparação ordinal sem distinção entre maiúsculas e minúsculas para strings.
  • Curtos-circuitos após a primeira correspondência
  • Exemplo: in('B', 'A', 'B', 'C') (returna True)

iif

  • 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 uma PR.

ingressar

  • 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. Os objetos complexos são convertidos em uma cadeia de caracteres vazia.
  • Se o parâmetro correto não for uma matriz, o resultado será o parâmetro correto 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 True, se o parâmetro à esquerda for menor que ou igual ao parâmetro à direita
  • Parâmetros mínimos: 2. Parâmetros máximos: 2.
  • Converte o parâmetro à direita para corresponder ao tipo de parâmetro à esquerda. Erros, se a conversão falhar.
  • Comparação ordinal sem diferenciação entre maiúsculas e minúsculas para strings.
  • Exemplo: le(2, 2) (returna True)

comprimento

  • Retorna o comprimento de uma cadeia de caracteres ou de uma matriz, qualquer uma delas que venha do sistema ou de um parâmetro
  • Parâmetros mínimos: 1. Parâmetros máximos: 1.
  • Exemplo: length('fabrikam') retorna 8.

abaixar

  • Converte um valor de cadeia de caracteres ou variável em todos os caracteres minúsculos.
  • Parâmetros mínimos: 1. Parâmetros máximos: 1.
  • Retorna o equivalente minúsculo de uma cadeia de caracteres.
  • Exemplo: lower('FOO') retorna foo.

Tenente

  • True Avalia se o parâmetro esquerdo é menor que o parâmetro à direita.
  • Parâmetros mínimos: 2. Parâmetros máximos: 2.
  • Converte o parâmetro à direita para corresponder ao tipo de parâmetro à esquerda. Erros, se a conversão falhar.
  • Comparação ordinal de cadeias de caracteres sem diferenciar maiúsculas de minúsculas.
  • Exemplo: lt(2, 5) (returna True)

NE

  • Avalia True, se os parâmetros não forem iguais
  • Parâmetros mínimos: 2. Parâmetros máximos: 2.
  • Converte o parâmetro à direita para corresponder ao tipo de parâmetro à esquerda. Retorna True, se a conversão falhar.
  • Comparação ordinal de ignorar maiúsculas e minúsculas para cadeias de caracteres.
  • Exemplo: ne(1, 2) retorna True.

não

  • Avalia True, se o parâmetro for False
  • Parâmetros mínimos: 1. Parâmetros máximos: 1
  • Converte o valor em Booliano para avaliação
  • Exemplo: not(eq(1, 2)) (returna True)

não

  • Avalia True se o parâmetro left não é igual a nenhum parâmetro right
  • Parâmetros mínimos: 1. Parâmetros máximos: N
  • Converte os parâmetros à direita para corresponder ao tipo de parâmetro à esquerda. A comparação de igualdade avalia False, se a conversão falhar.
  • Comparação ordinal de ignorar maiúsculas e minúsculas para cadeias de caracteres.
  • Curtos-circuitos após a primeira correspondência
  • Exemplo: notIn('D', 'A', 'B', 'C') (returna True)

ou

  • Avalia True, se algum parâmetro for True
  • Parâmetros mínimos: 2. Parâmetros máximos: N.
  • Converte parâmetros em Boolean para avaliação.
  • Curtos-circuitos após a primeira True
  • Exemplo: or(eq(1, 1), eq(2, 3)) (retorna True, curtos-circuitos)

substituir

  • Retorna uma nova cadeia de caracteres na qual todas as instâncias de uma cadeia de caracteres na instância atual são substituídas por outra cadeia de caracteres.
  • Parâmetros mínimos: 3. Parâmetros máximos: 3.
  • replace(a, b, c): retorna a, com todas as instâncias de b substituídas por c.
  • Exemplo: replace('https://www.tinfoilsecurity.com/saml/consume','https://www.tinfoilsecurity.com','http://server') (retorna http://server/saml/consume).

dividir

  • Divide uma cadeia de caracteres em subcadeias de caracteres com base nos caracteres delimitadores especificados.
  • Parâmetros mínimos: 2. Parâmetros máximos: 2.
  • O primeiro parâmetro é a cadeia de caracteres a ser dividida.
  • O segundo parâmetro é os caracteres delimitadores.
  • Retorna uma matriz de substrings. A matriz inclui cadeias de caracteres vazias quando os caracteres delimitadores aparecem consecutivamente ou no final da cadeia de caracteres.
  • Exemplo:
    variables:
    - name: environments
      value: prod1,prod2
    steps:
      - ${{ each env in split(variables.environments, ',')}}:
        - script: ./deploy.sh --environment ${{ env }}
    
  • Exemplo de uso 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 True, se a cadeia de caracteres do parâmetro à esquerda começar com o parâmetro à direita
  • Parâmetros mínimos: 2. Parâmetros máximos: 2.
  • Converte parâmetros em cadeia de caracteres para avaliação.
  • Executa uma comparação ordinal que ignora maiúsculas e minúsculas.
  • Exemplo: startsWith('ABCDE', 'AB') (retorna True).

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 um valor de cadeia de caracteres ou variável em todos os caracteres maiúsculos
  • Parâmetros mínimos: 1. Parâmetros máximos: 1.
  • Retorna o equivalente em maiúsculas de uma cadeia de caracteres
  • Exemplo: upper('bah') retorna BAH

xor

  • Avalia True, se exatamente um parâmetro forTrue
  • Parâmetros mínimos: 2. Parâmetros máximos: 2.
  • Converte parâmetros em Boolean para avaliação.
  • Exemplo: xor(True, False) (returna True)

Funções de verificação de status de trabalho

Use as funções de verificação de status a seguir como expressões em condições, mas não em definições de variável.

sempre

  • Sempre avalia como True (mesmo quando cancelado). Observação: uma falha crítica ainda pode impedir a execução de uma tarefa. Por exemplo, se houver falha ao obter as fontes.

cancelado

  • Avalia como True, se o pipeline for cancelado.

falhou

  • Para uma etapa, equivalente a eq(variables['Agent.JobStatus'], 'Failed').
  • Para um trabalho:
    • Sem argumentos, avalia para True se algum trabalho anterior no grafo de dependência falhou.
    • Com nomes de trabalho como argumentos, avalia se True algum desses trabalhos falhou.

bem-sucedido

  • Para uma etapa, equivalente a in(variables['Agent.JobStatus'], 'Succeeded', 'SucceededWithIssues').
  • Use com dependsOn quando trabalhar com tarefas e você deseja verificar se um trabalho anterior foi bem-sucedido. Os trabalhos são executados em paralelo, enquanto os estágios são executados sequencialmente.
  • Para um trabalho:
    • Sem argumentos, avalia para True se todos os trabalhos anteriores no grafo de dependência foram bem-sucedidos ou parcialmente bem-sucedidos.
    • Com nomes de trabalho como argumentos, avalia como True, se todos esses trabalhos foram bem-sucedidos ou parcialmente bem-sucedidos.
    • Avalia como False, se o pipeline for cancelado.

succeededOrFailed

  • Para uma etapa, equivalente a in(variables['Agent.JobStatus'], 'Succeeded', 'SucceededWithIssues', 'Failed').

  • Para um trabalho:

    • Sem argumentos, avalia como True, independentemente de algum trabalho no grafo de dependência ter sido bem-sucedido ou falhado.
    • Com nomes de trabalho como argumentos, avalia como True, se algum desses trabalhos foi bem-sucedido ou falhou.
    • Talvez você queira usar not(canceled()) quando tarefas anteriores no grafo de dependência forem ignoradas.

    Essa função é semelhante a always(), exceto que ela é avaliada como False quando o pipeline é cancelado.

Inserção condicional

Use if, elseife else cláusulas para atribuir condicionalmente valores variáveis ou definir entradas para tarefas. Você também pode executar condicionalmente uma etapa, quando uma condição for atendida.

As condicionais só funcionam quando você usa a sintaxe de modelo. Para obter mais informações, consulte a sintaxe da variável.

Para modelos, você pode usar a inserção condicional ao adicionar uma sequência ou mapeamento. Para obter mais informações, consulte a inserção condicional em modelos.

Atribuir uma variável condicionalmente

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 uma entrada de tarefa condicionalmente

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 uma etapa condicionalmente

Se não houver nenhuma variável definida ou o valor de foo não corresponder às condições if, a else instrução será executada. Neste exemplo, o valor de foo retorna true 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"

palavra-chave Each

Utilize a palavra-chave each 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 }}

Você também pode iterar por meio de elementos aninhados dentro de um 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 referenciar trabalhos ou fases anteriores. Use dependências para:

  • Referenciar o status de trabalho de um trabalho anterior
  • Referenciar o status de fase de uma fase anterior
  • Referenciar variáveis de saída no trabalho anterior na mesma fase
  • Referenciar variáveis de saída na fase anterior em um fase
  • Referenciar variáveis de saída em um trabalho em uma fase anterior na fase seguinte

O contexto é chamado de dependencies para trabalhos e fases e funciona como variáveis. Se você fizer referência a uma variável de saída de um trabalho em outra fase, o contexto será chamado de stageDependencies.

Se você tiver problemas com variáveis de saída com caracteres de aspas (' ou ") neles, consulte este guia de solução de problemas.

Visão geral da sintaxe de dependências

A sintaxe de referência de variáveis de saída com dependências é diferente 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 funciona.

Tipo

Descrição

Dependência entre estágios (diferentes estágios)

Referência a uma variável de saída de um estágio anterior de um trabalho em um estágio diferente em uma condição no 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 trabalhos (mesmo estágio)

Referência a uma variável de saída em um trabalho diferente no mesmo estágio no stages.

  • Sintaxe: and(succeeded(), eq(dependencies.<job-name>.outputs['<step-name>.<variable-name>'], 'true'))
  • Exemplo: and(succeeded(), eq(dependencies.A.outputs['printvar.shouldrun'], 'true'))

Referência a uma variável de saída em um 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)

Referência a uma variável de saída em um trabalho de implentação de um estágio 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 entre estágios (trabalho de implantação com recurso)

Referência a uma variável de saída em um trabalho de implentação que inclui um recurso em um 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 para variáveis de saída em trabalhos de implantação varia dependendo da estratégia de implantação. Para obter mais informações, consulte Trabalhos de implantação.

Fase para preparar dependências

Estruturalmente, o objeto dependencies é um mapa de nomes de trabalho e fase para results e outputs. Expresso na forma de JSON, fica:

"dependencies": {
  "<STAGE_NAME>" : {
    "result": "Succeeded|SucceededWithIssues|Skipped|Failed|Canceled",
    "outputs": {
        "jobName.stepName.variableName": "value"
    }
  },
  "...": {
    // another stage
  }
}

Observação

Os exemplos a seguir usam a sintaxe de pipeline padrão. Se você estiver usando pipelines de implantação, a sintaxe das variáveis e das variáveis condicionais é diferente. Para obter informações sobre a sintaxe específica a ser usada, confira Trabalhos de implantação.

Use essa forma de dependencies para mapear em variáveis ou verificar condições em um nível de fase.

Neste exemplo, existem dois estágios, A e B. O Estágio A tem a condição false e não é executado. O estágio B será executado se o resultado do Estágio A for Succeeded, SucceededWithIssues ou Skipped. O estágio B é executado porque o estágio A foi ignorado.

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

As fases também podem usar variáveis de saída de outra fase. Neste exemplo, existem dois estágios. O estágio A inclui um trabalho, A1, que define uma variável de saída shouldrun como true. O estágio B é executado quando shouldrun é true. Como shouldrun é true, o estágio B é 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
  condition: and(succeeded(), eq(dependencies.A.outputs['A1.printvar.shouldrun'], 'true'))
  dependsOn: A
  jobs:
  - job: B1
    steps:
    - script: echo hello from Stage B

Observação

Por padrão, cada fase em um pipeline depende daquele imediatamente anterior a ele no arquivo YAML. Se você precisar se referir a uma fase que não seja imediatamente anterior à atual, poderá substituir esse padrão automático adicionando uma seção dependsOn à fase.

Dependências de tarefas dentro de uma fase

No nível do trabalho em uma fase única, os dados dependencies não contêm informações de nível de fase.

"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). O trabalho 'a' é sempre ignorado devido a condition: false. A tarefa b é executada porque não tem condições associadas. O trabalho c é executado porque todas as suas dependências são bem-sucedidas (trabalho b) ou 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 trabalho para trabalho entre fases

No nível do trabalho, você também pode referenciar saídas de um trabalho em uma fase anterior. Isso requer o uso do contexto stageDependencies.

"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 se o trabalho A1 for 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 uma fase diferente, a sintaxe será diferente. No exemplo a seguir, o trabalho run_tests será executado, se o trabalho de implantação build_job definir runTests como true. Observe que a chave usada para o dicionário outputs é 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 uma fase depender de uma variável definida por um trabalho de implantação em uma fase diferente, a sintaxe será diferente. No exemplo a seguir, a fase test depende da implantação build_job configuração shouldTest para true. Observe que, no condition da fase 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 referencia um ambiente e não um recurso de ambiente. Para referenciar 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 referencia 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 você trabalha com uma coleção de itens, use a * sintaxe para aplicar uma matriz filtrada. Uma matriz filtrada retorna todos os objetos ou elementos, independentemente de seus nomes.

Por exemplo, considere uma matriz de objetos chamados foo. Você deseja obter uma matriz dos valores da id propriedade em cada objeto em sua matriz.

[
    { "id": 1, "a": "avalue1"},
    { "id": 2, "a": "avalue2"},
    { "id": 3, "a": "avalue3"}
]

Use a seguinte expressão:

foo.*.id

Essa expressão informa ao sistema que deve tratar foo como uma matriz filtrada e, em seguida, selecionar a propriedade id de cada objeto.

Essa expressão retorna:

[ 1, 2, 3 ]

Conversão de tipo

Os valores em uma expressão podem ser convertidos de um tipo para outro à medida que a expressão é avaliada. Quando você avalia uma expressão, o processo converte parâmetros no tipo de dados relevante e os transforma novamente em cadeias de caracteres.

Por exemplo, neste YAML, os valores True e False são convertidos para 1 e 0 quando a expressão é avaliada. A função lt() retorna True quando o parâmetro à esquerda é menor que o parâmetro à direita.

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 em ordem e retorna o primeiro valor que não é nulo ou uma cadeia de caracteres 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 fio Versão
Booliano - - Sim Sim -
Nulo Sim - Sim Sim -
Número Sim - - Sim Parcial
Cadeia de caracteres Sim Parcial Parcial - Parcial
Versão Sim - - Sim -

booleano

Para número:

  • False0
  • True1

Para cadeia de caracteres:

  • False'False'
  • True'True'

Nulo

  • Para Booliano: False
  • Para número: 0
  • Para cadeia de caracteres: '' (a cadeia de caracteres vazia)

Número

  • Para booliano: 0False, 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 cadeia de caracteres: converte o número em uma cadeia de caracteres sem separador de milhares e sem separador decimal.

fio

  • Para booliano: '' (a cadeia de caracteres vazia) → False, qualquer outra cadeia de caracteres → True
  • Para nulo: '' (a cadeia de caracteres vazia) → Null, qualquer outra cadeia de caracteres não conversível
  • Para número: '' (a cadeia de caracteres vazia) → 0, caso contrário, executa Int32.TryParse do C# usando InvariantCulture e as seguintes regras: AllowDecimalPoint | AllowLeadingSign | AllowLeadingWhite | AllowThousands | Allowtrailingwhite. Se TryParse falhar, não será conversível.
  • Para a versão: executa o Version.TryParse do C#. Deve conter, no mínimo, o componente Principal e Secundário. Se TryParse falhar, não será conversível.

Versão

  • Para Booliano: True
  • Para cadeia de caracteres: Major.Minor, Major.Minor.Build ou Major.Minor.Build.Revision.

perguntas frequentes

Quero fazer algo que as expressões não dão suporte. Quais opções tenho para estender a funcionalidade de Pipelines?

Você pode personalizar seu pipeline usando um script que inclui uma expressão. Por exemplo, esse snippet usa a BUILD_BUILDNUMBER variável e a divide usando o Bash. Esse script gera duas novas variáveis, $MAJOR_RUN e $MINOR_RUN, para os números de execução principal e secundário. As duas variáveis são então usadas para criar duas variáveis de pipeline, $major e $minor, usando task.setvariable. Essas variáveis estão disponíveis para as etapas downstream. Para compartilhar variáveis entre pipelines, confira 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)"