Trabalho em equipe pequena com outros desenvolvedores remotos em um Rails
aplicativo. Estamos começando a modificar nosso git
fluxo de trabalho. Pensamos em uma estrutura de ramificação como abaixo:
(dev) -> (qa) -> (stag) -> (master)
Mas alguns dos desenvolvedores pensaram que poderia ser menos confuso para novos desenvolvedores que poderiam automaticamente enviar para produção no master. Eles pensaram em ter todos trabalhando no mestre e criar um ramo separado para a produção.
(master) -> (qa) -> (stag) -> (prod)
Foi-me ensinado que você deseja manter o mestre implementável e não usá-lo como desenvolvimento, e de lugares anteriores onde trabalhei o mestre sempre deve ser implementável para produção.
Quais seriam algumas das desvantagens de usar uma estrutura de ramificação em que o mestre é usado ativamente para desenvolvimento e um ramo de produto separado é o que você usa para implantações?
Respostas:
Não há vantagens nem desvantagens nessa abordagem. A razão pela qual digo isso é simples: para o Git, não faz diferença se você desenvolver a partir do master ou liberar do master. Você nem precisa liberar ramificações; você pode marcar um commit arbitrário e liberá-lo.
O verdadeiro problema aqui é de processo e procedimento. Os desenvolvedores mais antigos que estão preocupados com o fato de fazê-lo de uma maneira confundem os desenvolvedores mais novos precisam estar preparados para investir tempo para explicar qual é o modelo de lançamento e por que é assim.
Desde que todos entendam que o mestre é para desenvolvimento, e algum outro ramo arbitrário é para lançamentos, e o trabalho para manter isso é feito , não deve haver problemas com essa abordagem.
fonte
Eu posso ver seu dilema. Eu também tive, até desaprender o que sempre assumi sobre o mestre.
Da documentação / livro do Git - ramificação do Git
Portanto, se você tem um fluxo de trabalho preferido e é difícil trabalhar com ele, porque diferentes desenvolvedores da equipe têm idéias diferentes sobre
master
. Você pode até renomear omaster
sayprod
e usar um fluxo de trabalho como abaixo -Aqui está como você altera o nome do ramo principal .
Não estou dizendo que você deve alterar o
master
nome do ramo. Mas se você tiver um fluxo de trabalho preferido e ajudar a alterar omaster
nome filial, faça-o de todos os :-)fonte
Eu prefiro verificações a convenções neste caso. Cada equipe contém membros que são melhores em iniciar novos recursos e outras pessoas que são melhores em estabilizar as coisas para um lançamento.
Se você não tiver este último, as revisões de código ajudarão (geralmente, as pessoas mais disciplinadas desejarão revisões de código de qualquer maneira).
É por isso que configuramos nosso repositório Git (estamos usando o Gitlab) para que apenas certas pessoas possam mesclar solicitações pull e cada desenvolvedor obtém seu próprio fork privado do repositório principal.
Isso resolve dois problemas:
Novos desenvolvedores não podem alterar o ramo errado (já que não podem enviar seu trabalho diretamente para o repositório principal). Eles podem fazer push
master
em seu próprio repositório, mas isso será corrigido quando a solicitação de recebimento for recebida.As convenções de código se espalham rapidamente pela equipe, pois cada confirmação é verificada por pelo menos outra pessoa que traz sua visão e conhecimento.
fonte
Tudo depende do processo geral de desenvolvimento de software. O gerenciamento de configuração e como uma nova versão se inicia não podem ser definidos sem o conhecimento do processo geral.
Existe a facção "ágil" que optaria por uma "área de comprometimento sempre trabalhando primeiro". Eles executavam instalações automatizadas de construção e teste constantemente nessa área e tentavam ter um sistema operacional "o tempo todo".
Eles veriam o (mestre) -> (versão) com talvez 1,2 etapas intermediárias da organização como benéfico.
Depois, há a facção mais "clássica", que possui um processo orientado por etapas de planejamento e integração planejada para marcos, em que uma liberação de "unidade de trabalho" é uma atividade planejada com requisitos como "somente liberação quando é testada (unidade)" e deveria se encaixar no próximo marco planejado ". Lá, o planejamento compreende o controle de versão de "unidades de trabalho" e, geralmente, mede o comprimento para definir como a próxima versão planejada do produto deve parecer em termos de recursos e correções. Para fins de planejamento, eles querem saber que o que um desenvolvedor libera é "adequado" e um ato consciente de comprometer uma unidade de trabalho.
Essa abordagem clássica não significa necessariamente que haja períodos mais longos em que não haja uma compilação completa do produto disponível.
Portanto, o fluxo de trabalho "clássico" seria: (dev) -> (unidade) -> (integração) -> (teste / qa) -> (produção).
O papel do integrador é "aceitar / comprar" unidades liberadas ou rejeitá-las se elas não atenderem às necessidades do próximo lançamento.
Em uma nota lateral, também é possível combinar essas duas abordagens básicas de maneira oportuna.
Da minha experiência (que era principalmente na área de uso da abordagem "clássica"), a abordagem "clássica" funcionou decentemente bem em projetos de cerca de 4-50 pessoas em uma equipe.
fonte