En un proyecto web desarrollado continuamente (no un producto) actualmente tenemos la siguiente estrategia de ramificación, basada aproximadamente en el flujo de git :
- desarrollar sucursal: última versión de trabajo
- rama maestra: versión que se lanzará / versión lanzada
- ramas de características: características en desarrollo
- ramas de revisión: correcciones de errores urgentes en la versión lanzada
El maestro es de solo lectura, actualizado a través de solicitudes de extracción de las ramas de desarrollo o revisión . Cada actualización da como resultado un candidato de versión que se construye e implementa en el sistema de preparación. Los candidatos de lanzamiento se implementan en producción después de la aprobación manual.
Las ramas de características se crean en función del desarrollo o de la última confirmación que se ha fusionado con el maestro. Se crea una solicitud de extracción de una rama de características para desarrollar, implementar en un sistema de prueba gratuito donde se ejecutan pruebas de integración y pruebas de aceptación (automática y manual). Cuando se prueba y revisa con éxito, el PR se fusiona, por lo que se convertirá en parte de la próxima versión (es decir, se fusionará de desarrollo a maestro).
Mi meta
Me gustaría simplificar esto y deshacerme de la rama de desarrollo. La rama de desarrollo tiene principalmente razones históricas y, dado que siempre es una versión probada con éxito, creo que no es necesario mantenerla separada del maestro. Eliminarlo también simplificará el proceso de lanzamiento porque ya no hay una fusión adicional.
Tengo las siguientes restricciones:
- los lanzamientos están programados y no deben automatizarse completamente
- Si bien las ramas de características suelen ser de corta duración, algunas permanecen sin fusionar durante varias semanas (por ejemplo, un rediseño), pero también deben probarse (actualmente, como solicitudes de extracción abiertas para desarrollar)
- a veces se debe lanzar una única función fuera de la versión normal, convirtiéndola efectivamente en una revisión. Con la estrategia actual, puedo volver a crear una rama de características y fusionarla directamente en master
- también sucede que necesitamos retener las funciones después de que las pruebas de aceptación con sistemas externos en la puesta en escena fallaron
Donde no estoy seguro acerca de la transición:
- Actualmente estoy creando solicitudes de extracción para probar y fusionar confirmaciones para lanzamientos. ¿Puedo unificar esto?
- cómo lidiar con las revisiones cuando el maestro está por delante de la última versión. ¿Debo compilar e implementar lanzamientos directamente desde las sucursales de revisión?
- ¿Existe una manera sensata de manejar las características que deberían excluirse de una versión después de que ya se hayan fusionado? ¿Es una rama de desarrollo separada realmente una ventaja para estos casos? La mayoría de las veces termino revertiendo y volviendo a revertir confirmaciones manualmente de todos modos.