O advento da computação em nuvem trouxe grandes mudanças na forma como o software é hospedado e distribuído. Existem serviços online para a maioria das coisas da vida, e isto vale tanto para o varejo quanto para a infraestrutura de computação. Neste artigo, veremos como a integração, entrega e implantação contínuas podem se beneficiar das tecnologias de nuvem, particularmente infraestrutura como código e contêineres.
Quer você seja um novato na configuração de um pipeline de CI/CD ou já tenha uma configuração hospedada localmente, vale a pena entender como essas técnicas e ferramentas podem ser usadas para que você possa adaptá-las às suas necessidades.
A integração contínua e a implantação contínua foram projetadas para tornar o processo de lançamento de software para uso de seus usuários mais rápido e robusto.
Combinar uma abordagem "aos poucos e frequentemente" com a automação - dos builds, da configuração de ambientes e dos testes - reduz o tempo entre o desenvolvimento e o lançamento, ao mesmo tempo em que aumenta a confiança na qualidade do produto.
Os estágios posteriores de um workflow de CI/CD geralmente incluem testes completos e de desempenho, bem como testes manuais, todos exigindo ambientes de teste que espelhem de perto o ambiente de produção. Para obter a máxima eficiência e consistência nos testes, esses ambientes devem ser atualizados automaticamente em vez de mantidos manualmente. Colocar tudo isso em prática requer não apenas habilidades e ferramentas de DevOps, mas também uma grande quantidade de infraestrutura para fornecer suficiente capacidade de computação para o servidor de CI, agentes de build, ambientes de teste e bancos de dados.
O número de máquinas necessárias para dar suporte ao seu processo de compilação depende do tamanho e da complexidade do seu projeto e do número de desenvolvedores que contribuem para ele. No entanto, esse número também pode variar com o tempo.
Se você estiver hospedando e gerenciando toda a sua própria infraestrutura para um pipeline de CI/CD, deverá decidir onde encontrar o equilíbrio entre ter capacidade suficiente para executar vários trabalhos simultaneamente em momentos de alta demanda, em comparação com o custo de compra e manutenção de máquinas que ficam ociosas por períodos significativos de tempo. É aqui que a infraestrutura hospedada em nuvem pode oferecer benefícios significativos.
O advento da infraestrutura hospedada em nuvem trouxe consigo grandes mudanças na forma como a infraestrutura é gerenciada.
Com a infraestrutura como serviço (IaaS), um recurso de computação é fornecido através de máquinas virtuais (VMs) ou contêineres. Se você precisar de mais capacidade, basta solicitá-la (e pagar, é claro): a aquisição, instalação e gestão, além do hardware físico não são mais um problema.
Dessa forma, uma organização não tem visibilidade das máquinas físicas que hospedam essas VMs ou contêineres (além do conhecimento da região geográfica para fins regulatórios e de recuperação de desastres), e isso permitiu uma importante mudança de mentalidade.
Em um contexto de hospedagem em nuvem, os vastos recursos físicos que dão suporte ao serviço permitem tratar os servidores como commodities intercambiáveis e descartáveis, chamado de "cattle" (“gado”). Isto contrasta com a hospedagem convencional, onde servidores há muito são tratados como animais de estimação; eles recebem um nome próprio, recebem cuidados quando ficam doentes e espera-se que vivam por um tempo relativamente longo.
Com a abordagem “gado”, se um servidor precisar ser atualizado ou reparado, ele é simplesmente removido e substituído por um novo que atenda aos requisitos. Nenhum tempo ou esforço é gasto na modificação ou correção de uma instância existente. Em vez disso, a imagem é reconfigurada conforme necessário e uma nova instância é implantada.
Com IaaS, você paga apenas pelo recurso de computação que você usa, então faz sentido adotar a mentalidade do "gado". É aqui que entra a infraestrutura como código (IaC). IaC é uma prática DevOps onde o processo de fornecimento da infraestrutura é repetível através de scripts.
Converter em código todos os detalhes de configuração e mantê-lo no sistema de controle de versões, junto com o código da aplicação, significa que você pode evitar ter que fazer ajustes manuais em ambientes individuais que causariam o surgimento de inconsistências.
Assim como o software sendo desenvolvido, a própria infraestrutura pode ser incluída no pipeline de CI/CD para garantir que ela funcione conforme o esperado, com a vantagem de que as alterações podem ser revertidas facilmente.
Programar sua infraestrutura abre portas para mais automação; ambientes novos podem ser criados automaticamente quando necessários e depois atualizados através do lançamento de uma nova configuração.
Os recursos de computação praticamente ilimitados do provedor IaaS permite que você escale e reduza de acordo com a demanda, garantindo que, se uma instância falhar, ela possa ser substituída imediatamente. Isso significa que sua configuração de CI/CD pode responder aos aumentos na demanda e garantir um serviço confiável.
Com IaaS e CaaS, a manutenção do hardware físico, inclusive a gestão da da capacidade de armazenamento e de rede, além da logística do data center, são gerenciados pelo provedor de nuvem como parte de sua oferta de serviço.
Isto libera sua equipe para se concentrar na otimização dos seus processos de pipeline e para mantê-los seguros. Como o custo é um fator de capacidade de processamento e tempo, vale a pena reservar um tempo para paralelizar as tarefas sempre que possível e assim obter resultados para seus desenvolvedores mais rapidamente do que se menos máquinas fossem usadas por um período mais longo.
Os contêineres aplicam os princípios de IaC e permitem que você utilize a infraestrutura hospedada em nuvem de forma ainda mais eficaz. Um contêiner empacota o software com todas as dependências que ele precisa para ser executado, dando fim aos dias em que se podia dizer “bem, ele funciona na minha máquina” e a procura pelas diferenças de configuração entre sistemas. O Docker é uma das tecnologias de container mais bem conhecidas, mas também há outras opções disponíveis.
Assim como as máquinas virtuais, os contêineres permitem que várias aplicações sejam executadas no mesmo servidor físico, enquanto elas são mantidas isoladas umas das outras. No entanto, ao contrário das VMs, os contêineres não incluem um sistema operacional, o que faz com que ocupem menos espaço, além de também não exigirem uma parte fixa dos recursos da máquina. Como resultado, é possível colocar em uma única máquina muito mais contêineres do que VMs, o que os torna ideais para a implantação de software em infraestruturas hospedadas em nuvem com eficiência.
Adotar contêineres significa empacotar as dependências de ambiente e os detalhes de configuração com o software num único artefato que poderá ser implementado em qualquer máquina que execute o runtime do contêiner.
Uma aplicação pode ser dividida em vários contêineres, como é o caso de uma arquitetura de microsserviços, onde os contêineres precisam ser implantados na mesma máquina ou num cluster de máquinas em rede. Ferramentas de orquestração de contêineres, como Kubernetes, foram desenvolvidas para tornar o trabalho com um grande número de contêineres mais fácil, automatizando tarefas como implantações, gestão e dimensionamento.
O uso de contêineres em um workflow de CI/CD simplifica consideravelmente o processo de implantação da compilação mais recente em diferentes estágios do pipeline. O artefato de build é uma imagem de contêiner que pode ser implantada consistentemente em cada ambiente de teste antes de ser lançada em ambiente de produção.
Com o pipeline de nuvem de CI/CD, os contêineres fazem uso eficiente dos recursos de computação e permitem que você aproveite as ferramentas de automação. Você pode aumentar a capacidade quando a demanda é alta, mas economizará no custo ao eliminar os contêineres, liberando a infraestrutura subjacente quando a demanda for menor.
Além de IaaS, vários provedores de nuvem também oferecem contêineres como serviço (Containers-As-A-Service - CaaS), que permite que as organizações implantem containers diretamente sem precisar gerenciar a plataforma de orquestração e configurar o cluster.
Embora um pipeline de nuvem de CI/CD possa oferecer benefícios significativos em termos de custo de infraestrutura, escalabilidade e confiabilidade, há algumas desvantagens a serem consideradas.
Primeiro, o uso de serviços em nuvem como IaaS e CaaS envolve inevitavelmente uma curva de aprendizado. Se você ainda não tem experiência nessas áreas, os membros de sua equipe precisarão de tempo para aprender ou você precisará ir atrás desse conhecimento. Dito isso, a experiência de trabalhar com tecnologias de nuvem é uma habilidade desejável e dar às suas equipes a oportunidade de desenvolver essas habilidades e usar a tecnologia mais recente pode ser uma vantagem em termos de retenção e contratação de pessoal.
Se o software em desenvolvimento tiver sido projetado para a nuvem, usando microsserviços, contêineres e outras práticas nativas da nuvem, será relativamente simples automatizar o progresso por meio do pipeline de nuvem de CI/CD usando contêineres. Por outro lado, se você estiver trabalhando com uma arquitetura monolítica, empacotar seu software em contêineres pode ser um desafio.
Porém, contêineres não são essenciais para um pipeline hospedado em nuvem e você ainda pode usar máquinas virtuais na infraestrutura de um provedor de nuvem para executar builds e fornecer ambientes de pré-produção consistentes para teste. No entanto, as VMs consomem mais recursos do que os contêineres e os ambientes terão que ser configurados separadamente.
No contexto da nuvem, tempo é dinheiro, e você não vai querer pagar por recursos de computação que vão ficar sem uso. Para que a hospedagem na nuvem seja econômica, é necessário usá-la de forma eficiente. Isso significa aproveitar ferramentas que monitoram o uso e liberar instâncias ociosas depois de um período de tempo de inatividade, ou implementar essa lógica você mesmo. A última opção pode exigir habilidades que sua organização ainda não possui, então vale a pena investigar e comparar as alternativas.
A segurança sempre foi uma preocupação quando se trata de hospedar dados e serviços na nuvem. Para algumas empresas, a simples ideia de ter um software crítico localizado num sistema de propriedade de terceiros é impraticável. Dito isso, muitas organizações estão optando por usar nuvens públicas para hospedar seus serviços ativos e pipelines de implantação, desde o repositório de controle de versões até o servidor de CI e ambientes de teste.
Compreender os potenciais vetores de ataque, desenvolver proteções no seu pipeline para evitar que ele seja usado por agentes mal-intencionados para acessar seu sistema ativo e implementar as melhores práticas em torno de gerenciamento de credenciais, dados de teste e controle de acesso são todas tarefas essenciais para mitigar os riscos.
Embora a infraestrutura como código, contêineres e a orquestração de contêineres tenham suas raízes na tecnologia de nuvem, eles também podem ser usados em infraestruturas híbridas.
As mesmas ferramentas podem ser usadas em nuvens privadas ou em infraestruturas locais, com a ressalva de que há um limite de escalabilidade do pipeline. Se a sua organização está planejando fazer a transição para uma infraestrutura hospedada em nuvem no futuro, a adoção antecipada de ferramentas nativas da nuvem permitirá que você acumule experiência com antecedência e vai facilitar a transição.
A prática de infraestrutura como código, que é nativa da nuvem, traz vários benefícios para integração e implantação contínuas numa infraestrutura local. Para começar, a configuração de um novo ambiente é muito mais rápida, pois você só precisa rodar um script.
Codificar a criação dos ambientes também oferece consistência, para que você possa garantir a paridade entre a configuração dos ambientes de produção e de pré-produção, independente de visar a segurança, o desempenho ou testes da interface do usuário, ou ainda sandboxes para equipes de suporte e vendas. Ao manter os arquivos de configuração da infraestrutura no controle de versões, a equipe terá uma trilha de auditoria de quais alterações foram introduzidas e quando, o que pode facilitar bastante a depuração de problemas de ambiente.
Em alguns casos, organizações poderão decidir usar recursos de nuvem para etapas específicas do seu pipeline de implantação. Por exemplo, os testes de carga e desempenho podem exigir recursos substanciais, assim poderá ser mais econômico criar um ambiente temporário na nuvem para conduzi-los. Ao considerar essa abordagem, é importante levar em conta a complexidade em potencial e o tempo envolvido para mover seu build para uma infraestrutura diferente.
Embora um processo de CI/CD automatizado ofereça vantagens significativas em termos de velocidade de entrega e garantia de qualidade, a infraestrutura disponível é um fator limitante quando se trata de velocidade e rendimento. Ao transferir seu pipeline para a nuvem, você não precisa mais escolher entre garantir servidores suficientes para lidar com o pico de demanda e o custo de compra e gerenciamento de máquinas que não estão em uso constante.
As tecnologias e práticas nativas da nuvem não apenas permitem o uso eficiente da infraestrutura hospedada na nuvem, mas também têm melhorado as técnicas de integração contínua e implantação. As mesmas abordagens também podem ser aplicadas à infraestrutura local, tornando a entrega de software mais rápida e confiável.