DevOps e metodologias Ágeis transformaram o desenvolvimento de software enfatizando a colaboração, automação e melhoria contínua. Aplicar os princípios de DevOps aos meus designs e projetos foi um divisor de águas, aumentando a eficiência e a confiabilidade. Neste artigo, vamos passar pelo processo de configuração de um fluxo de integração contínua (CI) para um projeto de sistemas embarcados existente que utiliza o microcontrolador ATmega328P. Ao final deste artigo, você verá como essas práticas podem otimizar seu processo de desenvolvimento e entregar produtos de maior qualidade.
DevOps é um conjunto de práticas, popularizado pelo mundo do software, que une o desenvolvimento de software (Dev) e as operações de TI (Ops) em um fluxo contínuo. No mundo do software, era comum desenvolver o software e “jogá-lo por cima do muro” para os profissionais de operações para implantação nos clientes. DevOps introduziu uma maneira de não apenas derrubar esse muro, mas automatizar todo o processo de ponta a ponta. No mundo do hardware, encontramos semelhanças entre o desenvolvimento de produtos e a produção, constantemente jogando o design “por cima do muro” para nossas equipes de engenharia de manufatura para garantir que tudo esteja pronto para a produção.
No design de produtos embarcados ainda temos que passar nosso software pela produção, mas enfrentamos o desafio de nos mover mais rápido do que nunca e entregar na mais alta qualidade possível. Com os princípios de DevOps, visamos resolver alguns desses desafios.
Aplicando os princípios de DevOps, somos capazes de iterar rapidamente usando metodologias Ágeis dentro do paradigma construir-testar-implantar para cada recurso adicional que desejamos lançar para produção.
“Construir, testar e implementar” é um conjunto comum de palavras que você frequentemente ouvirá ao discutir DevOps. Em sistemas embarcados fazemos a mesma coisa, pois nossa implementação também vai para produção (e então para o cliente final). No repositório do projeto estamos usando Gitlab CI para conduzir nosso fluxo de trabalho de ponta a ponta para DevOps Embarcado. Usamos o que é chamado de “pipelines” para criar tarefas que alcançam certas atividades como compilar o software, executar testes no alvo, ou liberá-lo como um pacote oficial. No Gitlab, um pipeline é uma coleção de tarefas que são executadas em uma sequência como esta:
Figura 1: Exemplo de pipeline usado com o fluxo de trabalho DevOps ATmega328P no Gitlab
Aqui está uma decomposição do script CI (.gitlab-ci.yml) para dar uma ideia de como isso funciona.
Há alguns detalhes menores que levam esse fluxo de trabalho de uma implementação básica de DevOps para um sistema que funciona de maneira suave, bem documentada e facilmente observável. Há alguns detalhes sutis dentro do fluxo de trabalho CI que são importantes de apontar.
if [ "$CI_COMMIT_REF_SLUG" == "$CI_DEFAULT_BRANCH" ]; then
export IMAGE_TAG=$CI_REGISTRY_IMAGE/$IMAGE_TYPE:latest
else
export IMAGE_TAG=$CI_REGISTRY_IMAGE/$IMAGE_TYPE:$CI_COMMIT_REF_SLUG
fi
Esta lógica prepara o cenário para nosso rótulo “latest” usar apenas a imagem Docker construída na branch principal (ou seja, após uma solicitação de merge ser aprovada com sucesso). Isso garante que apenas solicitações de merge bem-sucedidas publiquem a imagem docker mais recente e mais avançada da qual todos e cada pipeline retiram.
Figura 2: Cobertura de código dentro de uma solicitação de merge
Nesta captura de tela, o Gitlab resume os testes executados no alvo usando hardware in the loop:
Figura 3: Resumo de teste para testes executados no alvo
No final, uma vez que nosso código foi validado tanto com testes unitários quanto no alvo, as etapas de publicação e lançamento geram um pacote agradável que pode ser consumido pela equipe de produção:
Figura 4: Lançamento de pacote de software
Com todos esses passos automatizados, podemos lançar uma nova funcionalidade de forma iterativa em um modo Ágil. Não há necessidade de desenvolver muitas funcionalidades, enviá-las para o departamento de QA e, então, uma revisão para lançamento do pacote pela equipe de produção. Tudo aqui acontece em um único fluxo de trabalho e é completamente automatizado.
Neste artigo, exploramos como as metodologias DevOps e Agile podem ser aplicadas ao desenvolvimento de sistemas embarcados, especificamente usando o microcontrolador ATmega328P. Discutimos os benefícios de implementar um fluxo de trabalho CI no Gitlab, que inclui automação, tempos de construção mais rápidos e testes eficientes. Ao detalhar o script CI e explicar cada estágio, mostramos como criar um processo de desenvolvimento robusto e otimizado que aumenta a eficiência e a qualidade do produto. Seguindo este guia prático (e o código-fonte dentro do repositório), você também deverá ser capaz de configurar seu próprio fluxo de trabalho Embedded DevOps.
O código-fonte do projeto pode ser encontrado aqui:https://gitlab.com/embedded-designs/atmega328p-serial-led-control.