Ter uma filial de produção ou usar mestre?

16

Trabalho em equipe pequena com outros desenvolvedores remotos em um Railsaplicativo. Estamos começando a modificar nosso gitfluxo 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?


fonte
Na minha experiência, vale a pena ter um lugar onde as pessoas possam se comprometer à vontade (seja para check-in diário ou o que for) - sem requisitos para "sempre compila". Sem isso, as pessoas atrasam os check-ins e correm o risco de perder código em acidentes (por exemplo, falha no disco). Cabe a eles propagar uma versão significativa a partir daí e "liberá-la" para o fluxo de integração. Então meu conjunto preferido de estágios é como (DEV) -> (unidades) -> (integração) -> (test) -> (de produção)
BitTickler
2
Usamos com sucesso o fluxo de trabalho git descrito neste site com algumas diferenças. nvie.com/posts/a-successful-git-branching-model A única diferença é que preferimos que o ramo local esmague e desenvolva um para manter um histórico limpo e seguir a lógica "um commit, um problema"
Jepessen,
O que normalmente ocorre no seu ramo "veado"?
simgineer
recomendar para um CI / CD mais claro. o ramo principal não é usado, pois talvez tenha sido mal interpretado. {desenvolver} - {unidade} - {integração} - {preparação} - {produção}. em azul / verde, com produção continuamente construindo> fatia ativa e preparo> fatia inativa. HEAD> desenvolva ramificação onde os recursos são ramificados. desenvolva tendo webhooks para acionar builds em direção à unidade que progride para a integração e a preparação (com tags apropriadas na aprovação da integração) hotfixes para desenvolver + produção (raro, mas acontece). mais complexidade, mas uma ideia geral.
Jimmy MG Lim

Respostas:

16

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.

Makoto
fonte
1
Eu realmente acho que você atingiu um bom ponto. Obrigado pelo feedback.
+1 para marcar confirmações. Trabalho sozinho a maior parte do tempo, mas identifico os lançamentos por dois motivos. 1) Funciona muito bem com as ferramentas de histórico visual do git para mostrar quais confirmações realmente estão em produção. 2) Funciona muito bem com ferramentas como o GitHub que podem empacotar versões de lançamento, verificando o commit marcado e compactando em um arquivo zip para consumo.
nbering
9

Eu posso ver seu dilema. Eu também tive, até desaprender o que sempre assumi sobre o mestre.

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.

Da documentação / livro do Git - ramificação do Git

O ramo "mestre" no Git não é um ramo especial. É exatamente como qualquer outro ramo. A única razão pela qual quase todo repositório tem um é que o comando git init o cria por padrão e a maioria das pessoas não se preocupa em alterá-lo.

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 o mastersay prode usar um fluxo de trabalho como abaixo -

(dev) -> (qa) -> (stag) -> (prod)

Aqui está como você altera o nome do ramo principal .

Não estou dizendo que você deve alterar o masternome do ramo. Mas se você tiver um fluxo de trabalho preferido e ajudar a alterar omaster nome filial, faça-o de todos os :-)

Sumeet Pareek
fonte
Esse é um argumento muito bom. Obrigado por trazer isso. Não sei se iremos tão longe quanto renomear, mas é bom saber que o git não trata o master de nenhuma maneira especial. Obrigado!
6

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:

  1. 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 masterem seu próprio repositório, mas isso será corrigido quando a solicitação de recebimento for recebida.

  2. 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.

Aaron Digulla
fonte
1

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.

BitTickler
fonte