¿Cómo pasar de una realidad de ramificación compleja a un modelo de rama única?

15

En organizaciones grandes, el uso de la metodología de cascada generalmente da como resultado estructuras de ramificación muy complejas (también conocidas como spagetti de rama ).

¿Qué estrategias de ramificación se pueden usar para pasar de una realidad de ramificación compleja a un modelo de una sola rama como el desarrollo basado en troncales?

Actualizar:

Para aclarar, la pregunta es sobre la migración / transición en sí , no sobre las metodologías antes y después, que son bastante claras.

Realmente no puede ser "en EOB hoy todavía estamos en cascada con miles de millones de ramas, pero mañana primero cambiaremos a CI de una sola rama basada en troncales".

Dan Cornilescu
fuente
Puede ser una cascada y tener prácticas de ramificación claramente definidas y aplicadas, o ser ágil y tener un billón de ramas (¡gratis para todos!). Uno no implica el otro.
Alexandre
@Alexandre el cuerpo de la pregunta aclara el contexto: transición de muchas ramas a una.
Dan Cornilescu
1
Cambiaste la pregunta completamente del original ... haciendo que la mitad de las respuestas sean irrelevantes.
Evgeny
1
Hm, no puedo ver eso. La actualización solo reafirma que el enfoque está en lo que permanece sin cambios tanto en el título ("migración de ... a ...") como en el cuerpo ("en transición a"): devops.stackexchange.com/posts/122 / revisiones . La mitad de las respuestas ya eran irrelevantes porque se lo perdieron. Por eso agregué la aclaración.
Dan Cornilescu
1
Hola @DanCornilescu Hice mi edición después del comentario de Evgeny, así que no trates de señalarme;) Tu pregunta original tenía elementos sobre el proceso de desarrollo de software, el modelo de ramificación y las prácticas de DevOps. Las personas respondieron sobre qué pensaban que se trataba la pregunta. Luego modificó su pregunta (edición n. ° 2: devops.stackexchange.com/revisions/122/2 ) e hizo que algunas de esas respuestas fueran irrelevantes.
Alexandre

Respuestas:

11

Debido a que mencionas la cascada, entiendo que las numerosas ramas a las que te refieres son ramas de características en lugar de ramas de mantenimiento.

En esta configuración, también supongo que estas ramas se crean de acuerdo con un plan de cascada que intenta minimizar los conflictos. Esto implica que el objetivo del desarrollo es producir varios productos distintos. Cuando se usa un modelo de desarrollo de una sola rama, es importante trabajar también en un solo producto. Si varios productos se desarrollan simultáneamente en un modelo de desarrollo de una sola rama, efectivamente "pega" las versiones de estos productos, de modo que podríamos tener en la versión a del repositorio un producto saludable X y un producto defectuoso Y , mientras que en la versión b el producto X tiene una regresión e Y una corrección de error, pero no tenemos una versión donde X yY son saludables. Tal situación nos obligaría a considerar que X e Y se están desarrollando en repositorios distintos, lo que es una pista de que deberían serlo.

Por lo tanto, los primeros pasos deben realizar una división del repositorio :

  1. Organice el repositorio para que sea fácil dividirlo en varios repositorios pequeños. Por ejemplo, reorganice el repositorio actual para que cada directorio de nivel superior corresponda a un repositorio que desee crear en el futuro. Al hacerlo, puede continuar utilizando la disciplina de rama de espagueti con la que todos están familiarizados.

  2. Cuando se complete el paso 1, refine la disciplina rama-espagueti al exigir que cualquier rama solo pueda tocar archivos en un directorio de nivel superior.

  3. Cuando cada rama cumpla con el paso 2, realice la división. Los desarrolladores pueden convertir fácilmente sus cambios pendientes para parchear un único repositorio, simplemente eliminando el primer nivel de la ruta.

Ahora que se ha realizado la división, puede comenzar a trabajar en la disciplina de la rama en sí.

  1. Introducir técnicas de programación que ayuden al desarrollo de ramas de corta duración. Las ramas de corta duración es un aspecto crucial de todas las metodologías de una sola rama. Uno de sus objetivos es reducir el tiempo dedicado a fusionar y depurar sucursales de larga duración. Una técnica popular es la introducción de "banderas de características" donde una "fábrica" ​​usa una bandera de configuración para producir la versión histórica de un objeto o la nueva versión, inicialmente desarrollada parcialmente, de ese objeto.

  2. En este momento, tiene miles de millones de repositorios con solo unas pocas ramas en cada uno, y puede activar el botón "adoptamos globalmente la disciplina de desarrollo basada en troncales", sin ver el colapso original de la rama-spaghetti en el tronco.

La división real de los repositorios podría ser opcional, pero luego tendría que adoptar políticas que delineen limpiamente el alcance permitido de cada parche enviado (para limitar el riesgo de conflictos al fusionar cambios en la rama principal). La reducción de los gastos generales vinculados a los conflictos es uno de los objetivos de las metodologías de modelo de rama única, por lo que supongo que esto es relevante en su contexto.

Michael Le Barbier Grünewald
fuente
correcto: esas ramas son características y (varios niveles de) ramas de integración.
Dan Cornilescu
1
aproximadamente 1: incluso después de la división, vale la pena mencionar que aún puede obtener una vista completa de espagueti con el uso de repo
ᴳᵁᴵᴰᴼ
Pero Google y FB usan monorepos con troncales ...
AnoE
6

Al migrar de una cosa a otra, solo hay dos cosas que debe definir:

  1. Cual es tu objetivo
  2. Cómo llegar (el plan de migración)

La primera parte es, por desgracia, a menudo se pasa por alto o forma demasiado vaga. No puedes simplemente decir que lo que tienes es un desastre y quieres organizarlo. ¿Qué significaría eso? Todo el mundo tendría una interpretación diferente (aka: cada dev piensa que su o su manera de hacer las cosas es la mejor).

Lo más probable es que todas las sucursales que tienes estén sirviendo o hayan cumplido un propósito. Sin un proceso objetivo claramente definido, las personas seguirán haciendo lo que les funcione de la manera que más les convenga (y con razón).

Por ejemplo, su objetivo debe definirse tan claramente como Vincent Driessen definió su "modelo de ramificación Git exitoso" . Si observa este modelo, es muy preciso: dice dónde debería estar el código estable y dónde deberían desarrollarse las características inestables. También dice cómo, y cuándo, bifurcar, actualizar y fusionar. Usted sabe para qué sirve cada rama y qué hacer con ellas. Usamos una variación de lo que propuso Vincent y nuestra variación se define en nuestra wiki.

Lo importante es que todo el equipo comprenda y acuerde un objetivo. Puede valer la pena recordarle a la gente que no está buscando su modelo de ramificación favorito personal, sino un modelo en el que todos los miembros del equipo puedan ponerse de acuerdo y usarlo fácilmente.

Una vez que tenga su objetivo, podrá elaborar su plan de migración. Ese plan puede ser tan largo o tan corto como desee. He visto tal modelo de ramificación impuesto de la noche a la mañana; en otros lugares, se realizó durante 2 o 3 sprints. No me importa mucho, siempre que estemos mejorando.

Puede comenzar con las ramas "más grandes" o más importantes. Por ejemplo: "a partir de ahora, el maestro siempre debe estar en un estado para ser implementado en prod y la rama de desarrollo siempre debe compilar" (o cualesquiera que sean sus reglas). Luego, aplique ramas de versión (lanzamiento). Luego, haga cumplir las ramas de características. Después de eso, imponga un congelamiento de código en la rama de la versión, si tiene sentido.

DevOps se trata de comunicación, apertura y eficiencia. Estos conceptos deben tenerse en cuenta y comunicarse durante todo el proceso.

Sugeriría invitar a algunas personas fuera del equipo de desarrollo a la reunión del proceso como observadores. Ops o mandos intermedios pueden tener una o dos cosas que decir sobre su modelo. Deben priorizarse las necesidades de los desarrolladores, pero si el modelo de ramificación es imposible de alinear con la forma en que se gestionan las cosas, sería mejor saberlo ahora y no en un mes o dos.

Si tienes equipos realmente grandes, intenta incluir a todos de todos modos. Con equipos muy grandes, terminarás con dos o tres reuniones de todos modos. Por lo tanto, invite a los líderes de equipo en la sala, pero tenga una transmisión por Internet disponible y deje que todos lo sepan. Si alguien tiene una sugerencia o inquietud, podrá expresarla al líder de su equipo y, si es válida, se abordará en la segunda o tercera reunión.

Alexandre
fuente
3

En realidad, es muy simple convertir un repositorio de hidra de múltiples ramificaciones en un solo modelo ramificado.

Primero, desea comenzar con las ramas que tienen la menor diferencia entre él y el maestro o el tronco. Examina su edad y relevancia. Si aún son relevantes, comience a fusionarlos y a resolver conflictos. Si ya no son relevantes, elimínelos.

Continúe este proceso hasta que haya logrado fusionar todas sus ramas, resuelto todos los conflictos y solo le quede una rama.

Puede seguir este esquema simple para comenzar:

  1. Cree una copia de su rama maestra / troncal y llámela temp_master
  2. Encuentra la rama con la mayor divergencia del maestro / tronco.
  3. Determine si la rama debe mantenerse, archivarse o eliminarse.
    1. Si necesita mantenerse, continúe con el paso 4.
    2. Si necesita ser eliminado o archivado, elimínelo y archívelo, y luego regrese al paso 2.
  4. Repita el paso 2 para encontrar la siguiente rama con la menor divergencia.
  5. Combine las dos ramas encontradas en el paso 2 y el paso 3, resolviendo todos los conflictos.
  6. Combina tus dos ramas en tu temp_master rama.
  7. Pruebe el código en el código temp_master para ver si se compila, compila y ejecuta cualquier otra prueba automatizada que tenga para la cordura.
    1. Si alguna prueba falla, regrese, descubra por qué, corríjala y repita el proceso.
    2. Si las pruebas aún fallan, elija dos ramas diferentes para trabajar.
  8. Repita los pasos 2 - 7 hasta que tenga solo dos ramas, su maestro / tronco y temp_master .
  9. Finalmente, fusionarse temp_masteren master / trunk y vivir con su nuevo modelo de rama única.
avi
fuente
-4

Para las organizaciones grandes con un ciclo de sprint típico de 4 semanas, Git-Flow es el enfoque preferido porque se beneficia de la rama Característica La rama preparada para la producción maestra siempre se puede implementar Además, la rama maestra se mantiene limpia de confirmaciones no deseadas siguiendo dos ciclos de confirmación (desde la característica hasta DevelopyDevelop rama para dominar).

Además, la ramificación también está determinada por la frecuencia de los lanzamientos de producción. Para una implementación frecuente en producción, es mejor tener una rama de características o un modelo centralizado. En este caso, la sobrecarga de las sucursales administrativas se traslada a pruebas sólidas en entornos inferiores para mantener la estabilidad de la producción.

Shrek
fuente
¿Puedes mejorar esta respuesta para que sea más fácil de entender?
Evgeny
La pregunta establece específicamente que se trata de la migración / transición en sí, no de las metodologías antes y después . Parece que te estás dirigiendo a esto último aquí.
Toby Speight
@TobySpeight La pregunta cambió de su original por ediciones, por lo que esta respuesta solía ser relevante pero ya no lo es.
Evgeny