He estado lidiando con el problema de escalar CI en mi empresa y al mismo tiempo tratando de averiguar qué enfoque tomar cuando se trata de CI y múltiples sucursales. Hay una pregunta similar en stackoverflow, Varias ramas de funciones e integración continua . Comencé uno nuevo porque me gustaría tener más discusión y proporcionar un análisis en la pregunta.
Hasta ahora, he descubierto que hay 2 enfoques principales que puedo tomar (¿o tal vez algunos otros?)
- Múltiples conjuntos de trabajos (hablando de Jenkins / Hudson aquí) por sucursal
- Escribir herramientas para administrar los trabajos adicionales
- Crear / modificar / eliminar trabajos de forma masiva
- Configuraciones personalizadas para cada trabajo por sucursal (URL de SCM, duplicaciones de repositorios de administración de depósitos)
- Algunos ejemplos de personas que abordan este problema con herramientas de shell, scripts de hormigas y la CLI de Jenkins. Ver:
- http://jenkins.361315.n4.nabble.com/Multiple-branches-best-practice-td2306578.html
- http://jenkins.361315.n4.nabble.com/Is-it-possible-to-handle-multiple-branches-where-some-jobs-should-run-on-each-one-without-duplicatin-td954729. html
- http://jenkins.361315.n4.nabble.com/Parallel-development-with-branches-td1013013.html
- Configurar o crear trabajos de hudson automáticamente
- Causará más carga en su clúster de CI
- El ciclo de comentarios para los desarrolladores se ralentiza (si la infraestructura no puede manejar la nueva carga)
- Escribir herramientas para administrar los trabajos adicionales
- Varios conjuntos de trabajos por 2 ramas (desarrollo y estable)
- Administre los dos conjuntos manualmente (si cambia la configuración de un trabajo, asegúrese de cambiar en la otra rama)
- PITA pero al menos tan pocos para gestionar
- Otras ramas adicionales no obtendrán un conjunto de pruebas completo antes de ser enviadas a desarrollo
- Desarrolladores insatisfechos. ¿Por qué un desarrollador debería preocuparse por los problemas de escala de CI? Tiene una solicitud simple, cuando me bifurco, me gustaría probar mi código. Sencillo.
- Administre los dos conjuntos manualmente (si cambia la configuración de un trabajo, asegúrese de cambiar en la otra rama)
Entonces, parece que si quiero proporcionar a los desarrolladores CI para sus propias ramas personalizadas, necesito herramientas especiales para Jenkins (¿API o shellscripts o algo así?) Y manejar el escalado. O puedo decirles que se fusionen más a menudo con DEV y vivan sin CI en ramas personalizadas. ¿Cuál tomarías o hay otras opciones?
fuente
Establecería trabajos separados para cada rama. He hecho esto antes y no es difícil de administrar y configurar si ha configurado Hudson / Jenkins correctamente. Una forma rápida de crear varios trabajos es copiar de un trabajo existente que tenga requisitos similares y modificarlos según sea necesario. No estoy seguro de si desea permitir que cada desarrollador configure sus propios trabajos para sus propias sucursales, pero no es mucho trabajo para una 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 esclavos separados para ayudar a equilibrar la carga en varios servidores. Asegúrese de que el servidor en el que está ejecutando Hudson / Jenkins sea adecuado. He usado Apache Tomcat y solo tenía que asegurarme de que tuviera suficiente memoria y poder de procesamiento para procesar la cola de compilación.
Es importante tener claro lo que desea lograr con la IC y luego encontrar una manera de implementarlo sin mucho esfuerzo manual o duplicación. No hay nada de malo en utilizar otras herramientas o scripts externos que ejecute su servidor de CI que ayuden a simplificar el proceso general de gestión de la compilación.
fuente
Elegiría dev + ramas estables. Y si todavía quieres ramas personalizadas y temes la carga, entonces ¿por qué no trasladar estas personalizadas a la nube y dejar que los desarrolladores las administren ellos mismos? Por ejemplo, http://cloudbees.com/dev.cb Esta es la empresa donde Kohsuke está ahora . También hay herramientas Eclipse, por lo que si está en Eclipse, lo tendrá estrechamente integrado directamente en dev env.
fuente
En realidad, lo que es realmente problemático es crear aislamiento con ramas de funciones. En nuestra empresa tenemos un conjunto de proyectos maven separados que forman parte de una distribución más amplia. Estos proyectos son mantenidos por diferentes equipos, pero para cada distribución es necesario publicar todos los proyectos. Una rama de características ahora puede superponerse de un proyecto a otro y ahí es cuando el aislamiento de la construcción se vuelve doloroso. Hay varias soluciones que hemos probado:
De hecho, la última solución es la más prometedora. Todas las demás soluciones carecen de una u otra forma. Junto con el complemento job-dsl, es fácil configurar una nueva rama de funciones. simplemente copie y pegue el guión maravilloso, adapte las ramas y deje que el trabajo inicial 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 funciones en diferentes proyectos de Maven.
Pero como Tom dijo anteriormente, sería mejor superar la necesidad de ramas de funciones y enseñar a los desarrolladores a integrarse limpiamente, pero ese es un proceso más largo y el resultado no está claro con muchas partes del sistema heredado que ya no tocará.
mis 2 centavos
fuente