Es un escenario común que la base de código de un producto en poder de un repositorio en algún sistema VCS evolucione hasta un punto en el que se pueda ver que esa base de código contiene varios productos. Dividir la base de código en varios repositorios de VCS, cada uno dedicado a un solo producto, puede aprovechar varios beneficios (consulte Beneficios de tener un producto por repositorio de VCS sobre el modelo de repositorio de inflado a continuación). En el aspecto técnico, dividir la base de código es un paso bastante fácil ya que la mayoría de los VCS admiten esta operación. Sin embargo, la división podría generar problemas de ingeniería relacionados con las pruebas automatizadas, la entrega continua, la integración de servicios o la supervisión (consulte Problemas planteados por la división.) Las organizaciones que planean realizar una división de este tipo, por lo tanto, necesitan saber cómo realizar esta transición de la manera más fluida posible, es decir, sin interrumpir su entrega y monitoreo. El primer paso de esto es probablemente comprender mejor la noción de proyecto y cómo delinear la división en una base de código monolítico.
En las respuestas a estas preguntas, me gustaría ver:
Un intento de dar una definición funcional de lo que es un producto, lo que proporciona criterios prácticos para delinear productos en una base de código existente.
De acuerdo con esta definición de trabajo, elabore un plan que realmente realice la división. Podemos hacer la suposición simplificadora de que el código base es procesada por un sistema totalmente automatizado sdlc implementación continua-integración y entrega continua . Es decir, cada rama es validada por un conjunto de pruebas automatizado implementado en la base de código actual y cada fusión con alguna rama "mágica" genera artefactos de producto que se prueban y se implementan. ( Los artefactos del producto son, por ejemplo , tarballs de origen, documentación, paquetes de software binario, imágenes de Docker , AMI, unikernels).
Tal plan es satisfactorio si explica cómo eludir el
Problemas planteados por la división
¿Cómo se relacionan los procedimientos de prueba automatizados con el repositorio monolítico preexistente y los repositorios divididos?
¿Cómo se relacionan los procedimientos de implementación automatizados con el repositorio monolítico preexistente y los repositorios divididos?
¿Dónde se almacena el código para los procedimientos de implementación automatizados?
¿Dónde se almacenan las estrategias de infraestructura , monitoreo y alta disponibilidad ?
Cómo asegurarse de que un desarrollador necesita solo una base de código a la vez (pero posible utiliza artefactos de otras bases de código).
¿Cómo puede una herramienta como git-bisect
Nota marginal: Beneficios de tener un producto por repositorio VCS sobre el modelo de repositorio hinchado
Tener varios repositorios pequeños que contienen la base de código para un producto específico tiene las siguientes ventajas sobre el enfoque de "repositorio hinchado":
Con un repositorio inflado, es difícil revertir una versión cuando un producto es inestable, porque el historial se mezcla con otro historial del producto.
Con un repositorio inflado, es difícil revisar el historial del proyecto o las extracciones, con repositorios pequeños, es más probable que leamos esta información. (¡Esto podría ser específico para VCS como git, donde a diferencia de svn, no podemos pagar subárboles!)
Con un repositorio hinchado, tenemos que hacer mucho más baile de rama cuando nos desarrollamos. Si tenemos N repositorios, podemos trabajar en paralelo en N ramas, si solo tenemos 1 repositorio, solo podemos trabajar en una rama, o tenemos una carga de copias de trabajo que también son una molestia para manejar.
Con varios repositorios pequeños, los registros dan un mapa de calor del proyecto. Incluso pueden usarse como un proxy de difusión de conocimiento en el equipo de desarrollo: si no me comprometí en el repositorio X desde hace 3 meses, podría ser bueno asignarme en un equipo que trabaje en el repositorio X para que esté al tanto de los desarrollos en ese componente
Con repositorios pequeños, es más fácil obtener una visión general clara de un componente. Si todo va en un solo depósito grande, no hay artefactos tangibles que delineen cada componente, y la base de código puede derivar fácilmente hacia la gran bola de lodo .
Los repositorios pequeños nos obligan a trabajar en interfaces entre componentes. Pero dado que queremos tener una buena capsulación, este es un trabajo que deberíamos hacer de todos modos, por lo que lo consideraría una ventaja para los repositorios pequeños.
Con varios repositorios pequeños, es más fácil tener varios propietarios de productos.
Con varios repositorios pequeños, es más fácil tener estándares de código simples que sean pertinentes para un repositorio completo y que puedan verificarse automáticamente.