Em um projeto web continuamente desenvolvido (não um produto), atualmente temos a seguinte estratégia de ramificação, basicamente baseada no fluxo git :
- desenvolver filial: versão de trabalho mais recente
- ramificação mestre: versão a ser lançada / versão lançada
- ramos de recursos: recursos em desenvolvimento
- ramos de hotfix: correções urgentes na versão lançada
O mestre é somente leitura, atualizado por meio de solicitações pull de ramos de desenvolvimento ou hotfix . Cada atualização resulta em um candidato à liberação sendo construído e implantado no sistema intermediário. Os candidatos a liberação são implantados na produção após aprovação manual.
As ramificações de recursos são criadas com base no desenvolvimento ou no último commit que foi mesclado no master. É criada uma solicitação de recebimento de um ramo de recursos a ser desenvolvido, implantada em um sistema de teste gratuito, onde são executados testes de integração e testes de aceitação (automático e manual). Quando testado e revisado com sucesso, o PR é mesclado, para que ele se torne parte do próximo lançamento (ou seja, mescla do desenvolvimento para o mestre).
Meu gol
Gostaria de simplificar isso e me livrar do ramo de desenvolvimento. O ramo de desenvolvimento tem razões históricas e, como sempre é uma versão testada com êxito, acho desnecessário mantê-lo separado do mestre. A remoção também simplificará o processo de liberação, porque não há mais mesclagem adicional.
Eu tenho as seguintes restrições:
- os lançamentos estão agendados e não devem ser totalmente automatizados
- enquanto as ramificações de recursos geralmente têm vida curta, algumas permanecem inalteradas por várias semanas (por exemplo, uma reformulação), mas também precisam ser testadas (atualmente, como solicitações de abertura aberta para desenvolvimento)
- Às vezes, um único recurso deve ser lançado fora da versão regular, transformando-o efetivamente em um hotfix. Com a estratégia atual, posso refazer uma ramificação de recursos e mesclá-la diretamente no mestre
- também acontece que precisamos reter os recursos após os testes de aceitação com sistemas externos na preparação falharem
Onde não tenho certeza sobre a transição:
- Atualmente, estou criando solicitações pull para testes e mesclagem de confirmações. Posso unificar isso?
- como lidar com hotfixes quando o mestre estiver à frente da versão mais recente. Devo criar e implantar versões diretamente de ramos de hotfix?
- existe uma maneira sensata de lidar com recursos que devem ser excluídos de um release depois que eles já foram mesclados? Um ramo de desenvolvimento separado é realmente uma vantagem para esses casos? Na maioria das vezes, acabo revertendo e revertendo os commit manualmente de qualquer maneira.