Acho que este artigo, um modelo de ramificação com êxito no Git , é muito conhecido entre os usuários experientes do DVCS.
Eu uso hg
principalmente, mas eu diria que essa discussão é boa para qualquer DVCS.
Nosso fluxo de trabalho atual é que cada desenvolvedor clona o repositório principal. Escrevemos código em nosso próprio repositório local, executamos testes e, se tudo correr bem, empurra o mestre.
Portanto, queremos configurar servidores de CI como Jenkins e melhorar nosso fluxo de trabalho com o futuro sistema de provisionamento (chef, fantoche, ansible, etc.).
Parte real
Bem, o modelo apresentado acima funciona bem, mas os ramos podem quebrar o IC. A ramificação do recurso deve sincronizar com a origem (de acordo com o artigo, seria development
ramificação) para tornar o CI e a mesclagem suaves, certo?
Digamos que Alice e Bob estão trabalhando em dois recursos. Mas Alice está pronta no dia seguinte. O recurso de Bob leva uma semana. Quando Bob termina, suas alterações estão desatualizadas (talvez Alice refatorou / renomeou algumas classes).
Uma solução é a cada manhã que os desenvolvedores devem master/origin
procurar para verificar se há alguma alteração. Se Alice se comprometer, Bob deve puxar e mesclar em seu espaço de trabalho para que seu ramo de recursos esteja atualizado.
- Essa é uma boa maneira?
- Essas ramificações devem existir no repositório principal (não no clone local?). O que significa que todo desenvolvedor deve conceder privilégios ao repositório principal no GitHub / Bitbucket para que eles possam criar uma nova ramificação? Ou isso é feito localmente?
- Por fim, o modelo apresentado pelo artigo deve interromper o IC se as ramificações não estiverem sincronizadas com o
origin/master
. Como queremos criar a construção todas as noites, os desenvolvedores devem puxar e mesclar antes de deixar o trabalho, e o CI também é executado em cada ramo de recurso?
Em resposta a 1)
Qualquer maneira que funcione é uma boa maneira. No entanto : toda a premissa da integração contínua é integrar continuamente . A idéia é capturar os erros de integração não apenas o mais cedo possível, mas dentro do ciclo de feedback do desenvolvimento - ou seja, enquanto todos os detalhes do código em teste estão na memória de curto prazo do desenvolvedor que faz as alterações. Isso significa que, em circunstâncias normais do dia-a-dia, o trabalho deve ser integrado entre as ramificações dos recursos em cada consolidação - talvez uma vez a cada 15 minutos. Reiterar: O principal objetivo da integração contínua é expor os erros de integração enquanto todos os detalhes estão na memória de curto prazo do (s) desenvolvedor (es) que estão fazendo as alterações.
2)
Principalmente, as ramificações são criadas no Mercurial pela clonagem de repositórios, portanto, você não precisa conceder a todos os desenvolvedores privilégios de confirmação para o repositório principal. Você provavelmente, no entanto, deseja oferecer aos desenvolvedores a capacidade de criar repositórios clonados no servidor de integração contínua, pois nem sempre é possível executar testes localmente. (Uma vez eu tinha um sistema de IC em que os testes de unidade demoravam 8 horas para serem executados em um cluster de 128 núcleos) - Escusado será dizer que os desenvolvedores não, não podiam executar testes localmente.
3)
Se você possui os recursos computacionais para isso, sim, os desenvolvedores devem estar sempre atualizados com a linha principal de desenvolvimento, especialmente antes de deixarem o trabalho, e você deve executar testes noturnos em todas as linhas de desenvolvimento (embora a maioria dos sistemas de CI não facilite isso).
fonte
Aqui está como você pode fazer isso: ramificação de recursos.
O importante aqui é que você terá 0 conflitos na ramificação padrão ao mesclar sua ramificação de recursos e todos os seus testes serão aprovados .
Com esse fluxo de trabalho simples, você sempre terá uma ramificação padrão pura e estável, agora faça o mesmo para ramificações de liberação, mas integrando-a por padrão . Se você precisar integrar os hotfixes diretamente nas ramificações de liberação, ainda poderá fazer isso ignorando a ramificação padrão, mas novamente, escolhendo apenas ramificações que foram atualizadas a partir da ramificação de destino e não tenham conflitos e seus testes de unidade serão aprovados.
fonte