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.
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:
- Se a branch for igual a master.: eq(variables[‘Build.SourceBranch’], ‘refs/heads/master’ )
- E se a razão da build for alguma dentre essas especificadas: in(variables[‘Build.Reason’],’Manual’,’IndividualCI’,’BatchedCI’)
- 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.