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
Este artigo descreve as diferentes condições que permitem que um estágio, trabalho ou etapa do Azure Pipelines seja executado e como definir essas condições em uma definição de pipeline YAML.
Nota
Este artigo discute os recursos de pipeline YAML. Para pipelines clássicos, pode especificar algumas condições em que tarefas ou trabalhos são executados nas Opções de controlo de cada tarefa e nas Opções adicionais para um trabalho em um pipeline de lançamento.
Condições em que um estágio, trabalho ou etapa é executado
Por padrão, um trabalho ou estágio de pipeline é executado se não depender de nenhum outro trabalho ou estágio, ou se todas as suas dependências forem concluídas e bem-sucedidas. O requisito de dependência aplica-se às dependências diretas e às suas dependências indiretas, calculadas recursivamente.
Por padrão, uma etapa é executada se ainda nada no seu trabalho falhou e a etapa imediatamente anterior terminou. Para obter mais contexto sobre estágios, trabalhos e etapas, consulte Conceitos-chave para Pipelines do Azure.
Você pode substituir ou personalizar esses comportamentos padrão definindo um estágio, trabalho ou etapa para ser executado, mesmo se ou somente se uma dependência anterior falhar ou tiver outro resultado. Você também pode definir condições personalizadas. Em uma definição de pipeline YAML, você usa a condition propriedade para especificar condições sob as quais um estágio, trabalho ou etapa pode ser executado.
Nota
As condições aplicam-se a todas as dependências diretas e indiretas anteriores com o mesmo pool de agentes. Estágios ou trabalhos em diferentes pools de agentes são executados simultaneamente.
As condições baseadas no status de dependência anterior incluem:
-
Êxito: execute somente se todas as dependências anteriores forem bem-sucedidas. Esse comportamento é o padrão se nenhuma condição estiver definida no YAML. Para aplicar essa condição, especifique
condition: succeeded(). -
Êxito ou falha: execute mesmo se uma dependência anterior falhar, a menos que a execução seja cancelada. Para aplicar essa condição, especifique
condition: succeededOrFailed(). -
Sempre: Executar mesmo se uma dependência anterior falhar, mesmo que a execução seja cancelada. Para aplicar essa condição, especifique
condition: always(). -
Falha: Execute somente quando uma dependência anterior falhar. Para aplicar essa condição, especifique
condition: failed().
Importante
Ao especificar uma condition propriedade para um estágio, trabalho ou etapa, você substitui a condição padrão. Seu estágio, trabalho ou etapa pode ser executado mesmo se a compilação for cancelada. Certifique-se de que as suas condições têm em conta o estado da fase principal ou do trabalho.
Exemplo de condição
O exemplo YAML a seguir demonstra as always() condições e failed() . A primeira tarefa de script no trabalho 1 tem uma always condição, portanto, é executada mesmo se as dependências falharem ou a compilação for cancelada. Na segunda tarefa de script, exit job1 provoca a falha do job1 processo.
Os estágios do pipeline são executados sequencialmente por padrão, mas os trabalhos podem ser executados em paralelo. Você pode usar a dependsOn propriedade para definir explicitamente dependências entre estágios ou trabalhos.
Para definir as condições para um trabalho que depende do resultado de outro trabalho, use dependsOn para definir a dependência. No exemplo a seguir, job2 depende e job1 é executado porque job1 falha.
jobs:
- job: job1
steps:
- script: echo Hello!
condition: always() # this step runs even if the build is canceled
- script: |
echo "This task will fail."
exit job1
- job: job2
dependsOn: job1
condition: failed() # this job runs only if job1 fails
Nota
Você também pode usar a interface do usuário do Azure Pipelines para executar manualmente estágios dependentes quando o estágio pai falhar. Para obter mais informações, consulte Executar estágios filhos quando o estágio pai falhar.
Condições personalizadas
Se as condições internas não atenderem às suas necessidades, você poderá especificar condições personalizadas como expressões nas definições de pipeline YAML.
O agente avalia a expressão começando pela função mais interna e depois para as funções exteriores. O resultado final é um valor booleano que determina se o estágio, o trabalho ou a etapa deve ou não ser executado. Para obter um guia completo sobre a sintaxe, consulte Expressões.
Importante
As condições são avaliadas para determinar se se deve iniciar um estágio, trabalho ou etapa. Portanto, nada computado durante o tempo de execução de um estágio, trabalho ou etapa está disponível para uso dentro desse mesmo estágio, trabalho ou etapa. Por exemplo, se você definir uma variável em um trabalho usando uma expressão de tempo de execução com $[ ] sintaxe, não poderá usar essa variável em condições dentro desse trabalho.
Variáveis em condições
Você pode definir variáveis de pipeline e usá-las em condições. O pipeline a seguir define uma isMain variável e a usa em uma condição que executa o Estágio B somente quando a ramificação de origem da compilação é main.
variables:
isMain: $[eq(variables['Build.SourceBranch'], 'refs/heads/main')]
stages:
- stage: A
jobs:
- job: A1
steps:
- script: echo Hello Stage A!
- stage: B
condition: and(succeeded(), eq(variables.isMain, true))
jobs:
- job: B1
steps:
- script: echo Hello Stage B!
- script: echo $(isMain)
Você pode definir uma condição para ser executada se uma variável for nula ou uma cadeia de caracteres vazia. Todas as variáveis são tratadas como cadeias de caracteres no Azure Pipelines, portanto, uma cadeia de caracteres vazia é equivalente ao null seguinte pipeline:
variables:
- name: testEmpty
value: ''
jobs:
- job: A
steps:
- script: echo testEmpty is blank
condition: eq(variables.testEmpty, '')
Variáveis de saída de trabalho usadas em outras condições de trabalho
Você pode criar uma variável em um trabalho que outros trabalhos no mesmo estágio podem especificar em condições. As variáveis disponíveis para trabalhos dependentes devem ser marcadas como variáveis de saída de vários trabalhos usando , como isOutput=trueno código a seguir:
jobs:
- job: A
steps:
- bash: |
echo "This is job A."
echo "##vso[task.setvariable variable=doThing;isOutput=true]Yes" #set variable doThing to Yes
name: DetermineResult
- job: B
dependsOn: A
condition: eq(dependencies.A.outputs['DetermineResult.doThing'], 'Yes') #map doThing and check the value
steps:
- script: echo "Job A ran and doThing is Yes."
Variáveis de etapa usadas em condições de etapa subsequentes
Você pode criar uma variável em uma etapa que as etapas futuras no mesmo trabalho podem especificar em condições. As variáveis criadas a partir de etapas estão disponíveis para etapas futuras no trabalho por padrão e não precisam ser marcadas como variáveis de saída de vários trabalhos.
As variáveis criadas em uma etapa de um trabalho têm as seguintes limitações:
- Têm como escopo as etapas no mesmo trabalho.
- Estão disponíveis nas etapas subsequentes apenas como variáveis de ambiente.
- Não pode ser usado na mesma etapa que os define.
O exemplo a seguir cria uma variável de pipeline em uma etapa e usa a variável na condição de script de uma etapa posterior.
steps:
# This step creates a new pipeline variable: doThing. This variable is available to subsequent steps.
- bash: |
echo "##vso[task.setvariable variable=doThing]Yes"
displayName: Step 1
# This step uses doThing in its condition
- script: |
# Access the variable from Step 1 as an environment variable.
echo "Value of doThing (as DOTHING env var): $DOTHING."
displayName: Step 2
condition: and(succeeded(), eq(variables['doThing'], 'Yes')) # or and(succeeded(), eq(variables.doThing, 'Yes'))
Configurações de condição para vários resultados
A tabela a seguir mostra condition as configurações para produzir vários resultados desejados.
| Resultado desejado | Exemplo de configuração de condição |
|---|---|
Execute se a ramificação de origem for main, mesmo que o estágio, trabalho ou etapa pai ou anterior tenha falhado ou sido cancelado. |
eq(variables['Build.SourceBranch'], 'refs/heads/main') |
Execute se a ramificação de origem for main e o estágio, trabalho ou etapa pai ou anterior tiver êxito. |
and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main')) |
Execute se a ramificação de origem não mainfor , e o estágio, trabalho ou etapa pai ou anterior tiver êxito. |
and(succeeded(), ne(variables['Build.SourceBranch'], 'refs/heads/main')) |
Execute para user ramificações se o estágio, trabalho ou etapa pai ou anterior tiver sido bem-sucedido. |
and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/heads/users/')) |
| Executar para compilações de integração contínua (CI), se o estágio, trabalho ou etapa pai ou anterior tiver sido bem-sucedido. | and(succeeded(), in(variables['Build.Reason'], 'IndividualCI', 'BatchedCI')) |
| Execute se uma solicitação pull disparou a compilação e o estágio, trabalho ou etapa pai ou anterior falhou. | and(failed(), eq(variables['Build.Reason'], 'PullRequest')) |
| Executar para uma compilação agendada, mesmo que o estágio, trabalho ou etapa pai ou anterior tenha falhado ou sido cancelado. | eq(variables['Build.Reason'], 'Schedule') |
Execute se a System.debug variável estiver definida como true, mesmo que o estágio, trabalho ou etapa pai ou anterior tenha falhado ou sido cancelado. |
eq(variables['System.debug'], true) |
Nota
Release.Artifacts.{artifact-alias}.SourceBranch é equivalente a Build.SourceBranch.
Resultados da condição quando uma compilação é cancelada
Cancelar uma compilação não significa que todos os seus estágios, trabalhos e etapas parem de ser executados. Quais trabalhos, estágios ou etapas param de ser executados dependem das condições especificadas e em que ponto da execução do pipeline você cancelou a compilação. Se o pai de um estágio, trabalho ou etapa for ignorado, o estágio, trabalho ou etapa não será executado, independentemente de suas condições.
Um estágio, trabalho ou etapa é executado sempre que as suas condições são avaliadas como true. Se uma condição não levar em conta o estado do pai da tarefa, a tarefa poderá ser executada mesmo que seu pai seja cancelado. Para controlar se trabalhos, estágios ou etapas são executados quando uma compilação é cancelada, inclua uma função de verificação de status do trabalho em suas condições.
Se você cancelar uma compilação enquanto ela estiver no estágio de fila, mas ainda não estiver em execução, toda a execução será cancelada, incluindo todos os outros estágios.
Nota
Se qualquer uma das suas condições permitir que as tarefas sejam executadas mesmo depois que a compilação for cancelada, especifique um valor para cancelar o tempo limite que forneça tempo suficiente para que as tarefas sejam concluídas após o cancelamento da execução.
Exemplo de resultados da condição do estágio
Os exemplos a seguir mostram os resultados de várias condições definidas em estágios quando a compilação é cancelada.
Exemplo de estágio 1
No pipeline seguinte, por padrão stage2 , dependeria da stage1 conclusão bem-sucedida. No entanto, stage2 tem um condition conjunto para ser executado sempre que a ramificação de origem for main, independentemente do stage1 status.
Se enfileirarem uma compilação na ramificação main e cancelarem-na enquanto stage1 estiver em execução, stage2 ainda será executado, porque eq(variables['Build.SourceBranch'], 'refs/heads/main') é avaliado como true.
stages:
- stage: stage1
jobs:
- job: A
steps:
- script: echo 1; sleep 30
- stage: stage2
condition: eq(variables['Build.SourceBranch'], 'refs/heads/main')
jobs:
- job: B
steps:
- script: echo 2
Exemplo de etapa 2
No pipeline a seguir, por padrão stage2 , depende da stage1 conclusão bem-sucedida. Job B in tem um stage2 conjunto para ser executado sempre que a ramificação de origem for conditionmain .
Se você enfileirar uma compilação na main ramificação e cancelá-la enquanto stage1 estiver em execução, e seus trabalhos não forem executados, stage2 mesmo que o estágio contenha um trabalho cuja condição seja avaliada como true.
stages:
- stage: stage1
jobs:
- job: A
steps:
- script: echo 1; sleep 30
- stage: stage2
jobs:
- job: B
condition: eq(variables['Build.SourceBranch'], 'refs/heads/main')
steps:
- script: echo 2
Exemplo de fase 3
No pipeline a seguir, por padrão stage2 , depende da stage1 conclusão bem-sucedida. A etapa dentro do trabalho B tem stage2 um condition conjunto para ser executado sempre que a ramificação de origem for main.
Se você enfileirar uma compilação na main ramificação e cancelá-la enquanto stage1 estiver em execução, stage2 e o trabalho B não for executado, mesmo que o trabalho B contenha uma etapa cuja condição seja avaliada como true.
Stage2 é ignorado inteiramente porque stage1 foi cancelado.
stages:
- stage: stage1
jobs:
- job: A
steps:
- script: echo 1; sleep 30
- stage: stage2
jobs:
- job: B
steps:
- script: echo 2
condition: eq(variables['Build.SourceBranch'], 'refs/heads/main')
Exemplo de resultados de condições de trabalho
Os exemplos a seguir mostram os resultados de várias condições definidas em trabalhos quando a compilação é cancelada.
Exemplo de trabalho 1
No pipeline YAML a seguir, a execução do trabalho B depende do trabalho A em execução. O trabalho B também tem um condition conjunto para ser executado sempre que a ramificação de origem for main.
Se uma compilação for enfileirada na ramificação main e for cancelada enquanto o trabalho A estiver em execução, o trabalho B ainda será executado, porque condition: eq(variables['Build.SourceBranch'], 'refs/heads/main') é avaliado como true.
jobs:
- job: A
steps:
- script: sleep 30
- job: B
dependsOn: A
condition: eq(variables['Build.SourceBranch'], 'refs/heads/main')
steps:
- script: echo step 2.1
Se você quiser que o trabalho B seja executado somente quando o trabalho A for bem-sucedido e a origem da compilação for main, você deverá definir como conditionand(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main')).
Exemplo de trabalho 2
No pipeline YAML a seguir, o trabalho B depende do sucesso do trabalho A . O trabalho B tem um condition conjunto para ser executado sempre que o trabalho A for bem-sucedido e a ramificação de origem da compilação for main.
Se você enfileirar uma compilação na ramificação e cancelá-la enquanto o trabalho estiver em execução, o main trabalho A não será executado, mesmo que tenha um B que seja avaliado como condition.true A condição no trabalho B avalia porque false o trabalho A não teve sucesso. Portanto, o trabalho B e suas etapas são ignorados.
jobs:
- job: A
steps:
- script: sleep 30
- job: B
dependsOn: A
steps:
- script: echo step 2.1
condition: and(eq(variables['Build.SourceBranch'], 'refs/heads/main'), succeeded())
Exemplo de resultado da condição da etapa
Você também pode definir condições em etapas. No pipeline a seguir, a etapa 2.3 tem um condition definido para executar sempre que a ramificação de origem for main.
Se enfileirares uma compilação na ramificação main e a cancelares enquanto as etapas 2.1 ou 2.2 estiverem a decorrer, a etapa 2.3 ainda será executada, porque eq(variables['Build.SourceBranch'], 'refs/heads/main') avalia como true.
steps:
- script: echo step 2.1
- script: echo step 2.2; sleep 30
- script: echo step 2.3
condition: eq(variables['Build.SourceBranch'], 'refs/heads/main')
Parâmetros em condições
Você pode usar parâmetros em condições. A expansão de parâmetros acontece antes da execução do pipeline e substitui os valores cercados pelos ${{ }} valores literais dos parâmetros. Como a expansão de parâmetros ocorre antes da avaliação da condição, você pode declarar um parâmetro em um pipeline e incorporar o parâmetro dentro de qualquer condição nesse pipeline.
O condition exemplo a seguir combina duas funções: succeeded() e ${{ eq(parameters.doThing, true) }}. A succeeded() função verifica se a etapa anterior foi bem-sucedida. Esta função também retorna true se não houver nenhuma etapa anterior.
A ${{ eq(parameters.doThing, true) }} função verifica se o doThing parâmetro é igual a true. A etapa de script no exemplo a seguir é executada porque não havia nenhuma etapa anterior e parameters.doThing é true por padrão.
parameters:
- name: doThing
default: true
type: boolean
steps:
- script: echo I did a thing
condition: and(succeeded(), ${{ eq(parameters.doThing, true) }})
Parâmetros do template em condições
Ao passar um parâmetro para um modelo de pipeline, você pode definir o valor do parâmetro no arquivo de modelo ou usar templateContext para passar o parâmetro para o modelo.
O arquivo de modelo de parameters.yml a seguir declara o doThing parâmetro com um valor padrão de e usa o parâmetro em uma condição de true trabalho.
# parameters.yml
parameters:
- name: doThing
default: true
type: boolean
jobs:
- job: B
steps:
- script: echo I did a thing
condition: ${{ eq(parameters.doThing, true) }}
A definição de pipeline de azure-pipelines.yml a seguir faz referência ao trabalho no arquivo de modelo parameters.yml . A saída do pipeline é I did a thing porque o parâmetro doThing é true por padrão.
# azure-pipelines.yml
extends:
template: parameters.yml
Para obter mais exemplos de parâmetros de modelo, consulte a Referência de uso de modelo.
FAQ
Como poderei acionar um trabalho se um trabalho anterior tiver sido concluído com problemas?
Você pode usar o resultado do trabalho anterior em uma condição. No YAML a seguir, a condição eq(dependencies.A.result,'SucceededWithIssues') define o trabalho B para ser executado após o trabalho A ser bem-sucedido com problemas.
jobs:
- job: A
steps:
- script: echo Job A ran
- job: B
dependsOn: A
condition: eq(dependencies.A.result,'SucceededWithIssues') # targets the result of the previous job
steps:
- script: echo Job A had issues
Por que minha compilação ainda está em execução depois que eu a cancelei?
Você pode enfrentar esse problema se uma condição configurada em um estágio não incluir uma função de verificação de status do trabalho. Para resolver o problema, adicione uma função de verificação de status do trabalho à condição. Para obter mais informações, consulte Resultados da condição quando uma compilação é cancelada.