Sucesso na integração contínua com os branches de recurso e o Bamboo

Os branches facilitam o lançamento de imediato, mas vêm com uma pegadinha.

Sepideh Setayeshfar Sepideh Setayeshfar

Não é segredo que os desenvolvedores precisam de liberdade para fazer alterações e executar testes sem medo de estragar a linha de código principal. E eles podem fazer essas ações graças aos branches, o elemento mágico que permite que partes do código sejam modificadas, desenvolvidas e testadas em isolamento e em paralelo.

Graças ao Git e ao Mercurial, os branches de processo passaram de uma ideia utópica para o mundo prático, como discutimos melhor em 5 dicas de repositórios ideais do Git para a integração contínua. Mas, apesar de todos os benefícios, o uso de branches em um pipeline de entrega contínua pode criar dois problemas distintos:

Requisitos

Tempo:

30 minutos

Público-alvo:

Você é novo na implementação contínua e/ou no Bitbucket Pipelines

Pré-requisito:

Experimente grátis

Duplicação e desvio da configuração de build

  • Quando um desenvolvedor cria uma ramificação, é necessário clonar de modo manual um monte de configurações de build no servidor de integração contínua. Por ser uma etapa manual, alguns desenvolvedores não se preocupam com ela e, assim, nenhum teste é executado conforme o recurso é desenvolvido. Mesmo quando nos preocupamos em copiar as configurações de integração contínua para as ramificações de recurso, muitas vezes acabamos fazendo pequenos ajustes. Depois, clonamos as configurações ajustadas para o próxima ramificação de recurso, fazemos mais ajustes e, às vezes, a configuração de build se desvia da configuração original da qual foi clonada, causando problemas de administração (e surpresas desagradáveis quando é feito o merge da ramificação de volta para a principal).

Incerteza do estado de integração

  • Se não fizermos merges constantes das alterações da linha principal (vou chamá-la de principal) na ramificação e executarmos os testes, sempre vai haver incerteza em relação ao funcionamento das alterações, pelo menos até que ocorra o merge da ramificação na linha principal. Como se sabe, as alterações não funcionam conforme o esperado e a ramificação principal fica poluída com um código errado, acabando com a justificativa de usar as ramificações de recurso e integração contínua!

O Bamboo tratou e resolveu esses dois problemas com um recurso que chamamos de branches de plano, que serão explicados em detalhes aqui. Leia mais!

Planejar ramificações para branches de recursos

Uma ramificação do plano é um elemento do plano de build no Bamboo que corresponde a uma ramificação no repositório. Ela herda toda a configuração definida pelo plano pai, porém, em vez de construir com base no mestre, ela é construída com base em uma ramificação. Então, quando o build da ramificação é bem-sucedido, é possível fazer o merge automático das alterações da ramificação para a principal. Como alternativa, builds da ramificação bem-sucedidos podem ser implementados em um ambiente de teste usando os recursos de implementação do Bamboo (mais sobre esse assunto em outro artigo).

Como você pode ver na captura de tela abaixo, o plano chamado "A CI Tests" está criando não apenas o mestre, mas também a ramificação de integração e ramificações dedicadas a itens únicos do Jira (BDEV-10045-bump-tomcat-plugin-5-1, por exemplo). O Bamboo facilita a localização de quais planos têm ramificações exibindo o símbolo de ramificação.

Captura de tela de branches do plano do painel de build do Bamboo

Para fazer essa configuração para um plano existente...

  • Entre como um usuário com privilégios de administrador para esse plano.
  • Vá para a tela de configuração clicando no ícone de lápis no painel do Bamboo ou usando o menu de ações na tela de resultados construída.
  • Na tela de configuração, clique na aba Braches.

A partir daqui, podemos configurar o Bamboo para fazer a detecção automática de novos branches no repositório e criar o branch do plano correspondente. Observe que a detecção automática de branch está disponível apenas para repositórios Git, Mercurial e Subversion. Mas não se sinta excluído caso você use outro sistema de controle de versão como o TFS ou Perforce. Você também pode fazer a criação manual de um branch do plano.

Dica Pro: é provável que não queira compilar cada branch que criar. Se usar uma convenção de nomenclatura em que todas as ramificações que você quer testar começam com "recurso*", por exemplo, o Bamboo vai poder ser configurado para criar apenas branches de plano que correspondam a esse prefixo. (Você também pode usar expressões regulares nessas configurações).

Captura de tela de gerenciamento de branches de configuração do Bamboo

Como a maioria dos branches de recursos são de curta duração (3-4 dias no máximo), você pode configurar o plano para remover o branch e seus resultados de build do Bamboo após um certo número de dias de inatividade. Podendo ser desativado em uma base por branch se você quiser mantê-lo por um período indefinido, após o qual você terá que removê-lo manualmente. Não se preocupe: se você remover um branch do plano de forma automática ou manual, o Bamboo não vai remover o próprio branch do seu repositório — deixamos essa decisão com você. Dito isto, desabilitar a limpeza automática definitiva para alguns branches é uma boa ideia para situações em que você pode manter um branch "estável de longa duração do seu projeto.

Compilando cada build da maneira mais fácil

Embora seja muito recomendável usar o Git, é possível criar um build do plano para qualquer sistema de controle de versão compatível com o Bamboo. Para fazer a criação manual de um branch de plano...

  • Vá para a tela de resultados do build do seu plano e selecione configurar plano no menu Ações.
  • Clique na guia Branches e, em seguida, clique no botão Criar branches.
  • Para Git e Mercurial, será exibida uma caixa de diálogo listando todos os branches disponíveis no repositório que ainda não têm um branch de plano correspondente no Bamboo.
  • Escolha um branch e pressione Criar.
  • Usuários de repositórios VCS centralizados serão solicitados a simplesmente escolher um nome, uma descrição e que branch desejam usar (para Subversão, é o URL do branch) antes de clicarem em criar.
Captura de tela de Criar branch do plano

Agora você pode desabilitar a limpeza automática para o branch de plano atual se quiser e, no caso de repositórios DVCS, configurar uma estratégia de mesclagem. As estratégias de mesclagem permitem que o Bamboo faça o merge automático do código entre os branches em builds bem-sucedidos (vamos ver mais sobre esse assunto mais adiante). Neste ponto, também é possível sobrescrever as informações do repositório (se você estiver usando Ramificações do plano com Subversão, você pode alterar a URL do SVN de tronco para branch aqui) ou sobrescrever as variáveis de build. Por exemplo, você pode ter uma variável que especifica se você vai implementar na produção que você quer alterar para o branch do plano.

Captura de tela das configurações do branch de configuração do Bamboo

Como as etapas de build para builds de plano pai e builds de branch de plano funcionam exatamente da mesma forma, configurações como acionadores e notificações serão herdadas do plano pai. No entanto, você pode substituir essas configurações (e mais) por branch nas configurações de cada branch do plano.

Mesclando branches automaticamente

Como você não sabe mesmo se tudo funciona até mesclar alterações para (ou da) a principal, o Bamboo oferece duas maneiras de fazer o merge automático em repositórios DVCS. Chamamos essas opções "Branch Updater" e "Gatekeeper," e você pode usar qualquer método em qualquer ramificação do plano. Antes que o build seja executado, o Bamboo vai mesclar a ramificação mais recente da principal na ramificação se você estiver usando o branch updater, ou checkout main e mesclar alterações de sua ramificação se você estiver usando o gatekeeper. (Saiba mais sobre como escolher um modelo de merge nos documentos do Bamboo.) O Bamboo, em seguida, prossegue para executar o build.

Captura de tela de Mesclando branches

Se o build for bem-sucedido e você tiver ativado a opção push on success, o commit da ramificação vai ser feita e ela vai ser enviada para o repositório no ato. Se você estiver usando o modelo do gatekeeper, vai ser feito o push das alterações na ramificação para a principal. Se estiver usando o modo de atualizador de ramificação, a ramificação do recurso vai ser atualizada com as alterações acontecendo na principal.

Captura de tela dos detalhes da integração do resultado de build do Bamboo

Essa sim é uma integração contínua!

Como mencionei anteriormente, os branches do plano podem ser conectados com projetos de implementação e se tornar parte dessa fase do ciclo de entrega contínua. Continue lendo para saber mais.