software que integración integracion entrega diferencia despliegue delivery continuo continua and continuous-integration hudson jenkins

continuous integration - que - Manejo de múltiples ramas en integración continua



integración continua vs devops (4)

Cuando habla de escalar CI realmente está hablando de escalar el uso de su servidor de CI para manejar todas sus ramas de características junto con su línea principal. Inicialmente, esto parece un buen enfoque ya que los desarrolladores de una sucursal obtienen todas las ventajas de las pruebas automatizadas que incluyen los trabajos de CI. Sin embargo, tiene problemas para administrar los trabajos del servidor de CI (como ha descubierto) y, lo que es más importante, no está realmente haciendo CI. Sí, está utilizando un servidor de CI, pero no está integrando continuamente el código de todos sus desarrolladores.

Realizar CI real significa que todos sus desarrolladores se están comprometiendo regularmente con la línea principal. Fácil de decir, pero la parte más difícil es hacerlo sin romper su aplicación. Le recomiendo que consulte Entrega continua , especialmente la sección Cómo mantener su aplicación liberable en el Capítulo 13: Administración de componentes y dependencias . Los puntos principales son:

  • Oculte nuevas funcionalidades hasta que finalice (AKA Feature Toggles ).
  • Realice todos los cambios de forma gradual como una serie de pequeños cambios, cada uno de los cuales es liberable.
  • Utilice la rama por abstracción para realizar cambios a gran escala en la base de código.
  • Use componentes para desacoplar partes de su aplicación que cambian a diferentes velocidades.

Son bastante auto explicativas, excepto la rama por abstracción. Este es solo un término elegante para:

  1. Crea una abstracción sobre la parte del sistema que necesitas cambiar.
  2. Refactorizar el resto del sistema para usar la capa de abstracción.
  3. Cree una nueva implementación, que no forma parte de la ruta del código de producción hasta que se complete.
  4. Actualice su capa de abstracción para delegar en su nueva implementación.
  5. Eliminar la implementación anterior.
  6. Elimine la capa de abstracción si ya no es apropiada.

El siguiente párrafo de la sección Sucursales, flujos e integración continua en el Capítulo 14: Control de versiones avanzadas resume los impactos.

El enfoque incremental ciertamente requiere más disciplina y cuidado -y de hecho más creatividad- que crear una sucursal y sumergirse en una nueva arquitectura y desarrollar nuevas funcionalidades. Pero reduce significativamente el riesgo de que sus cambios rompan la aplicación, y le ahorrará a usted y a su equipo una gran cantidad de tiempo fundiéndose, reparando roturas y logrando que su aplicación se despliegue.

Se requiere un gran cambio de mentalidad para renunciar a las ramas características y siempre obtendrás resistencia. En mi experiencia, esta resistencia se basa en que los desarrolladores no se sienten seguros al asignar el código a la línea principal y esta es una preocupación razonable. Esto, a su vez, generalmente se debe a una falta de conocimiento, confianza o experiencia con las técnicas enumeradas anteriormente y posiblemente con la falta de confianza con sus pruebas automáticas. El primero se puede resolver con capacitación y soporte para desarrolladores. Este último es un problema mucho más difícil de manejar, sin embargo, la bifurcación no proporciona una seguridad real adicional, simplemente difiere el problema hasta que los desarrolladores se sientan lo suficientemente seguros con su código.

He estado lidiando con el problema de escalar CI en mi empresa y, al mismo tiempo, tratando de descubrir qué enfoque tomar con respecto a CI y múltiples ramas. Hay una pregunta similar en stackoverflow, ramas de características múltiples e integración continua . Empecé uno nuevo porque me gustaría tener más discusión y proporcionar algunos análisis en la pregunta.

Hasta ahora, he descubierto que hay 2 enfoques principales que puedo tomar (¿o quizás otros?).

Por lo tanto, parece que si deseo proporcionar desarrolladores con CI para sus propias sucursales personalizadas, necesito herramientas especiales para Jenkins (API o shellscripts o algo así) y manejo el escalado. O puedo decirles que se unan más a DEV y vivan sin CI en sucursales personalizadas. ¿Cuál tomarías o hay otras opciones?


En realidad, lo que es realmente problemático es el aislamiento de compilación con ramas de características. En nuestra compañía tenemos un conjunto de proyectos maven separados, todos forman parte de una distribución más grande. Estos proyectos son mantenidos por diferentes equipos pero para cada distribución todos los proyectos necesitan ser lanzados. Una rama de características ahora puede superponerse de un proyecto a otro y eso es cuando el aislamiento de compilación se vuelve doloroso. Hay varias soluciones que hemos probado:

  • crear repositorios de instantáneas separados en nexus para cada rama de características
  • compartir repositorios locales en esclavos dedicados
  • use el repositorio-servidor-complemento con los repositorios ascendentes
  • compilar todo dentro de un trabajo con un repositorio privado

De hecho, la última solución es la más prometedora. Todas las demás soluciones fallan de una u otra manera. Junto con el plugin job-dsl, es fácil configurar una nueva rama de características. simplemente copie y pegue la secuencia de comandos groovy, adapte las ramas y permita que el trabajo semilla cree los nuevos trabajos. Asegúrese de que el trabajo de inicialización elimine los trabajos no administrados. Luego puede escalar fácilmente con ramas de características sobre diferentes proyectos de maven.

Pero como dijo muy bien Tom, sería mejor superar la necesidad de ramas de características y enseñar a los desarrolladores a integrarse limpiamente, pero ese es un proceso más largo y el resultado no es claro con muchas partes heredadas del sistema que ya no se tocarán.

mis 2 centavos


Me gustaría crear trabajos por separado para cada rama. He hecho esto antes y no es difícil de administrar y configurar si has configurado Hudson / Jenkins correctamente. Una forma rápida de crear trabajos múltiples es copiar de un trabajo existente que tenga requisitos similares y modificarlos según sea necesario. No estoy seguro si desea permitir que cada desarrollador configure sus propios trabajos para sus propias sucursales, pero no es mucho trabajo para una sola persona (es decir, un administrador de compilación) administrar. Una vez que las ramas personalizadas se han fusionado en ramas estables, los trabajos correspondientes se pueden eliminar cuando ya no sean necesarios.

Si le preocupa la carga en el servidor de CI, puede configurar instancias separadas del CI o incluso separar esclavos para ayudar a equilibrar la carga en varios servidores. Asegúrese de que el servidor en el que está ejecutando Hudson / Jenkins sea adecuado. Utilicé Apache Tomcat y solo tuve que asegurarme de que tuviera suficiente memoria y capacidad de procesamiento para procesar la cola de compilación.

Es importante tener claro lo que quiere lograr con CI y luego descubrir una forma de implementarlo sin demasiado esfuerzo manual o duplicación. No hay nada malo con el uso de otras herramientas externas o scripts que ejecuta su servidor de CI que ayudan a simplificar el proceso general de administración de compilación.


Yo elegiría las ramas dev + stable. Y si aún desea sucursales personalizadas y le tiene miedo a la carga, ¿por qué no mover estas personalizadas a la nube y dejar que los desarrolladores las administren ellas mismas, por ejemplo, http://cloudbees.com/dev.cb Esta es la compañía donde Kohsuke está ahora . También hay un Eclipse Tooling, por lo que si está en Eclipse, lo tendrá estrechamente integrado directamente en dev env.