Soy desarrollador de software en un equipo ágil bastante grande (tenemos ocho desarrolladores que realizan cambios activamente en un único repositorio de código). Cada dos semanas, llevamos a producción una nueva versión de nuestro software. Aquí está nuestro flujo de trabajo actual:
- Al comenzar una nueva tarea, los desarrolladores crean una "rama de características" fuera de la rama de desarrollo principal (usamos git ) y trabajan en esta nueva rama
- Una vez que un desarrollador ha terminado el trabajo en su tarea, fusionan su rama de características nuevamente en la rama de desarrollo
- El desarrollador fusiona la rama de desarrollo en la rama de QA.
- Se activa una compilación desde la rama de QA El resultado de esta compilación se implementa en nuestro entorno de control de calidad para permitir que los evaluadores comiencen sus pruebas.
Es bastante común que nuestros evaluadores encuentren problemas con estas nuevas características que se han fusionado en la rama de control de calidad. Esto significa que, en cualquier momento, el entorno de control de calidad probablemente contenga varias características nuevas, algunas probadas y libres de errores, y otras rotas. Esto dificulta la publicación porque es raro que la compilación de control de calidad esté en un estado listo para producción.
Para mitigar esto, hemos estado intentando iniciar un "congelamiento de QA", lo que significa que los desarrolladores no fusionan nuestra rama de desarrollo en la rama de QA un par de días antes del lanzamiento. Las correcciones de errores en el entorno de control de calidad se realizan directamente en la rama de control de calidad y se fusionan con la rama de desarrollo. Teóricamente, esto mantiene las características nuevas y rotas fuera del control de calidad y al mismo tiempo nos permite solucionar problemas que ya están en el control de calidad.
Si bien este concepto de "congelación de QA" ha sido parcialmente exitoso, es difícil de coordinar y las personas a menudo se confunden acerca de si se les permite fusionarse con QA. También ha sido difícil establecer una fecha límite de "congelación de control de calidad": a todos les gusta la idea de un respiro entre la congelación y el lanzamiento, pero en la práctica, prefieren tener su función en el próximo lanzamiento que respetar la fecha límite.
¿Hay una mejor manera de garantizar que tengamos una compilación limpia para nuestros lanzamientos cada dos semanas?
fuente
Respuestas:
Hay algunos problemas flotando en esto que están causando problemas que está experimentando.
El primero es la rama QA de larga ejecución. Tener una rama de larga ejecución que es paralela a la línea principal de desarrollo puede ser una fuente de confusión porque hay diferentes esfuerzos que deben replicarse tanto en la rama de control de calidad como en la línea principal. Esto significa que está revisando las correcciones de la rama de control de calidad que deben fusionarse con la línea principal (no es malo), o está registrando la línea principal que se fusionó con la rama de control de calidad (una fuente de posibles errores) .
El otro problema con la rama paralela de larga ejecución es que es posible que los archivos se desincronicen permanentemente. Una corrección de código que nunca se fusiona, o una configuración necesaria para compilaciones de producción que nunca se prueba y que forma parte de la línea principal de desarrollo.
A continuación, tiene roles en los que se incurre. Esto significa que la función de empaquetado (más sobre esto más adelante) no se está aislando lo suficiente.
En el modelo git-flow , la rama de lanzamiento se ramifica desde el desarrollo ( no el desarrollo se fusionó con el control de calidad) y todas las correcciones se registran en la rama de lanzamiento y luego se fusionan de nuevo con la rama de desarrollo.
Parte de la filosofía de la ramificación se puede encontrar en Estrategias avanzadas de ramificación de SCM (considero que es una lectura excelente). Esto se centra en los roles que puede asumir cada rama. La rama de lanzamiento asume el rol de empaque.
Uno debería considerar seriamente aplicar la totalidad de git-flow en su lugar. Esto no está muy lejos de lo que se está haciendo actualmente y pone un poco de disciplina y consistencia en lo que significa cada rama y cómo cada rama interactúa con las demás.
fuente
Me parece que el problema es que tiene una sola rama de control de calidad.
Para cada versión, cree una rama de control de calidad separada de la troncal / master de desarrollo primario. Luego, combine solo las correcciones de errores para las características de esa rama, nunca nuevas características. Haga que QA pruebe esa rama.
De esta manera, el "congelamiento" es bastante evidente: está en el nombre de la sucursal. Se podría utilizar algo como, no sé,
release/26/10/2015
. Entonces es obvio que nadie debería fusionarse en nuevas características después de esto.Es especialmente útil si ni siquiera bifurcas la rama hasta que se congele. Las personas pueden fusionarse para dominar en cualquier momento, simplemente no será parte de esta versión si no se hace a tiempo para que se pruebe.
No tenga una sola rama de control de calidad de larga duración, solo está pidiendo problemas. Bifurcación de la rama de desarrollo principal para cada versión y control de calidad de esa rama.
fuente
De alguna manera, está asignado al modelo de ramificación Desarrollo-PRINCIPAL-Producción que se ve a continuación. Se dice que el área sobre MAIN es el área de desarrollo. El área debajo de PRINCIPAL es el área de producción.
Aspectos destacados de este modelo que considero relevantes para usted:
Sospecho que tienes problemas porque:
fuente
Según tengo entendido la pregunta tienes dos problemas. (a) las características rotas se fusionan con las buenas características que desea lanzar; (b) desea poder liberar las buenas características mientras retiene las rotas. Como restricción de las posibles soluciones, supongo que desea que su prueba de control de calidad final / oficial se realice en una rama integrada que contenga todas las características programadas para la próxima versión.
Independientemente de su modelo de ramificación SCM, le sugiero que pruebe uno o ambos de los siguientes:
fuente
Una solución muy simple que he visto trabajar en un equipo un poco más grande que el suyo es hacer que todos trabajen e implementen desde una sola sucursal.
Dices que el equipo es ágil pero no está claro si estás trabajando en sprints (es decir, Scrum) o un enfoque de flujo más continuo (es decir, Kanban). Asumiendo que estás haciendo sprints, el objetivo del equipo es que el código sea liberable al final de cada sprint, para tu lanzamiento quincenal. No hay confusión en cuanto a si una característica romperá a otra, ya que todas se han desarrollado juntas. Los probadores pueden obtener acceso a funciones en fragmentos más pequeños, ya que la sobrecarga de los desarrolladores para entregarles es menor. Y realmente no necesita un QA-Freeze, en su lugar, todos saben cuándo es el final del sprint y no deben asumir el trabajo que no pueden terminar o dejar en un estado desplegable (es decir, deshabilitado).
Obviamente, hay ventajas y desventajas de cualquier enfoque, lo presento como una opción, no necesariamente la "mejor manera".
fuente
La razón por la que tiene estos problemas es porque su código lanzado a QA no es de una calidad lo suficientemente buena (¡¿y hay alguien ?!), por lo que debe comenzar a obtener una mejor versión de QA para que no necesiten recibir bigfixes tan a menudo. la forma más sencilla de hacer esto es introducir una rama intermediaria a la que liberes (vamos a llamarlo prueba). Esto todavía está bajo el mandato de desarrollo, pero permite a los desarrolladores presionar para que continúen trabajando, al mismo tiempo que tiene una sucursal integrada que debería ser lo suficientemente buena como para enviarla a QA.
Se pueden realizar pruebas de integración en esta rama para encontrar los errores que el QA está encontrando actualmente, los errores se pueden corregir en la rama original y luego fusionarse nuevamente, y nuevamente hasta que se corrijan los errores en esta rama directamente (recomiendo el ex). Una vez que ha pasado una carga de pruebas básicas, puede enviarse a QA para los "dedos pegajosos del usuario y el ¿qué hicieron?" pruebas.
Por lo tanto, este enfoque está diseñado para proteger la rama de control de calidad de las características de desarrollo rotas, ya sea porque la característica no se codificó lo suficientemente bien o si hubo problemas de integración inesperados, no importa. Solo las ramas de desarrollo que pasan las pruebas de integración pueden ser promovidas a control de calidad.
fuente