O que é DevOps?

Em um modelo tradicional de desenvolvimento de software, os desenvolvedores escrevem grandes quantidades de código para novos recursos, produtos, correções de bugs e outros, e depois passam seu trabalho para a equipe de operações para implantação, geralmente por meio de um sistema automatizado de emissão de tíquetes. A equipe de operações recebe essa solicitação em sua fila, testa o código e o prepara para a produção, um processo que pode levar dias, semanas ou meses. Nesse modelo tradicional, se as operações tiverem algum problema durante a implantação, a equipe envia um tíquete de volta aos desenvolvedores para informá-los sobre o que deve ser corrigido. Eventualmente, depois que esse vai-e-vem é resolvido, a carga de trabalho é colocada em produção.

Esse modelo torna a entrega de software um processo demorado e fragmentado. Os desenvolvedores geralmente veem as operações como um obstáculo, que atrasa os cronogramas de seus projetos, enquanto as equipes de operações se sentem como um depósito de problemas de desenvolvimento.

O DevOps resolve esses problemas unindo as equipes de desenvolvimento e operações durante todo o processo de entrega de software, permitindo que elas descubram e corrijam problemas mais cedo, automatizem testes e implantações e reduzam o tempo de lançamento no mercado.

Para entender melhor o que é DevOps, vamos primeiro entender o que não é DevOps.

 

DevOps não é

  • Uma combinação das equipes de desenvolvimento e operações: Ainda há duas equipes; elas apenas operam de forma comunicativa e colaborativa.
  • Sua própria equipe separada: Não existe um "engenheiro de DevOps". Embora algumas empresas possam nomear uma equipe de DevOps como piloto ao tentar fazer a transição para uma cultura de DevOps, DevOps refere-se a uma cultura em que desenvolvedores, testadores e pessoal de operações cooperam durante todo o ciclo de vida de entrega de software.
  • Uma ferramenta ou conjunto de ferramentas: Embora existam ferramentas que funcionam bem com um modelo DevOps ou que ajudam a promover a cultura DevOps, o DevOps é, em última análise, uma estratégia, não uma ferramenta.
  • Automação: Embora seja muito importante para uma cultura DevOps, a automação por si só não define o DevOps.

 

Definição de DevOps

Em vez de os desenvolvedores codificarem grandes conjuntos de recursos antes de entregá-los cegamente às operações para implantação, em um modelo DevOps, os desenvolvedores frequentemente entregam pequenas quantidades de código para testes contínuos. Em vez de comunicar problemas e solicitações por meio de um sistema de emissão de tíquetes, as equipes de desenvolvimento e operações se reúnem regularmente, compartilham análises e são co-proprietárias de projetos de ponta a ponta.

 

Pipelines de CI/CD

DevOps é um ciclo de integração contínua e entrega contínua (ou implantação contínua), também conhecido como pipelines de CI/CD. O pipelines de CI/CD integra as equipes de desenvolvimento e operações para melhorar a produtividade por meio da automação da infraestrutura e dos fluxos de trabalho, além de medir continuamente o desempenho dos aplicativos. É assim:

Etapas e fluxo de trabalho de DevOps do pipelines de CI/CD
Figura 1: Etapas e fluxo de trabalho de DevOps do pipelines de CI/CD
  • A integração contínua exige que os desenvolvedores integrem o código em um repositório várias vezes por dia para testes automatizados. Cada check-in é verificado por uma compilação automatizada, permitindo que as equipes detectem problemas antecipadamente.
  • A entrega contínua, que não deve ser confundida com a implantação contínua, significa que o pipeline de CI é automatizado, mas o código deve passar por verificações técnicas manuais antes de ser implementado na produção.
  • A implantação contínua leva a entrega contínua um passo adiante. Em vez de verificações manuais, o código passa por testes automatizados e é implantado automaticamente, dando aos clientes acesso instantâneo a novos recursos.

 

 

DevOps e segurança

Um dos problemas do DevOps é que a segurança muitas vezes passa despercebida. Os desenvolvedores se movem rapidamente e seus fluxos de trabalho são automatizados. A segurança é uma equipe separada, e os desenvolvedores não querem diminuir a velocidade das verificações e solicitações de segurança. Como resultado, muitos desenvolvedores implantam sem passar pelos canais de segurança adequados e, inevitavelmente, cometem erros de segurança prejudiciais.

Para resolver isso, as organizações estão adotando o DevSecOps. O DevSecOps pega o conceito por trás do DevOps - a ideia de que os desenvolvedores e as equipes de TI devem trabalhar juntos, em vez de separadamente, durante a entrega do software - e o amplia para incluir a segurança e integrar verificações automatizadas em todo o pipelines de CI/CD. Isso resolve o problema de a segurança parecer uma força externa e permite que os desenvolvedores mantenham a velocidade sem comprometer a segurança dos dados.

 

Perguntas frequentes sobre DevOps

A infraestrutura como código (IaC) envolve o gerenciamento e o provisionamento da infraestrutura de TI por meio de arquivos de definição legíveis por máquina. As plataformas de IaC, como Terraform e AWS CloudFormation, permitem a automação da configuração da infraestrutura, possibilitando implantações consistentes e repetíveis. Ao tratar a infraestrutura como software, as organizações podem aplicar práticas de controle de versão, testes e integração contínua às mudanças na infraestrutura, aumentando a agilidade e a confiabilidade.
A integração contínua (CI) é uma prática de desenvolvimento em que os desenvolvedores mesclam frequentemente as alterações de código em um repositório central, acionando compilações e testes automatizados. O CI detecta erros de integração o mais rápido possível, melhorando a qualidade do software e reduzindo o tempo de entrega de novas atualizações. Ele forma a base para a entrega contínua de aplicativos em ambientes de produção.
A entrega contínua (CD) amplia a integração contínua ao implantar automaticamente todas as alterações de código em um ambiente de teste ou produção após o estágio de construção. O CD permite que os desenvolvedores garantam que seu código esteja sempre em um estado implantável, facilitando uma entrega mais rápida e contínua aos usuários finais. Ele preenche a lacuna entre o desenvolvimento e as operações, promovendo um ciclo de vida de software mais ágil e responsivo.
A implantação contínua é a liberação automática de alterações validadas para a produção, sem a necessidade de intervenção manual. É um passo além da entrega contínua, em que cada alteração que passa por todos os estágios do pipeline de produção é liberada para os clientes. Essa prática acelera o ciclo de feedback e melhora a eficiência e a confiabilidade do processo de liberação.
A automação funciona por meio da execução de instruções predefinidas para gerenciar tarefas sem intervenção humana. Na segurança em nuvem, as ferramentas de automação implantam políticas, verificam vulnerabilidades e respondem a ameaças, simplificando as operações de segurança. Eles interagem com APIs de nuvem, empregando scripts e fluxos de trabalho para provisionamento de recursos, aplicação de conformidade e orquestração de processos complexos com eficiência.
O gerenciamento de configuração refere-se à manutenção dos sistemas em um estado desejado e consistente. Ele rastreia as alterações e configurações de software e hardware para evitar desvios e alterações não autorizadas. Ferramentas como Ansible, Puppet e Chef automatizam as alterações de configuração em todo o ambiente de TI, garantindo que os sistemas sejam configurados de forma correta e uniforme.
A orquestração automatiza o gerenciamento de tarefas e fluxos de trabalho complexos em vários sistemas e serviços. Ele coordena tarefas automatizadas em um processo coeso, gerenciando interdependências e sequenciando ações. Em ambientes de nuvem, ferramentas de orquestração como o Kubernetes gerenciam aplicativos em contêineres, lidando com implantação, escala e rede para otimizar a utilização de recursos e manter o desempenho dos aplicativos.
Os microsserviços são uma abordagem de design em que os aplicativos são compostos de serviços pequenos e independentes que se comunicam por meio de APIs bem definidas. Cada serviço se concentra em um único recurso comercial, executa seu próprio processo e pode ser implantado de forma independente. Essa arquitetura aumenta a escalabilidade, acelera os ciclos de desenvolvimento e melhora o isolamento de falhas.
O monitoramento e o registro são essenciais para manter o desempenho operacional e a segurança em ambientes de nuvem. O monitoramento oferece visibilidade em tempo real da infraestrutura, dos aplicativos e dos serviços, permitindo o gerenciamento proativo da integridade e do desempenho do sistema. O registro grava eventos e pontos de dados, que são vitais para a solução de problemas, análise forense e auditoria de conformidade. Juntos, eles permitem a rápida detecção e resposta a incidentes, garantindo disponibilidade e segurança continuamente.
Os sistemas de controle de versão rastreiam e gerenciam alterações em códigos, documentos ou outras coleções de informações. Eles facilitam a colaboração entre as equipes de desenvolvimento, mantêm um histórico de alterações e permitem a reversão para versões anteriores, se necessário. O controle de versão é fundamental para gerenciar bases de código, reduzir conflitos e garantir que as implantações sejam consistentes e rastreáveis.
As estratégias comuns de implantação incluem implantações blue-green, em que dois ambientes idênticos são executados em paralelo, e um serve como ambiente ativo enquanto o outro hospeda a nova versão. As versões Canary implementam as alterações de forma incremental em um pequeno subconjunto de usuários antes de uma implantação mais ampla. As atualizações contínuas substituem gradualmente as instâncias da versão antiga pela nova, reduzindo o tempo de inatividade e o risco.
Acontainerização encapsula um aplicativo e suas dependências em um contêiner que pode ser executado em qualquer ambiente de computação. Essa abordagem fornece uma alternativa leve às máquinas virtuais, oferecendo eficiência e consistência em ambientes de desenvolvimento, teste e produção. A conteinerização simplifica a implantação, o dimensionamento e o gerenciamento de aplicativos, isolando-os da infraestrutura subjacente.
O Docker é usado para criar, implantar e executar aplicativos por meio de contêineres. Ele permite que os desenvolvedores empacotem um aplicativo com todas as suas dependências em uma unidade padronizada. O Docker fornece as ferramentas e a plataforma para gerenciar o ciclo de vida dos contêineres, incluindo a criação de imagens, a orquestração de contêineres, a escala e a rede.
O Kubernetes orquestra aplicativos em contêineres, gerenciando sua implantação, escala e operações. Ele garante que o estado desejado dos aplicativos corresponda ao estado real no ambiente de nuvem. O Kubernetes automatiza o balanceamento de carga, monitora a integridade do aplicativo e fornece recursos de autocorreção reiniciando ou substituindo contêineres que falham ou não respondem. Ele também lida com a descoberta de serviços e pode gerenciar configurações e informações confidenciais como segredos.
Um pipeline de compilação consiste em uma série de processos automatizados para compilar código, executar testes e implantar software. Ele começa com a recuperação de código do controle de versão, seguido pela criação de executáveis, execução de testes automatizados e implantação em vários ambientes. O pipeline foi projetado para fornecer feedback em cada estágio, garantindo a qualidade do código e simplificando o caminho do desenvolvimento à produção.
A automação de testes acelera a validação da funcionalidade, da segurança e do desempenho do software. Ele permite testes repetitivos e extensivos sem esforço manual, aumentando a consistência e a cobertura. Os testes automatizados podem ser executados em vários ambientes e dispositivos simultaneamente, fornecendo feedback rápido aos desenvolvedores e reduzindo o tempo de lançamento de novas versões no mercado.
Um repositório de código é um local de armazenamento para código e seus arquivos associados, facilitando o controle de versão e a colaboração. Ele atua como o hub central para armazenar, rastrear e gerenciar alterações na base de código. Os repositórios suportam ramificação e mesclagem, permitindo que os desenvolvedores trabalhem em recursos, correções ou experimentos em ambientes isolados antes de integrar as alterações no código principal.
O gerenciamento de versões abrange o planejamento, a programação e o controle de compilações de software em diferentes estágios e ambientes. Inclui o gerenciamento do pipeline de lançamento, a coordenação com as partes interessadas, a garantia da conformidade com os critérios de lançamento e a implantação do software na produção. O objetivo do processo é fornecer novos recursos e correções de forma confiável e eficiente, com o mínimo de interrupção dos serviços.
A metodologia ágil enfatiza o desenvolvimento iterativo, a colaboração com o cliente e a capacidade de resposta às mudanças. Ele defende versões pequenas e incrementais, feedback contínuo e planejamento adaptativo. Os princípios ágeis promovem a colaboração entre equipes multifuncionais, ritmo de desenvolvimento sustentável e práticas reflexivas para melhorar continuamente os processos e produtos.
A arquitetura sem servidor permite que os desenvolvedores criem e executem aplicativos sem gerenciar a infraestrutura do servidor. Ele abstrai os servidores, permitindo que os desenvolvedores se concentrem apenas em escrever código. Os provedores de nuvem gerenciam o ambiente de execução, gerenciando dinamicamente a alocação de recursos. As arquiteturas sem servidor são dimensionadas automaticamente de acordo com a demanda e os usuários pagam apenas pelo tempo de computação consumido.
O ajuste de desempenho envolve a otimização das configurações do sistema e do código para melhorar as métricas de desempenho, como tempo de resposta, taxa de transferência e uso de recursos. Isso requer a criação de perfis e o monitoramento de aplicativos para identificar gargalos, seguido pelo ajuste de configurações, otimização de código e garantia de alocação eficiente de recursos para aumentar a eficiência geral do sistema.
A resiliência e a confiabilidade são garantidas pelo projeto de sistemas tolerantes a falhas que podem lidar com falhas e se recuperar delas sem interrupção do serviço. A implementação de redundância, mecanismos de failover, testes regulares de procedimentos de recuperação de desastres e monitoramento em tempo real contribuem para uma arquitetura de sistema robusta. Essas práticas ajudam a manter o desempenho e a disponibilidade consistentes, apesar do estresse do sistema ou de problemas inesperados.