Skip to content

Capítulo 1: Introdução a Computação em Nuvem

1.6 DevOps

Historicamente, antes do surgimento da Computação em Nuvem, a área de Tecnologia da Informação (TI) era praticamente dividida em dois departamentos:

  • Departamento de Sistemas (ou Desenvolvimento)

    • Formado pelos programadores, analistas de sistemas e arquitetos de software.
  • Departamento de Suporte (ou Operações)

    • Formado pelos administradores de redes, sistemas operacionais, segurança e suporte técnico.

Diante dessa divisão, as equipes de TI trabalhavam de forma isolada, o que era prejudicial para os negócios. A falta de comunicação e colaboração resultava, principalmente, em atrasos na implantação de sistemas (deploy).

Um desenvolvedor de software está focado em "codar" rapidamente para realizar suas entregas, seja implementando uma nova funcionalidade ou corrigindo um bug que impacta a produção.

Por sua vez, a equipe de operações (sysadmins) se concentra em assegurar o funcionamento eficiente e seguro da infraestrutura de TI. Suas atividades incluem o monitoramento da infraestrutura, gerenciamento da capacidade, execução de backups, fornecimento de suporte técnico, gerenciamento de serviços de rede como servidores DNS, HTTP, e-mail, entre outros.

Quando surgia qualquer tipo de problema, seja no software ou na infraestrutura de TI, as equipes frequentemente se culpavam mutuamente, em vez de colaborarem para encontrar soluções e ainda, se concentravam em atividades reativas, como a resolução de incidentes e problemas, em vez de direcionar seus esforços para melhorias proativas e inovações.

Tanto o software quanto a infraestrutura de TI são "entidades vivas" que exigem cuidados constantes. Isso inclui a correção de funcionalidades, a resolução de bugs, a mitigação de problemas de segurança, a redução de custos e o aprimoramento do desempenho. Não se trata de algo que você controí ou programa uma única vez e abandona.

Diante dessas dificuldades enfrentadas pelas equipes de TI frustrados com os atritos constantes das áreas, surge o conceito de DevOps, que visa proporcionar um fluxo de trabalho mais integrado e eficiente entre as equipes de desenvolvimento e operações.

O termo DevOps combina as palavras "Desenvolvimento" e "Operações" e representa uma disrupção na cultura tradicional de implantação de sistemas onde o objetivo é aprimorar a comunicação e a colaboração entre desenvolvedores (devs) e profissionais de operações (sysadmins).

O símbolo do infinito, representado pelo oito deitado, que simboliza o DevOps, demonstra que cada etapa do fluxo de desenvolvimento, implantação, testes e monitoramento deve ser executada sequencialmente, por meio de pequenas entregas constantes, em um ciclo contínuo.

alt_text

DevOps não é uma tecnologia nem sugere a criação de um novo profissional responsável "fim a fim" por toda a TI. Em vez disso, ele promove a integração entre as equipes de desenvolvimento e operações, evitando a formação de silos independentes e buscando tornar a implantação de sistemas mais ágil e menos traumática.

alt_text

Você deve estar se perguntando: qual é a relação entre DevOps e Computação em Nuvem?

A resposta é simples: tudo! A Computação em Nuvem possibilitou tratar a TI como um software, permitindo a criação de recursos de TI por meio de código. Isso significa que praticamente tudo pode ser automatizado desdes a criação da infraestrutura, testes até a implantação do software.

DevOps advoga a automatização de todos os passos necessários para colocar um sistema em produção e monitorar o seu correto funcionamento. A ideia é adotar princípios ágeis não apenas na fase de desenvolvimento, mas também na fase de implantação.

1.6.1 As Etapas do DevOps

As etapas do DevOps formam um ciclo contínuo. Após completar todas as fases, o processo retorna à primeira etapa, iniciando um novo ciclo de melhoria e entrega de novas funcionalidades.

É importante ressaltar que todos os membros da equipe são responsáveis pela entrega do software. Além disso, as etapas de entrega devem ser automatizadas, abrangendo desde a construção do código (build) e a execução de testes até a configuração e ativação dos servidores, a configuração da rede e o carregamento do banco de dados, etc.

A seguir, apresentamos uma breve descrição das etapas do DevOps, acompanhada de algumas das ferramentas mais utilizadas atualmente em cada fase:

Planejar

Nesta etapa, ocorre todo o planejamento, bem como a definição dos requisitos e objetivos do projeto. Em outras palavras, é o momento em que as equipes se alinham sobre o que precisa ser feito e quem será responsável por cada tarefa.

Ferramentas de gerenciamento de projetos, como Jira e Trello, são amplamente utilizadas nesta etapa.

alt_text

Codificar

A fase de "Codificar" no contexto do DevOps refere-se ao processo de desenvolvimento de software, no qual os desenvolvedores escrevem o código-fonte com base nos requisitos e especificações estabelecidos durante a fase de planejamento.

Ferramentas de desenvolvimento, como IDEs (Ambientes de Desenvolvimento Integrados) como VSCode e Eclipse, são amplamente utilizadas nesta etapa.

alt_text

Build + Integrar

Aqui duas ações principais entram em cena: a Build (ou compilação do código-fonte) e a Integração.

A ação de Build tem como objetivo gerar os chamados artefatos, que consistem em versões executáveis do sistema, prontas para serem implantadas (deploy) nos ambientes de desenvolvimento, homologação e produção.

A ação de Integrar está diretamente ligada à Integração Contínua (Continuous Integration ou CI). Essa prática de desenvolvimento sugere que o código em desenvolvimento seja integrado ao código existente por meio de pequenos commits, realizados de forma frequente e em intervalos curtos. Essa abordagem minimiza a acumulação de alterações e novas funcionalidades, evitando que se tornem difíceis de mesclar posteriormente.

Podemos destacar algumas ferramentas de build, como o docker build, que é utilizado para construir imagens de contêineres, Maven projetos Java e o Make, que é comum em projetos de código aberto em C/C++.

Como ferramentas de Integração Contínua, podemos destacar o OCI DevOps, além do Jenkins e Travis CI.

alt_text

Testar

Além de assegurar que o sistema compila sem erros após cada novo commit, é fundamental verificar se ele mantém o comportamento esperado, ou seja, se continua funcionando corretamente.

Os responsáveis por garantir o funcionamento adequado do sistema são os Testes Automatizados, que são implementados nesta etapa do processo.

Ferramentas como PyTest, Gattling, Selenium ou JUnit, são alguns exemplos que podem ser utilizadas nessa etapa.

alt_text

Liberar (Release)

A fase de liberação, ou release, refere-se à versão do software que foi aprovada e está pronta para implantação. O objetivo dessa etapa é que, após a compilação do software e a conclusão dos testes, tenhamos uma nova versão pronta para o deploy.

A versão do software passa por diferentes estágios, incluindo pre-alpha, alpha, beta e release candidate, até que a versão final (gold) seja liberada ao público.

Além desses estágios, existe uma prática recomendada para o versionamento de software conhecida como "Versionamento Semântico" que utiliza números no formato: MAJOR.MINOR.PATCH

alt_text

  • Versão Maior (MAJOR)

    • Indica que ocorreram mudanças incompatíveis com a versão anterior. Por exemplo, a versão 2.0.0 não é compatível com a versão 1.0.0.
  • Versão Menor (MINOR)

    • Indica que novas funcionalidades foram adicionadas ao software, mantendo a compatibilidade com versões anteriores. Por exemplo, a versão 2.1.0 é compatível com a versão 2.2.0.
  • Versão de Correção (PATCH)

    • Indica que houveram pequenas correções no software e que também, não afeta a compatibilidade.

Rótulos adicionais podem ser utilizados para fornecer informações mais específicas sobre a versão do software. Exemplos de rótulos incluem:

  • Alpha

    • Geralmente utilizado para indicar uma versão inicial que ainda está em desenvolvimento e é considerada instável. Exemplo: 1.0.0-alpha
  • Beta

    • Indica uma versão que está mais avançada no desenvolvimento, mas que ainda pode conter bugs e requer feedback dos usuários. Exemplo: 1.0.0-beta
  • RC (release candidate)

    • Refere-se a uma versão quase final, que está pronta para testes finais antes do lançamento oficial. Exemplo: 1.0.0-rc.1

Esses rótulos ajudam a comunicar o estado e a estabilidade da versão do software.

Implantar (deploy)

Na etapa de Implantação, existem duas práticas principais: Deployment Contínuo (Continuous Deployment ou CD) e Entrega Contínua (Continuous Delivery ou CD).

A Entrega Contínua é uma prática que garante que o software esteja sempre em um estado que pode ser implantado em produção a qualquer momento.

Por outro lado, o Deployment Contínuo avança um passo além, permitindo que cada alteração que passa nos testes automatizados seja automaticamente implantada em produção, sem a necessidade de intervenção manual.

Ambas as práticas visam minimizar o tempo entre a conclusão do desenvolvimento e a disponibilização do software para os usuários, de forma automatizada e sem intervenção manual a qualquer hora. O processo deve ser simples como apertar um botão.

Ferramentas de Deployment Contínuo como OCI DevOps, Argo CD ou CircleCI são alguns exemplos que podem ser utilizadas nessa etapa.

alt_text

Operar

A etapa de Operar no contexto de DevOps refere-se à fase em que o software é colocado em produção e monitorado para garantir seu desempenho, disponibilidade e segurança.

Monitoramento

Por fim, a etapa final, Monitoramento, envolve a coleta, análise e interpretação de dados relacionados ao desempenho do software, à infraestrutura e à experiência do usuário.

Uma monitoração eficaz inclui a utilização de métricas de desempenho, logs e traces, que são essenciais para identificar problemas, otimizar o funcionamento do sistema e garantir uma experiência satisfatória para os usuários.

Ferramentas de observabilidade, como Oracle Application Performance Monitoring (APM), Prometheus e Grafana, são exemplos.

alt_text