¿Qué estrategia de ramificación se debe utilizar durante el desarrollo / mantenimiento de una aplicación web?

StackOverflow https://stackoverflow.com/questions/4509658

Pregunta

Estoy tratando de decidir la mejor estrategia de ramificación para un proyecto de aplicación web. Esto es lo que han subido con hasta ahora y yo agradecería mucho sus comentarios y experiencias.

La forma en que veo que hay dos estrategias principales de ramificación: "rama por la liberación" y "rama de función"

.

"Poder por la liberación" : El desarrollo se realiza en el tronco. Cuando el tiempo para una liberación está cerca, una rama se hace para que la liberación. se estabiliza Esta rama entonces / probado y finalmente se hace una autorización. Después de la liberación, la rama está de vuelta fusionada en el tronco, mientras se mantiene viva para corrección de errores de la rama de lanzamiento. Se aplica una corrección de errores, entonces se fusionaron en el maletero (si el desarrollo en el tronco no ha eclipsado el fallo en otros medios). Las nuevas características se añaden al tronco y no afectan a la rama de lanzamiento. Cuando un nuevo acercarse la hora de la liberación, una nueva rama de lanzamiento se crea a.s.o.

"Rama por función" : El tronco es siempre el tronco "producción" (el código que está vivo). Corrección de errores se cometan directamente al tronco. Características para la próxima versión se desarrollan en branches.Bugfixes características se combinan de vez en cuando a las ramas de características. Cuando llega el momento de la liberación, las características ramas se fusionan en el tronco y el ciclo de la vida continúa.

Ahora el modo de ver la gran diferencia práctica entre estas dos estrategias es que "por la liberación" le permite maintane diferentes versiones de producción de que el software (cuando el cliente A tiene la versión 1 y el cliente B versión 1.5, el cliente es el que paga al cliente en este caso). En contraste con el "por función" estrategia sólo se puede apoyar la versión de producción actual (todos los clientes están utilizando la última versión).

Dado que en un típico aplicación web todos los clientes están utilizando el mismo "última versión" (ya que todo el acceso al mismo servidor), asumiría que el enfoque "de función" es el más comúnmente usado. Se elimina la necesidad de fusionar "a través de la jerarquía", por ejemplo cuando una corrección de errores tiene que ser aplicado a las 3 versiones de lanzamiento.

Así que mi situación actual es que yo debería ir con "rama por función". Si importa, mi equipo no es muy hábil.

¿Fue útil?

Solución

Si usted tiene solamente una versión en directo en cualquier momento, y lo hace todo el desarrollo en una sola rama de la característica, entonces estos enfoques son efectivamente la misma.

Si rama por característica que le significa tener una varias ramas sobre la marcha a la vez, yo evitaría como de la peste. Más medios más ramas fusionadas, que es un dolor en sí mismo, y más infierno integración. Es mucho mejor hacer la integración continua con una única línea de código.

Si el proceso de implementación es más involucrada que rama, prueba, salga a la luz, a continuación, una ventaja de la rama por la liberación es que se puede tener múltiples ramas de liberación funcionando al mismo tiempo, en diferentes fases: una en vivo y siendo bugfixed como es necesario, y otro se estabiliza, probado, pasando por la aceptación, etc, mientras que el desarrollo continúa en el tronco. Si usted tiene un tronco vivo, por el contrario, una vez que se fusiona una rama en función con el fin de tomar en directo, que ha perdido su capacidad de hacer correcciones al sistema en vivo actual. La rama de la característica de combinación se convierte en un punto de no retorno.

Otros consejos

¿Qué tipo de software que están desarrollando? ¿Envoltura retráctil? Proyecto de código abierto? Si es así, entonces ir con la "rama por la liberación" o enfoque "tronco inestable". Especialmente si sus ciclos de lanzamiento son cada seis meses a un año de diferencia.

Pero si su mantenimiento de un proyecto basado en la Web que tiene cambios de salir en las frecuencias más cortas, como una vez cada pocas semanas o menos, y luego ir a la "rama por la característica" o enfoque "tronco estable". El problema con este enfoque es la integración de múltiples cambios de funciones que tienen grandes cambios hacen que el proceso de fusión de menos de diversión. Es realmente se hace difícil.

Pero ambas cosas funcionan bien, pero lo que si se necesita tanto? Es decir, que tiene un proyecto que se despliega dice una vez cada dos semanas con grandes cambios de funciones, pero encuentra que tiene una serie de correcciones de errores que no se puede esperar a que los cambios de función para estar listo. Tronco es su rama de lanzamiento con el enfoque de "rama de función". ¿Qué pasa si usted podría conseguir ambos comunicados y cuenta con su propia rama?

Consulte esta entrada de blog por Bob de CollabNet Arquero. Su estrategia ágil de lanzamiento le da lo mejor de ambos. He utilizado este. Es extremadamente flexible. A pesar de que Bob no lo demuestra en su diagrama, se pueden tener varias ramas de liberación que van al mismo tiempo. Esto significa que podría tener una rama de lanzamiento que está listo para el lanzamiento de la producción, y otro que se está preparando para los controles de control de calidad final. Pero hay dos cosas a tener en cuenta:

En primer lugar, lo bueno que son sus desarrolladores en la fusión? No se puede hacer el enfoque de la estrategia de liberación ágil por sí mismo, incluso si es un equipo pequeño. Cada uno tiene que hacer su parte y que realmente tiene que entender la fusión y las herramientas que están utilizando para hacer la fusión.

En segundo lugar, usted va a necesitar una buena comprensión de los cambios que los listos y los que están a punto de ser. gestión de la liberación es clave para hacer este trabajo como un reloj. Cada característica cuando esté listo necesidad voluntad para conseguir asignado a una rama de lanzamiento y se fusionó a la misma.

Independientemente del enfoque que elija, todo se reduce a lo que está en desarrollo y la frecuencia de los cambios que está liberando de ese desarrollo.

A riesgo de confundir más lejos: se puede tener ramas de liberación y que todos los cambios en las ramas de características. Estas cosas no son mutuamente excluyentes.

Una vez dicho esto, parece que no es necesario liberación familias paralelas y que desea implementar menudo, tal vez incluso continua . Así que le gustaría tener un "tronco estable" que se puede liberar en cualquier momento. ramas de características ayudan a mantener la estabilidad del tronco, ya que sólo se funden de nuevo a la línea externa cuando los cambios se hacen y han demostrado a sí mismos.

Así que diría que su elección es un buen ajuste.

.

Estas opciones no son mutuamente excluyentes - utilizar tanto Resuelven problemas diferentes:

"Poder por la liberación" - rama de lanzamiento se utiliza para asegurarse de que puede volver a la fuente usada para producir la versión en vivo actual (o versiones publicadas anteriores), mientras que la siguiente versión se encuentra en desarrollo. P.ej. Esto es con el fin de realizar cambios en la versión de corrección de errores o características backpatch de la rama de desarrollo actual.

"Rama por función" -. Utilizado para mantener el tronco de un desarrollo estable en todo momento, lo que es particularmente útil para varios desarrolladores y experimental "tal vez" características

Yo usaría tanto, pero se puede renunciar a uno de los enfoques si el problema se resuelve no se aplica a usted o si usted tiene una solución diferente ese problema.

Me recomienda encarecidamente el uso de un moderno DVCS como Git o Mercurial. Ellos están orientados al desarrollo paralelo, por lo que almacenan los cambios de manera diferente que los sistemas más antiguos, lo que hace que la fusión mucho más sano.

Yo tiendo a usar Git para mis proyectos, pero el proceso que tienden a seguir es el siguiente (y debería trabajar para Subversion también):

  • para cada nueva función, crear una rama de dicha función.
  • Cuando todo funciona, se funden en la rama staging, e implementarlo en el servidor de ensayo (usted tiene uno de esos, ¿verdad?)
  • Una vez que estamos seguros de que el cliente está contento con lo que está en puesta en escena, nos fusionamos la rama puesta en escena en la rama de producción, etiqueta como algo así como production_release_22 o production_release_new_feature_x, e implementar dicha etiqueta para el servidor de producción.

Las etiquetas son no , jamás actualizada - una vez que algo se despliega, que siga así hasta que haya más cambios se construyen, probado y etiquetado - y luego la nueva etiqueta es desplegada. Al asegurarse de que es etiquetas conseguir desplegados y no ramas , me mantengo (u otros) de hacer las cosas como "Voy a cometer este un cambio rápido y actualizar el servidor sin probarlo".

Ha funcionado muy bien para mí hasta ahora.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top