O que é um pipeline de CI/CD?

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.

Explicação sobre pipelines de CI/CD

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.

Os estágios de um pipeline de compilação

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:

  1. O processo começa com um commit no branch main (ou em qualquer branch que você tenha nomeado como o branch de CI), que aciona uma build ou um conjunto inicial de testes de unidade. Os resultados normalmente são visíveis em um dashboard. O pipeline pode ser projetado para parar em caso de falhas de compilação ou teste, permitindo que você resolva qualquer problema antes de continuar. Após o commit de uma correção, o pipeline é reiniciado automaticamente desde o início para garantir que tudo esteja funcionando conforme o esperado. Como alternativa, você pode configurar o pipeline para continuar enquanto sinaliza falhas para investigação.
  2. O estágio seguinte envolve uma série de testes automatizados, com feedback fornecido após cada rodada de testes. Os testes geralmente são estruturados de forma que os mais rápidos sejam executados primeiro, fornecendo feedback o mais cedo possível. Testes com uso intenso de recursos são executados por último, mas somente se todas as etapas anteriores tiverem sido concluídas com êxito. Novamente, se algum teste falhar, você poderá interromper o pipeline e recomeçar ou continuar enquanto leva o problema para investigação.
  3. Após a conclusão dos testes automatizados, o software normalmente é implantado em uma série de ambientes de preparo. Alguns deles podem ser usados para testes manuais adicionais, enquanto outros podem ser usados para treinamento, suporte e demonstração para clientes.
  4. O estágio final da arquitetura do pipeline de CI/CD envolve efetivar as alterações. O lançamento pode ser acionado manualmente (no caso da entrega contínua) ou automaticamente (como na implantação contínua).

Vamos nos aprofundar em algumas considerações importantes para cada um desses estágios.

Flags e branches

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.

Construir e testar

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.

Containers vs VMs

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.

Ambientes de pré-produção

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.

Implantação

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:

  • Você deseja controlar quando novos recursos ou funcionalidades serão disponibilizados.
  • Seu processo de implantação envolve tempo de inatividade para seus usuários.
  • Os usuários precisam instalar seu produto, e você deseja agrupar as alterações para entrega de acordo com um cronograma de lançamentos regular.

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.

Entendendo os pipelines de CI/CD em poucas palavras

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.

Como o TeamCity pode ajudar

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.