O que é exatamente um pipeline de integração contínua/entrega contínua? E como você cria um?
Se você está se informando sobre integração, entrega e implantação contínuas (conhecidas coletivamente como CI/CD), é quase certo que já se deparou com o termo “pipeline automatizado” e aprendeu como ele desempenha um papel central na implementação dessas práticas.
CI/CD é uma prática de DevOps que ajuda você a fornecer software com mais rapidez, sem comprometer a qualidade. CI/CD envolve fazer commit de alterações com frequência, testar essas atualizações rigorosamente e responder prontamente ao feedback. Ter um pipeline de CI/CD automatizado é essencial para essa maneira de trabalhar.
Quando falamos sobre um pipeline de CI/CD, estamos nos referindo ao processo que leva o código do seu ambiente de desenvolvimento ao longo de várias etapas, como teste e preparação, entregando-o, em última análise, às mãos dos usuários.
O objetivo do CI/CD é executar esse processo regularmente – várias vezes por dia ou até mesmo por hora – e, por isso, é essencial automatizar seu pipeline de CI/CD o máximo possível. Se uma etapa é concluída com êxito, a próxima deve ser acionada automaticamente. Se uma etapa falha, esse feedback deve ser comunicado rapidamente para que o problema possa ser resolvido.
Automatizar seus pipelines de CI/CD não só acelera o processo geral de construção, teste e implantação de software, como também garante que cada etapa seja executada de maneira consistente e confiável.
Embora o formato exato do seu pipeline de CI/CD dependa do seu produto e da sua organização, há um padrão geral que todos os pipelines tendem a seguir:
Vamos nos aprofundar em algumas considerações importantes para cada um desses estágios.
O primeiro passo para adotar a integração contínua é colocar toda a sua base de código em um sistema de controle de versão, ou VCS (também conhecido como gerenciamento de controle de fontes ou SCM), como o Git, o Mercurial ou o Perforce, e então fazer com que todos na sua equipe adquiram o hábito de fazer commit de suas alterações com frequência. Cada commit em main inicia o pipeline de integração contínua, executando o processo de build e testes do código para fornecer feedback rápido sobre as alterações mais recentes.
Embora commits frequentes sejam uma prática importante no pipeline de CI/CD, se você estiver trabalhando em um recurso maior que demorará vários dias ou semanas para ser concluído, commits periódicos durante esse processo podem parecer um tanto contraproducentes.
Por um lado, enviar suas alterações pelo pipeline em incrementos regulares fornece feedback rápido. Isso também diminui a probabilidade de haver conflitos de merge complexos que seriam mais comuns se você esperasse até concluir a implementação do recurso.
Por outro lado, enviar recursos inacabados pelo pipeline pode não ser o ideal. Compartilhar trabalho incompleto com usuários, mesmo em ambientes de teste, também pode não ser desejável.
Flags de recursos e branches de recursos oferecem maneiras de contornar esse problema. Com flags de recursos, você especifica os ambientes nos quais seu código é visível para os usuários. Embora o commit de suas alterações para o main ainda seja feito, permitindo que estejam visíveis para sua equipe, você decide quando a funcionalidade ficará disponível para preparação e produção.
Os branches de recursos permitem que você desenvolva seu recurso em um branch separado sem perder os benefícios de builds e testes automatizados. Ao acionar o pipeline de CI/CD em cada commit para um branch de recursos, assim como faria com um commit em main, você pode obter feedback rápido sobre o resultado da build.
Depois de acionar uma instância do seu pipeline com um commit, os estágios de build e teste são executados em seguida. Se você tiver testes de unidade automatizados, eles geralmente são executados antes do build junto com linting e verificações de análise estática.
A ferramenta de build que você usa (como Ant ou Maven) e os detalhes das etapas de build dependem da linguagem e do framework no qual você está trabalhando. Ao executar o build automatizado num servidor de build dedicado, você pode evitar problemas posteriores causados por dependências ausentes; o clássico problema “funciona na minha máquina”.
A etapa de build produz os artefatos do aplicativo, que podem incluir instaladores, binários ou containers. Esses artefatos são então implantados em ambientes de teste e integrados a outros componentes do sistema para executar testes automatizados de nível superior: testes de integração, testes de componentes e testes completos, bem como testes não funcionais, como análises de desempenho e segurança.
Esses testes podem ser executados em paralelo para acelerar o pipeline e fornecer um feedback mais rápido.
Para que os resultados dos seus testes automatizados sejam confiáveis, você precisa garantir que eles sejam executados de forma consistente.
O ideal é que seus ambientes de teste sejam configurados para se assemelhar ao máximo possível com a produção e devem ser reiniciados entre cada execução dos testes para evitar que inconsistências do ambiente interfiram nos resultados do teste.
As máquinas virtuais (VMs) são há muito tempo uma escolha popular para a execução de ambientes de teste, já que você pode programar em linguagem script todo o processo de atualizá-los para cada novo build em teste.
No entanto, encerrar e reiniciar novas VMs leva tempo, enquanto seus scripts precisarão incluir as configurações de cada ambiente virtual, para que possa fornecer todas as dependências de que o software precisa para ser executado. Quando novas dependências são adicionadas, os scripts do ambiente precisam ser atualizados: um detalhe fácil de esquecer até que você se pergunte por que seu build não está executando.
Você pode evitar esses problemas empacotando seu código em um container como parte da etapa inicial do build. Um container inclui todas as dependências que o software precisa para executar, fazendo com que ele seja altamente portátil e mais fácil de implantar em diferentes ambientes.
Se estiver hospedando seus pipelines de CI/CD em sua própria infraestrutura, você ainda precisará de VMs onde implantar os containers, mas haverá menos trabalho envolvido na preparação dos ambientes de teste. Se estiver executando seu pipeline na nuvem, usar containers significa que você poderá aproveitar as vantagens dos serviços gerenciados e transferir o gerenciamento da infraestrutura para seu provedor de nuvem.
O número de ambientes de teste e preparação em sua arquitetura de pipeline dependerá do que você está criando e das necessidades dos diferentes grupos de partes interessadas na sua organização. Os exemplos incluem testes exploratórios, análises de segurança, pesquisa de usuário, demonstrações de vendas, ambientes de treinamento e sandboxes para que a equipe de suporte possa replicar os problemas do cliente.
Automatizar a criação e a implantação nesses ambientes é mais eficiente do que atualizá-los manualmente. Você também pode configurar diferentes acionadores de pipeline para diferentes ambientes.
Por exemplo, embora seus ambientes de teste possam ser atualizados a cada build, você pode decidir atualizar os ambientes de teste com menos frequência, talvez apenas uma vez por dia ou uma vez por semana junto com o último build de sucesso.
Depois que suas alterações de código tiverem passado por cada um dos estágios anteriores do pipeline com sucesso, elas estarão prontas para serem liberadas para produção. Essa etapa final pode ser manual ou automática.
O lançamento manual (entrega contínua) é útil quando:
Com a implantação contínua, o lançamento é automático. As alterações entram em vigor desde que tenham passado por todas as etapas anteriores. Para equipes maiores que fazem commits com frequência, isso pode significar implantar atualizações para os usuários dezenas de vezes por dia, um feito que é praticamente impossível sem um pipeline automatizado.
CI/CD é uma prática de DevOps que usa automação para fornecer feedback rápido sobre cada estágio do ciclo de vida do desenvolvimento de softwares. Descobrir problemas introduzidos pelas alterações de código mais recentes torna o desenvolvimento de software mais eficiente. Ao fazer "shift left" (antecipar as interações e obter feedback mais cedo), você terá a capacidade de falhar rápido, e construir um pipeline automatizado vai ajudar a colocar essas técnicas em prática.
Quando se trata de projetar seu próprio processo de CI/CD, é uma boa ideia construí-lo em etapas, começando com a integração contínua. Os estágios exatos do pipeline e a lógica que determina quando cada estágio é disparado dependem do seu produto e da sua organização.
A escolha de uma plataforma de CI/CD que ofereça flexibilidade para configurar seu pipeline de acordo com seus requisitos exclusivos e, ao mesmo tempo, seja fácil de gerenciar, ajudará você a criar um processo de lançamentos confiável e a melhorar a qualidade do seu software.
Nossa solução TeamCity Pipelines ajuda a automatizar os seus processos já existentes de CI/CD.
O TeamCity Pipelines tem suporte a todos os principais sistemas de controle de versões, integra-se com ferramentas populares de build, teste e gerenciamento de pacotes, e pode transformar os seus fluxos de trabalho de desenvolvimento em pipelines automatizados e eficientes.
Opções flexíveis de acionamento e um editor visual de pipeline facilitam a configuração de pipelines para qualquer workflow. As configurações são armazenadas automaticamente como código, dando a você a liberdade de criar e gerenciar os seus pipelines em uma interface gráfica e desfrutar dos benefícios da configuração como código.
As opções de implantação local e nativa na nuvem do TeamCity oferecem flexibilidade para executar os seus pipelines onde você desejar e escaloná-los conforme a demanda. Recursos como a paralelização de testes e o feedback em tempo real ajudam você a detectar falhas rapidamente, para você ter uma experiência mais produtiva como desenvolvedor.
Ainda tem dúvidas? Saiba mais em nossa seção de Perguntas frequentes.