É um cenário comum que a base de código de um produto mantida por um repositório em algum sistema VCS evolua para um ponto em que essa base de código possa ser vista como contendo vários produtos. A divisão da base de código em vários repositórios VCS, cada um dedicado a um único produto, pode aproveitar vários benefícios (consulte Benefícios de ter um produto por repositório VCS sobre o modelo de repositório inchado abaixo). No lado técnico, dividir a base de código é uma etapa bastante fácil, pois a maioria dos VCS suporta esta operação. Entretanto, a divisão pode surgir problemas de engenharia relacionados a testes automatizados, entrega contínua, integração ou monitoramento de serviços (consulte Problemas levantados pela divisão.) As organizações que planejam realizar essa divisão, portanto, precisam saber como realizar essa transição da maneira mais tranquila possível, ou seja, sem interromper seu pipeline de entrega e monitoramento. O primeiro passo disso é provavelmente entender melhor a noção de projeto e como delinear a divisão em uma base de código monolítica.
Nas respostas a estas perguntas, eu gostaria de ver:
Uma tentativa de fornecer uma definição prática do que é um produto, que fornece critérios práticos para realmente delinear produtos em uma base de código existente.
De acordo com esta definição de trabalho, elabore um plano que efetue a divisão. Podemos assumir a simplificação de que a base de código é processada por um sdlc totalmente automatizado, implementando integração e entrega contínuas . Ou seja, cada ramificação é validada por um conjunto de testes automatizado implementado na base de código atual e cada mesclagem com alguma ramificação "mágica" gera artefatos do produto que são testados e implantados. ( Os artefatos do produto são, por exemplo , tarballs de origem, documentação, pacotes de software binários, imagens do Docker , AMIs, unikernels.)
Esse plano é satisfatório se explica como contornar a
Questões levantadas pela divisão
Como os procedimentos de teste automatizados se relacionam com o repositório monolítico preexistente e os repositórios divididos?
Como os procedimentos de implantação automatizada se relacionam com o repositório monolítico preexistente e os repositórios divididos?
Onde está armazenado o código para os procedimentos de implantação automatizados?
Onde estão as estratégias de infraestrutura armazenada , monitoramento e alta disponibilidade ?
Como garantir que um desenvolvedor precise apenas de uma base de código por vez (mas possível use artefatos de outras bases de código).
Como uma ferramenta como o git-bisect
Nota marginal: Benefícios de ter um produto por repositório VCS sobre o modelo de repositório inchado
Ter vários repositórios pequenos mantendo a base de código de um produto específico tem as seguintes vantagens sobre a abordagem do "repositório inchado":
Com um repositório inchado, é difícil reverter um release quando um produto é instável, porque o histórico é misturado com outro histórico do produto.
Com um repositório inchado, é difícil revisar o histórico do projeto ou puxa, com repositórios pequenos, é mais provável que leiamos essas informações. (Isso pode ser específico para VCS como o git, onde, diferentemente do svn, não podemos fazer checkout de subárvores!)
Com um repositório inchado, precisamos fazer muito mais ramificações quando desenvolvemos. Se tivermos N repositórios, podemos trabalhar em paralelo em N ramos, se tivermos apenas 1 repositório, apenas trabalharemos em um ramo ou teremos uma carga de cópias de trabalho que também são um aborrecimento.
Com vários repositórios pequenos, os logs fornecem um mapa de calor do projeto. Eles podem até ser usados como proxy da difusão de conhecimento na equipe de desenvolvimento: se eu não cometer no repo X há três meses, seria bom me designar em uma equipe que trabalha no repo X para que eu fique ciente dos desenvolvimentos nesse componente.
Com pequenos repositórios, é mais fácil obter uma visão clara de um componente. Se tudo correr em um único grande repositório, não haverá artefato tangível que delineie cada componente, e a base de código pode facilmente se deslocar em direção à grande bola de lama .
Pequenos repositórios nos forçam a trabalhar em interfaces entre componentes. Mas como queremos ter uma boa capsulação, este é um trabalho que deveríamos fazer de qualquer maneira, então eu consideraria isso uma vantagem para pequenos repositórios.
Com vários repositórios pequenos, é mais fácil ter vários proprietários de produtos.
Com vários repositórios pequenos, é mais fácil ter padrões de código simples que são pertinentes a um repositório completo e que podem ser verificados automaticamente.