View on GitHub

manual-da-engenharia-para-codar

Este é o manual para compromissos de "código com" a engenharia.

Construindo Containers com Azure DevOps usando o Padrão DevTest

Neste documento, destacamos os aprendizados obtidos ao aplicar o padrão DevTest ao desenvolvimento de containers no Azure DevOps por meio de pipelines.

O padrão nos permitiu construir containers para desenvolvimento, teste e liberação do container para reutilização posterior (pronto para produção).

Vamos explorar as ferramentas necessárias para construir, testar e enviar um container, nosso ambiente e passar por cada etapa separadamente.

Siga este link para aprofundar ou revisitar o padrão DevTest.

Índice

Construir o Container Testar o Container Enviar Container Referências

Construir o Container

O primeiro passo no desenvolvimento de containers, após criar os Dockerfiles e o código-fonte necessários, é construir o container. Até mesmo o próprio Dockerfile pode incluir alguns testes básicos. Os testes de código são realizados ao enviar o código para o repositório de origem, onde ele é então usado para construir o container.

A primeira etapa em nosso pipeline é executar o comando docker build com uma tag temporária e os argumentos de construção necessários:

# ... código omitido para brevidade

Essa tarefa inclui os parâmetros buildDirectory, imageName e dockerfileName, que devem ser definidos previamente. Essa tarefa pode, por exemplo, ser usada em um modelo para vários containers para melhorar a reutilização de código.

Também é possível passar variáveis de ambiente diretamente para o Dockerfile por meio da seção env da tarefa.

Se essa tarefa for bem-sucedida, o Dockerfile foi construído sem erros e podemos continuar testando o próprio container.

Testar o Container

Para testar o container, estamos usando o ambiente tox. Para mais detalhes sobre o tox, visite a seção tox deste repositório ou visite a página oficial de documentação do tox.

Antes de testarmos o container, estamos verificando se há credenciais expostas no histórico da imagem docker. Se senhas conhecidas, usadas para acessar nossos recursos internos, estiverem expostas aqui, a etapa de construção falhará:

# ... código omitido para brevidade

Após o teste de credencial, o container é testado por meio da extensão pytest testinfra. Testinfra é uma ferramenta baseada em Python que pode ser usada para iniciar um container, reunir pré-requisitos, testar o container e desligá-lo novamente, sem nenhum esforço além de escrever os testes. Esses testes podem, por exemplo, incluir:

Para uma coleção completa de capacidades e requisitos, visite o projeto testinfra no GitHub.

Alguns métodos de um teste de container baseado em Linux podem parecer assim:

# ... código omitido para brevidade

Para iniciar o teste, um comando pytest é executado por meio do tox.

Uma tarefa contendo o comando tox pode parecer assim:

# ... código omitido para brevidade

O que poderia acionar o seguinte código pytest, que está contido no arquivo tox.ini:

# ... código omitido para brevidade

Como última tarefa deste pipeline para construir e testar o container, definimos uma variável chamada testsPassed, que é apenas true, se as tarefas anteriores tiverem sido bem-sucedidas:

# ... código omitido para brevidade

Enviar Container

Após construir e testar, se nosso container funcionar conforme o esperado, queremos liberá-lo para nosso Azure Container Registry (ACR) para ser usado por nossa aplicação maior. Antes disso, queremos automatizar o comportamento de envio e definir uma tag significativa.

Como desenvolvedor, muitas vezes é útil ter containers enviados para o ACR, mesmo que estejam falhando. Isso pode ser feito verificando a variável testsPassed que introduzimos no final de nossos testes.

Se o teste falhou, queremos adicionar um sufixo de falha no final da tag:

# ... código omitido para brevidade

A condição verifica se o valor de testsPassed é false e também se não estamos na main branch, pois não queremos enviar containers falhos da main. Isso nos ajuda a manter nosso ambiente de produção limpo.

O valor para imageRepository foi definido em outro modelo, junto com o failedSuffix e testsPassed:

# ... código omitido para brevidade

A imageTag está aberta para discussão, pois depende muito de como sua equipe deseja usar o container. Optamos por Build.SourceVersion, que é o ID do commit da branch em que o container foi desenvolvido. Isso permite que você rastreie facilmente a origem do container e auxilie na depuração.

Um link para as variáveis predefinidas do Azure DevOps pode ser encontrado na Documentação do Azure sobre Azure DevOps.

Após adicionar uma tag ao container, a imagem deve ser enviada. Isso pode ser feito com a seguinte tarefa:

# ... código omitido para brevidade
``

`

Da mesma forma, estas são as etapas para publicar o container no ACR, se os testes forem bem-sucedidos:

```yml
# ... código omitido para brevidade

Se você não quiser incluir a tag latest, também pode remover as etapas envolvendo latest (SetLatestSuffixTag & pushSuccessfulDockerImageLatest).

Referências