Estamos comenzando a encontrarnos con un problema a medida que crecemos, donde las características llegan a la fase de prueba, pero para cuando todo se prueba y las nuevas características aprobadas están en fase de prueba.
Esto está creando un entorno en el que casi nunca podemos impulsar la producción porque tenemos una combinación de características probadas y no probadas. Estoy seguro de que este es un problema común, pero aún no he encontrado buenos recursos para nosotros.
Algunos detalles:
- GIT en BitBucket
- Jenkins para la implementación con script en Azure
Lo que espero es una forma de aislar las características a medida que se mueven a través de entornos y solo empujan lo que está listo para pinchar.
Respuestas:
Parece que tienes algunos problemas aquí:
1. Identificación de funciones para una versión específica
Este es un problema de gestión de proyectos y un problema de coordinación. ¿ Esta función se lanzará antes, al mismo tiempo o después de esta otra función? Si las versiones quieren que ocurra una característica a la vez, identifíquelo. Si las características se van a agrupar en versiones, averigüe cuáles son las agrupaciones y aplíquelas con los desarrolladores y los responsables de la toma de decisiones. Use su sistema de seguimiento de problemas o tickets para etiquetar los lanzamientos. Deje en claro que si una característica de un lanzamiento específico es un no-go, entonces todos lo son.
2. Estrategias de ramificación
Git-flow es la respuesta fácil para problemas como estos, y a menudo las personas usan una variante de git-flow incluso si no saben de qué se trata. No voy a decir que es un problema para todos los problemas, pero ayuda mucho.
Parece que se encuentra con un problema con las estrategias de lanzamiento no deterministas, donde las características son scattershot aprobadas y algo que comenzó a desarrollarse hace mucho tiempo podría lanzarse después de algo que comenzó más recientemente: características de salto de rana.
Las ramas de características de larga duración o las versiones de lanzamiento simultáneas son probablemente la mejor respuesta para este tipo de problemas. Fusiona (o modifica, si te sientes cómodo) lo último de master en tus ramas de larga duración. Tenga cuidado de fusionar solo las características que ya están activas, de lo contrario, se encontrará con los problemas que ha tenido ahora (demasiadas características mezcladas en una rama).
Las ramas "revisión" o "corrección de errores" son una parte esencial de este proceso; úselas para pequeñas soluciones únicas que tienen un ciclo corto de control de calidad.
Según su descripción, incluso podría ser mejor no mantener una rama oficial de "desarrollo". En cambio, bifurque todas las características fuera del maestro y cree bifurcaciones de lanzamiento fusionadas una vez que se identifica un lanzamiento.
3. Ambientes
No combine las ramas de git con sus entornos, excepto para la producción == master. Se debe suponer que la rama de "desarrollo" está rota. Las ramas de lanzamiento se envían a entornos de prueba, ya sea un entorno de control de calidad o un entorno intermedio. Si es necesario, inserte una rama de características específicas en un entorno.
Si tiene más de una rama de características que necesita ser liberada por separado pero que se están probando al mismo tiempo ..... ¯ \ _ (ツ) _ / ¯ .... ¿activar otro servidor? Quizás fusionarlos en una rama desechable ... comprometer arreglos / cambios en las ramas originales y volver a fusionarse en la rama desechable; hacer la aprobación final y UAT en las ramas de lanzamiento individuales.
4. Eliminar características no aprobadas de una sucursal
Esto es lo que los pensamientos anteriores intentan evitar, porque sin duda es lo más doloroso de tratar de hacer. Si tiene suerte, las características se han fusionado en su desarrollo o ramas de prueba atómicamente usando merge commits. Si no tienes suerte, los desarrolladores se han comprometido directamente con la rama de desarrollo / prueba.
De cualquier manera, si usted se está preparando para un lanzamiento y tienen cambios no aprobados, necesitará usar Git a echarse atrás esas confirmaciones no aprobados por la rama de lanzamiento; La mejor idea es hacerlo antes de probar el lanzamiento.
La mejor de las suertes.
fuente
Aquí hay una idea, deje de usar ramas de lanzamiento. En su lugar, comience a incorporar las funciones y actívelas mediante la configuración. De esa manera, siempre está fusionando ramas de características en maestras y nunca debería haber una pregunta sobre qué versión está en prueba o producción. Si tiene alguna pregunta sobre qué funciones / implementaciones están activas en un entorno, simplemente verifique el archivo de configuración.
fuente
Esto debería ser una simple cuestión de coordinación entre prueba y producción. Si está utilizando ramas de características en Git, simplemente deje de presionar las ramas de características completadas para probar durante un ciclo de prueba, y reanude cuando se complete la prueba.
Si necesita un mejor control que esto, separe la Prueba en un servidor de Desarrollo y un servidor de Prueba de aceptación, y coordine esas ramas que serán enviadas al servidor de Prueba de aceptación con el equipo de prueba. Entonces, alguien puede ser responsable de iniciar el despliegue final desde la Prueba de aceptación hasta la Producción.
fuente
El trabajo se acumula
Este es un problema universal en mi experiencia. Lo abordo con:
fuente
Ramas
Necesita algunas ramas para controlar ese proceso:
1234-user-crud
,1235-bug-delete-catalog
, etc. Identificar sus confirmaciones con el número de tarea también, esto le ayudará mucho cuando se tienen problemas en fusiones (se quiere).release
sucursal.Ver el flujo de git:
Ambientes
Muy simple:
Los desarrolladores trabajan en su máquina, cada uno con su propia base de datos. Si no es posible, cada desarrollador tiene una base de datos individual (debido a las licencias, el tamaño de la base de datos, etc.), tendrá muchos problemas para compartir una base de datos entre los desarrolladores: cuando alguien elimina una columna o una tabla en su rama, los demás sucursales todavía cuenta con esta columna / tabla en la base de datos.
Problemas
El mayor problema en este proceso son las fusiones.
Necesita rehacer las mismas fusiones en
test
yrelease
. Esto será doloroso si se realiza un buen refactor en el código, como eliminar una clase, mover / cambiar el nombre de los métodos, etc. Como no puede obtener el código detest
(orelease
) bifurcación en la bifurcación de características, las confirmaciones de fusión solo se pueden resolver en eltest
(orelease
) Entonces, terminas resolviendo los mismos conflictos en dos ramas diferentes, probablemente produciendo un código diferente en cada fusión y, en el futuro, descubrirás que el equipo de prueba necesitará probar las características dos veces: en las ramastest
yrelease
, porque cada fusión puede dar lugar a diferentes errores.Otro problema es la
test
rama. Tendrá que "reciclar" esta rama (eliminar y crear una nuevamaster
) de vez en cuando, porque algunas ramas antiguas (o fusiones antiguas, ramas fusionadas que se eliminaron) pueden traer muchos problemas para el nuevo código, divergiendo mucho de lo que hay adentromaster
. En este momento, necesita el control de qué ramas desea fusionar nuevamente entest
.La mejor solución es que el equipo de negocios sepa lo que debe entregarse en la próxima versión y todos trabajen en una rama única (rama de desarrollo). Es bueno para ellos la posibilidad de elegir la función "hecho" que les gustaría tener en la próxima versión en cualquier momento que quieran (creo que este es su escenario), pero esto es una pesadilla para los desarrolladores y (creo) para el equipo de prueba
fuente
Parece que está fusionando los cambios de su rama de integración en su rama de producción, lo que en mi humilde opinión no es una buena práctica, exactamente por las razones que menciona. Tan pronto como una rama de producción para una determinada versión se extrae de la rama de integración principal, la rama de integración puede, en cualquier momento, divergir (después de todo, se supone que evoluciona hacia la próxima versión). La fusión de la rama de integración en la rama de la versión actual puede traer cambios incompatibles con esa versión.
En mi humilde opinión, un proceso adecuado sería:
fuente
Personalmente, esto parece que podría ser un problema de proceso más que un problema de herramientas. Algunas cosas que sugeriría aquí:
Honestamente, creo que lo más importante será la disciplina sobre cuándo está entregando y cuántas tareas puede completar por completo en un período de tiempo determinado.
Para resumir: solo entregue a QA cuando haya terminado de probar y entregar las características anteriores.
fuente
Cuando "todo esté probado y aprobado", implemente lo que fue probado y aprobado para producción. Eso podría ser una confirmación particular, o podría ser un artefacto de construcción particular generado por Jenkins.
No debería importar que las confirmaciones posteriores en la misma rama aún no se hayan probado.
fuente