Sou um empreiteiro que começou recentemente com uma empresa.
A equipe é composta por 3 desenvolvedores, que consistem em 2 desenvolvedores de nível júnior a médio, com outro no mesmo nível começando em breve e eu (6 Anos xp). Para ambos os desenvolvedores existentes, é o primeiro trabalho fora da universidade / faculdade, e eles nunca tiveram um desenvolvedor sênior supervisionando seu trabalho antes.
Não há uma política explícita de controle de versão. Os desenvolvedores fazem todo o desenvolvimento no tronco e, em seguida, implantam na produção diretamente de suas máquinas de desenvolvimento. A equipe existente não está familiarizada com ramificações.
Estou mudando tudo isso e introduzindo CI, servidores de teste / preparo / produção de TDD, etc, juntamente com uma política de controle de versão para complementar isso.
O sistema de controle de origem é o TFS, que eu nunca usei antes. Está configurado como um repositório gigante.
Eu escrevi algumas dicas para eles, mas há algo mais que eu deva adicionar / alterar, tendo em mente a experiência da equipe?
Política de Controle de Versão
O desenvolvimento é feito no tronco
Se uma mudança for estimada em mais de uma semana, ela deve ser feita em uma ramificação, com mesclagens regulares do tronco na ramificação para impedir que os dois fiquem fora de sincronia.
Liberar ramificações criadas para o código de produção. Esse ramo deve conter apenas código estável. Podemos ter um ramo de lançamento que é atualizado a partir do tronco uma vez por sprint, ou podemos fazer um ramo de lançamento separado para cada semana.
Se uma correção de bug urgente que afeta o código de produção precisar ser feita, ela será feita na ramificação de lançamento e mesclada novamente no tronco.
Se adotarmos a estratégia de ramificação de uma liberação, o tronco será mesclado na ramificação de liberação uma vez por sprint no final do sprint.
Se adotarmos a estratégia de ramificação separada por liberação, o tronco NUNCA será mesclado na ramificação de liberação
Em alguns cenários, pode ser necessário corrigir o bug duas vezes em ramificações diferentes, se as ramificações divergirem demais. Se estamos fazendo sprints curtos, isso não deve acontecer com muita frequência.
Eu pretendo ter três servidores. Ambiente de teste que está sempre executando o código mais recente no repositório. Um ambiente de temporariedade que está executando o candidato à versão mais recente para preparar / testar o código do Release Candidate e para fins de UAT e o ambiente de produção.
A razão pela qual pretendo fazer isso é que, até agora, o cliente fez apenas software interno. O mais novo projeto é para um cliente de mídia de alto perfil, e sinto que a equipe precisa adotar um modelo de desenvolvimento mais profissional do que o que faz no momento.
Por exemplo, no momento, um usuário pode telefonar para a equipe com um relatório de erro. Os desenvolvedores localizam e corrigem o erro, fazem um teste rápido do globo ocular em suas próprias máquinas e, em seguida, implantam diretamente na produção. Nenhum teste automatizado ou qualquer coisa.
Em retrospectiva, acho que o ramo de recursos é um passo longe demais e eu removerei isso.
Então, basicamente, tudo se resume a: a) nenhuma ramificação; b) uma ramificação de liberação e o tronco; ec) uma ramificação de liberação por liberação e o tronco.
Eu estava inclinado para o último. Meu pensamento inicial seria que eu teria um candidato a lançamento e um lançamento para estar ao vivo em servidores separados (UAT / Produção) ao mesmo tempo, mas efetivamente o tronco é o candidato a lançamento a qualquer momento, portanto, uma filial por liberação está inclinada para a loucura. Meu único pensamento seria se não quiséssemos que nossas partes interessadas vissem o código de desenvolvimento, talvez precisássemos de um ramo candidato a lançamento separado, mas o YAGNI e tudo mais .....