DevOps & CI/CD Nathan Geeksman

Git Flow vs. Trunk Based Development: Qual estratégia de branch usar?

Git Flow vs. Trunk Based Development: Qual estratégia de branch usar?

Git Flow vs. Trunk Based Development: Qual estratégia de branch usar?

Introdução

O desenvolvimento de software é um processo contínuo que envolve a criação, manutenção e evolução de sistemas complexos. Com o tempo, as equipes de desenvolvedores têm buscado formas eficientes e escaláveis para gerenciar seu código-fonte e processos de trabalho. Nesse contexto, duas estratégias de branchagem ganharam destaque: Git Flow e Trunk-Based Development (TBD). Essas abordagens pretendem melhorar a produtividade, reduzir conflitos e facilitar a colaboração em projetos de software. Neste artigo, vamos explorar as principais características das estratégias Git Flow e TBD para ajudá-lo a decidir qual é a mais adequada para sua equipe.

Ao ler este artigo, você aprenderá sobre os pontos fortes e fracos das duas estratégias, além de entender como elas podem ser implementadas em seu projeto. Além disso, você receberá dicas práticas para ajudá-lo a escolher a melhor abordagem para sua equipe.

O que é e por que importa

O Git Flow e o Trunk-Based Development são estratégias de branchagem utilizadas no desenvolvimento de software para gerenciar a vida cíclica do código-fonte. Elas visam proporcionar maior produtividade, reduzir conflitos entre colaboradores e facilitar a colaboração.

Git Flow

O Git Flow é uma abordagem que utiliza múltiplas branches para o desenvolvimento de software. As principais características incluem:

  • Ramificação Master: Armazena a versão mais recente do código-fonte.
  • Ramificação Develop: Representa a última versão estável do código-fonte.
  • Feature Branches: Cada uma delas é dedicada ao desenvolvimento de uma nova funcionalidade específica.
  • Release Branches: São utilizadas para liberar uma versão específica do software.

O Git Flow foi projetado para fornecer uma estrutura rigorosa e escalável, adequada para grandes equipes. Porém, pode se tornar complexo devido à necessidade de manter múltiplas branches sincronizadas.

Trunk-Based Development (TBD)

Por outro lado, o Trunk-Based Development utiliza apenas uma única branch principal, conhecida como trunk, que é atualizada com frequência. O desenvolvimento ocorre diretamente na trunk. As principais características incluem:

  • Branches de Desenvolvimento: São criadas ocasionalmente para realizar alterações específicas.
  • Merges: Eventos que ocorrem quando a branch de desenvolvimento é integrada à trunk.

O TBD foi projetado para promover uma abordagem mais simples e flexível, adequada para equipes menores ou com processos de trabalho mais estáveis.

Como funciona na prática

Git Flow

Ciclo de Desenvolvimento:

  • Criar uma feature branch a partir da branch develop.
  • Realizar alterações e desenvolver funcionalidades.
  • Revisar e testar as alterações no ambiente de desenvolvimento.
  • Solicitar revisão de outros colaboradores ou gerentes.
  • Receber feedback e realizar ajustes necessários.

Integração na branch develop:

  • Realizar merge da feature branch na branch develop.
  • Resolver conflitos, se necessário.
  • Manter a branch develop atualizada com as últimas alterações.

Ciclo de Liberação:

  • Criar uma release branch a partir da branch develop.
  • Realizar testes e depuração na branch de liberação.
  • Preparar pacotes ou artefatos para distribuição.
  • Liberar a versão atualizada do software.

Trunk-Based Development

Ciclo de Desenvolvimento:

  • Criar uma branch de desenvolvimento a partir da trunk.
  • Realizar alterações e desenvolver funcionalidades.
  • Revisar e testar as alterações no ambiente de desenvolvimento.
  • Solicitar revisão de outros colaboradores ou gerentes.

Integração na trunk:

  • Realizar merge da branch de desenvolvimento na trunk.
  • Resolver conflitos, se necessário.

Requisitos:

  • As branches de desenvolvimento devem ser criadas somente quando necessário.
  • A trunk deve ser atualizada com frequência.

Exemplo real

Git Flow: Um exemplo de Ciclo de Desenvolvimento e Liberação

Vamos supor que estamos trabalhando em uma aplicação web chamada MyBlog. Nossa equipe utiliza o Git Flow para gerenciar as alterações do código.

// Criação da feature branch "feature/new-post" a partir da branch develop
git checkout -b feature/new-post develop

// Alterações feitas na feature branch...

// Revisão e testes no ambiente de desenvolvimento

// Solicitação de revisão para outros colaboradores

// Revisões e ajustes necessários

// Merging da feature branch na develop
git checkout develop
git merge --no-ff feature/new-post

// Resolve conflitos se houver

// Liberar a versão atualizada do software (versão 1.2)
git checkout -b release/1.2 develop
git merge --no-ff release/1.2

// Preparação para distribuição (criação de pacotes, etc.)

// Liberação da versão atualizada do software (versão 1.2)
git tag -a v1.2

Trunk-Based Development: Um exemplo de Ciclo de Desenvolvimento

Agora, vamos considerar uma equipe utilizando o desenvolvimento com tronco para gerenciar suas alterações.

// Criação da branch de desenvolvimento "feature/new-post" a partir do tronco (master)
git checkout -b feature/new-post master

// Alterações feitas na branch de desenvolvimento...

// Revisão e testes no ambiente de desenvolvimento

// Solicitação de revisão para outros colaboradores

// Revisões e ajustes necessários...

// Merging da branch de desenvolvimento na trunk (master)
git checkout master
git merge --no-ff feature/new-post

// Resolve conflitos se houver

Esse exemplo mostra como ambos os métodos podem ser usados para desenvolver funcionalidades em uma aplicação. O Git Flow é mais adequado quando você tem um ciclo de vida de desenvolvimento mais complexo com diferentes equipes e requisitos específicos. Já o Trunk-Based Development é simples e pode funcionar bem em equipe menores ou que precisam gerenciar alterações de forma mais flexível.

Boas práticas

Trabalho em equipe e comunicação eficaz

  • Faça revisões de código frequentes entre desenvolvedores para garantir consistência e qualidade do código.
  • Estabeleça critérios claros para a aceitação de alterações, incluindo testes automatizados e revisão manual por outros desenvolvedores.
  • Utilize ferramentas de colaboração como pull requests, comentários e discussões para garantir que todas as vozes sejam ouvidas.

Gerenciamento de branch e fluxo de trabalho

  • Mantenha um padrão consistente para nomes de branches, incluindo nomeações claras do tipo de alteração (por exemplo, "feature/new-post").
  • Utilize Git Flow ou Trunk-Based Development de acordo com as necessidades da equipe, garantindo que todos os membros entenda o fluxo de trabalho.
  • Automatize a criação de tags e release na branch master após a conclusão de um ciclo de desenvolvimento.

Monitoramento e feedback

  • Utilize ferramentas de monitoramento para rastrear problemas no código, como linter, sonarcloud ou codecov.
  • Estabeleça práticas regular de revisões de código para garantir que todas as alterações estejam sob revisão.
  • Priorize a automatização das tarefas possíveis e utilize ferramentas de Continuous Integration/Continuous Deployment (CI/CD) para otimizar os ciclos de desenvolvimento.

Armadilhas comuns

Branches paralelas sem fluxo claro

  • Criação excessiva de branches sem um fluxo claro pode levar a confusão e problemas de merge. Evite criar novas branches apenas por necessidade temporária, em vez disso utilize branchs existente para alterações que não estão na diretoria principal do desenvolvimento.
  • Dificuldade ao mergear alterações pode causar conflitos graves, especialmente se a equipe estiver trabalhando em diferentes áreas da aplicação.

Falta de revisões

  • Não fazer revisões regulares entre colaboradores pode levar a problemas de qualidade no código e também à falta de segurança.
  • A falta de regras claras para as revisões pode gerar confusão dentro da equipe, levando à baixa produtividade.

Conclusão

  • A escolha entre Git Flow e Trunk-Based Development depende das necessidades específicas da equipe, mas ambos oferecem fluxos de trabalho que permitem a colaboração eficaz.
  • Importante que os membros da equipe estejam alinhados com o fluxo de trabalho utilizado para evitar conflitos e melhorar a produtividade.
  • Para garantir a qualidade do código é fundamental estabelecer práticas regulares de revisões, monitoramento e feedback em todos os ciclos de desenvolvimento.
  • Considerar implementar automatizações de tarefas possíveis e utilizar ferramentas de CI/CD para otimizar os ciclos de desenvolvimento.
  • Para aprofundar conhecimento sobre as estratégias de branch, consulte-se sobre o Git Flow e Trunk-Based Development, e também aprenda mais sobre práticas de desenvolvimento ágil.

Referências

  • Gitflow: https://www.atlassian.com/br/git/tutorials/comparing-workflows/gitflow-workflow
  • Trunk-Based Development: https://www.thoughtworks.com/pt-br/articles/trabalho-na-prancha-tronco
  • Martin Fowler - Git Workflow Strategies: https://martinfowler.com/bliki/GitWorkflowStrategies.html
  • Atlassian - Comparing Workflows: https://www.atlassian.com/br/git/tutorials/comparing-workflows
  • ThoughtWorks - Trabalho na Prancha-Tronco: https://www.thoughtworks.com/pt-br/articles/trabalho-na-prancha-tronco