Utilizando condições em uma trarefa no seu pipeline

Essa é uma dica da linha das trincheiras!

Com o Azure DevOps Services ou o Server, nós podemos utilizar o conceito de branch policy e vincular uma build para executar as validações que desejarmos, como por exemplo rodar os testes de unidade, rodar a análise estática de código entre outros.

Quando estamos em clientes é comum ver o cenário onde o cliente possui uma build para fazer as validações de CI ou branch policy e uma para gerar os binários que serão utilizados no deploy da aplicação.

O problema disso é que se meu processo altera, eu tenho que alterar em duas build definitions. E caso eu esqueça, já terei uma diferença no processo e o que pode gerar validações diferentes e isso não é o ideal.

Para resolver esse problema, nós podemos utilizar uma funcionalidade bem legal que é o conditions dentro de uma task.

conditions
conditions (clique para ampliar)

Por padrão nós temos as seguintes condições:

  • Only when all previous dependencies have succeeded - no yaml a condition é succeed(): Esse é o valor padrão e só vai executar a tarefa se todos as suas predecessoras tiverem sido executadas com suecesso
  • Even if a previous dependency has failed, unless the run was canceled - no yaml a condition é succeededOrFailed(): Execute essa tarefa mesmo que as suas predecessoras tenham falhado, exceto se o processo de build/release tiver sido cancelado.
  • Even if a previous dependency has failed, even if the run was canceled - no yaml a condition é always(): Execute essa tarefa mesmo que as suas predecessoras tenham falhado e o processo de build/release tenha sido cancelado.
  • Only when a previous dependency has failed - no yaml a condition é failed():: Execute apenas quando a tarefa predecessora tenha falhado
  • Custom Conditions: Aqui você pode colocar a expressão desejada para fazer a validação.

Para escrever essas condições, você tem que seguir o modelo de expressões. Para detalhes de como trabalhar com as expressões, consulte a seguinte documentação - Expressions on Azure Pipelines doc.

No caso acima, eu precisava garantir que o processo que faria o publish dos artefatos da build só executasse quando fosse um processo de CI configurado na master (através das triggers), quando a build fosse executada manualmente ou dentro de um processo de batch da build.

Para isso, eu adicionei a seguinte expression na tarefa de Publish Artifacts :

and(succeeded(),in(variables['Build.Reason'],'Manual','IndividualCI','BatchedCI'), eq(variables['Build.SourceBranch'], 'refs/heads/master' ))

As expressões são executadas de dentro para fora, ou seja, da mais interna para mais externa da expressão. Nesse caso a validação é feita da seguinte maneira:

  1. Se a branch for igual a master.: eq(variables[‘Build.SourceBranch’], ‘refs/heads/master’ )
  2. E se a razão da build for alguma dentre essas especificadas: in(variables[‘Build.Reason’],’Manual’,’IndividualCI’,’BatchedCI’)
  3. E se a tarefa anterior tiver sido concluída com sucesso: succeeded()

Caso essas 3 condições sejam verdadeiras a tarefa de publish é executada. Se qualquer uma for falsa, a tarefa não será executada não produzindo assim nenhum artefato de build.

O mais legal dessas condições é que se você estiver criado seu pipeline no yaml, você pode utilizar o modelo de condições para executar não apenas tarefas mas também com jobs e stages.

Espero que tenha gostado e se tiver alguma dúvida específica me manda um e-mail ou deixe nos comentários.

Até a próxima, Claudio Romão



12/05/2020 | Por Claudio Romão | Em Técnico | Tempo de leitura: 3 mins.

Postagens relacionadas