Bem-vindo à terceira parte da nossa série sobre DevOps! Neste post, falaremos sobre as práticas técnicas desse modelo.

Para aumentar a capacidade de distribuição de sistemas e serviços, bem como reduzir o risco associado à implementação de mudanças em um ambiente de produção, são necessárias adotar as práticas técnicas de integração contínua, entrega contínua, microsserviços, infraestrutura como código, monitoramento, comunicação e colaboração. Tais práticas essenciais ajudam as empresas a inovar mais rapidamente por meio da automação e da simplificação dos processos de desenvolvimento de software e gerenciamento de infraestrutura.

O fundamento das práticas é a realização de atualizações frequentes, porém em menor escala. Ao adotar atualizações frequentes, porém menores, o risco de cada implementação de mudanças é reduzido. Isso permite que as equipes identifiquem erros com maior agilidade, pois conseguem rastrear a última implantação que causou o problema (AWS, 2023).

Integração Contínua

A Integração Contínua, do inglês Continuous Integration (CI), representa uma mudança de paradigma. Sem ela considera-se o software como não funcional até que se prove que ele funciona, o que acontece durante o estágio de testes ou integração (HUMBLE e FARLEY, “et al”, 2013).

Com a integração contínua assume-se que o software está funcionando com cada mudança, desde que haja um conjunto considerável de testes automatizados. Então, se possibilita identificar qualquer problema de funcionamento para consertá-lo imediatamente. Isso torna essa prática essencial para times profissionais.

Manter o software funcionando o tempo todo a cada vez que alguém introduz uma mudança no código é objetivo da integração contínua. Essa prática requer alguns pré-requisitos para funcionar com eficiência, como publicações de códigos regulares, criação de um conjunto de testes automatizados, processo de compilação e testes curtos (HUMBLE e FARLEY, “et al”, 2013).

Entrega Contínua

A Entrega Contínua, do inglês Continuous Delivery (CD), é um conjunto de práticas técnicas que permite implementações de mudanças para qualquer ambiente por meio de um processo completamente automatizado (HUMBLE e FARLEY, “et al”, 2013). Isso possibilita manter o fluxo de trabalho rápido sem causar problemas e interrupções no ambiente de produção.

A prática de entrega contínua amplia-se a partir da integração contínua, pois promove novas mudanças de código para um ambiente de teste e/ou produção após a fase de construção, garantindo assim um artefato compilado, testado e pronto para implementação de uma nova versão (AWS, 2023).

Fonte: Element 61

As práticas de integração contínua e entrega contínua (CI/CD) proporcionam diversos benefícios, relacionados ao tempo de distribuição e qualidade do produto (AWS, 2023):

  • Maior produtividade: permite que desenvolvedores priorizem atividades mais relevantes ao desobrigá-los de tarefas manuais, tornando a equipe mais produtiva;
  • Redução de erros e bugs: incentiva comportamentos que ajudam a evitar erros e bugs, contribuindo para um produto de melhor qualidade;
  • Identificação de bugs: com testes mais frequentes, a equipe consegue identificar e investigar bugs em estágios iniciais, evitando maiores impactos no futuro;
  • Distribuição rápida de serviços: aumenta a capacidade distribuição de serviços, assegurando implementações de melhorias e novas funcionalidades para o sistema.

Implementação Contínua

A Implementação Contínua, do inglês Continuous Deployment (CD), leva as práticas de integração contínua e entrega contínua (CI/CD) à sua conclusão lógica. Quando uma implementação de mudança é processada com sucesso por todas as fases anteriores, esse novo artefato é automaticamente implementado para o ambiente de produção (JETBRAINS, 2023).

Isso resulta na diminuição do ciclo de feedback, reduzindo o tempo entre a alteração no código e seu uso em produção. Embora a automação da implementação em produção não seja apropriada para todos os produtos e empresas, é importante considerar as etapas necessárias para alcançá-la, pois cada componente individual tem seu próprio valor (JETBRAINS, 2023).

Para tornar mais compreensíveis as práticas de Integração Contínua, Entrega Contínua e Implementação Contínua, faz-se referência à figura a seguir, com o intuito de elucidar esses conceitos:

Fonte: Jetbrains

Microsserviços

Os microsserviços representam uma abordagem no desenvolvimento de um aplicativo, onde ele é decomposto em pequenos serviços independentes, cada um operando como seu próprio processo e se comunicando principalmente por meio de uma API de recursos HTTP. Esses serviços são criados em torno de funcionalidades de negócios específicas e podem ser implantados de forma autônoma, utilizando implementações totalmente automatizadas. A gestão centralizada é mantida minimamente, permitindo a utilização de várias linguagens de programação e tecnologias de armazenamento de dados distintas (MARTIN FOWLER, 2023).

Fonte: Freepik (Editada pelo Autor)

Embora a arquitetura de microsserviços esteja cada vez mais presente no mercado, é necessário amplo conhecimento de seu conceito e características complexas, atentando-se ao princípio da arquitetura evolutiva para o desenvolvimento de produtos baseado na necessidade.

“Qualquer produto ou organização bem-sucedida necessariamente evoluirá no decorrer de seu ciclo de vida” — Jez Humble.

Como este não é um artigo sobre arquitetura e microsserviços, destaca-se somente o conceito básico, a importância e necessidade da compreensão mais ampla desse assunto. Essa prática, assim como as outras, estão diretamente relacionadas à maior capacidade de distribuição de sistemas e serviços, pois uma arquitetura desacoplada promove produtividade, testabilidade e segurança por meio de implementações de mudanças isoladas e menores (KIM, HUMBLE e DEBOIS, “et al”, 2018).

Para melhor entendimento sobre arquitetura de microsserviços, recomenda-se o artigo Microservices, escrito por Martin Fowler, engenheiro de software, autor e palestrante amplamente reconhecido por suas contribuições para a arquitetura de software, padrões de design e metodologias ágeis.

Infraestrutura como Código (IaC)

Para criar um fluxo rápido e confiável necessita-se garantir que sempre seja usado ambientes equivalentes ao ambiente de produção em cada estágio do ciclo de desenvolvimento. Esses ambientes devem ser criados de modo automatizado, idealmente sob demanda de scripts e informações de configuração armazenadas no controle de versão, e ser totalmente self-service, sem nenhum trabalho manual exigido de operações (KIM, HUMBLE e DEBOIS, “et al”, 2018).

Infraestrutura como Código é uma técnica para automação de infraestrutura baseada em práticas de desenvolvimento de software. Por meio de código, são criadas rotinas consistentes e repetíveis para o provisionamento e gerenciamento da infraestrutura (MORRIS, 2021).

Fonte: Hashicorp

No mercado, diversas ferramentas de Infraestrutura como Código estão disponíveis, destaca-se algumas das mais conhecidas e amplamente utilizadas: Terraform, Ansible, Puppet, Chef e AWS CloudFormation.

Além da técnica permitir um fluxo rápido e confiável, também proporciona uma série de benefícios significativos como: documentação, versionamento, histórico, reprodutibilidade, auditoria, testes e validações, padronização, colaboração compartilhada, alto tempo de resposta e redução de custos (MORRIS, 2021).

Para facilitar a compreensão e promover a prática da Infraestrutura como Código, disponibiliza-se Protótipo em Terraform no GitHub, permitindo a exploração e experimento do conceito em um ambiente prático.

 

Monitoramento e Observabilidade

O monitoramento é uma prática técnica que permite às equipes monitorar e compreender o estado dos sistemas. Isso é alcançado por meio da coleta de conjuntos predefinidos de métricas ou registros (GOOGLE, 2023).

A prática possibilita identificar problemas em todo o sistema de maneira ampla e centralizada, incluindo aplicações, ambientes e bancos de dados. Isso permite realizar correções de maneira mais rápida e precisa. Além disso, viabiliza detectar potenciais problemas por meio de anomalias, possibilitando encontrar e corrigir adversidades antes de causar implicações para o sistema e seus usuários (KIM, HUMBLE e DEBOIS, “et al”, 2018).

Já a observabilidade é a técnica que permite às equipes depurar ativamente o sistema. O conceito é baseado em explorar propriedades e padrões não definidos com antecedência (GOOGLE, 2023).

A técnica permite entender o estado interno de um sistema complexo com base em indicadores externos, possibilitando identificar a causa raiz de um problema ao analisar os dados produzidos por ele (IBM, 2023).

Fonte: Freepik

Existem diversas ferramentas de monitoramento e observabilidade no mercado. As mais conhecidas e amplamente utilizadas são Prometheus, Grafana e Zabbix para monitoramento, e Elasticsearch, Kibana, New Relic e Dynatrace para observabilidade.

Em suma, monitoramento e observabilidade se complementam, pois são métodos que permitem descobrir a causa subjacente de problemas. O monitoramento alerta sobre falhas quando ocorrem, enquanto a observabilidade pode fornecer detalhes sobre o que está ocorrendo (IBM, 2023).

Esse artigo foi escrito por André Carvalho, Engenheiro DevOps na SysMap.

No próximo post da nossa série sobre DevOp, falaremos sobre o valor agregado e resultados. Confira a série completa: