Necesito ayuda con la filosofía y el diseño de una configuración de integración continua.
Nuestra configuración actual de CI utiliza buildbot. Cuando comencé a diseñarlo, heredé (bueno, no estrictamente, ya que estaba involucrado en su diseño un año antes) un generador de CI a medida que se diseñó para ejecutar toda la compilación de una vez, durante la noche. Después de un tiempo, decidimos que esto era insuficiente y comenzamos a explorar diferentes marcos de CI, y finalmente elegimos buildbot. Uno de mis objetivos en la transición al buildbot (además de poder disfrutar de todos los extras geniales) era superar algunas de las deficiencias de nuestro creador nocturno a medida.
Compláceme por un momento y permítame explicarle lo que heredé. La base de código para mi empresa son casi 150 aplicaciones únicas de Windows C ++, cada una de las cuales depende de una o más de una docena de bibliotecas internas (y muchas de bibliotecas de terceros también). Algunas de estas bibliotecas son interdependientes y tienen aplicaciones dependientes que (aunque no tienen nada que ver entre sí) tienen que construirse con la misma compilación de esa biblioteca. La mitad de estas aplicaciones y bibliotecas se consideran "heredadas" e inportables, y deben construirse con varias configuraciones distintas del compilador de IBM (para el que he escrito subclases únicas Compile
), y la otra mitad está construida con Visual Studio.ShellCommand
s, ya que no hay soporte para VSS).
Nuestro creador nocturno original simplemente eliminó la fuente de todo y construyó cosas en un cierto orden. No había forma de construir solo una aplicación, o elegir una revisión, o agrupar cosas. Lanzaría máquinas virtuales para construir una serie de aplicaciones. No era muy robusto, no era distribuible. No era terriblemente extensible. Quería poder superar todas estas limitaciones en buildbot.
La forma en que hice esto originalmente fue crear entradas para cada una de las aplicaciones que queríamos construir (todas las 150), luego crear planificadores activados que pudieran construir varias aplicaciones como grupos, y luego subsumir esos grupos en un planificador de construcción nocturno general. Estos podrían ejecutarse en esclavos dedicados (no más máquinas virtuales), y si quisiera podría simplemente agregar nuevos esclavos. Ahora, si queremos hacer una compilación completa fuera de horario, es un clic, pero también podemos compilar solo una aplicación si así lo deseamos.
Sin embargo, hay cuatro puntos débiles de este enfoque. Una es la compleja red de dependencias de nuestro árbol fuente. Para simplificar el mantenimiento de la configuración, todos los constructores se generan a partir de un diccionario grande. Las dependencias se recuperan y construyen de una manera no terriblemente robusta (es decir, borrando ciertas cosas en mi diccionario de compilación de destino). El segundo es que cada compilación tiene entre 15 y 21 pasos de compilación, lo cual es difícil de examinar y mirar en la interfaz web, y dado que hay alrededor de 150 columnas, lleva una carga infinita (piense de 30 segundos a varios minutos). En tercer lugar, ya no tenemos autodescubrimiento de objetivos de compilación (aunque, por mucho que uno de mis compañeros de trabajo me critique sobre esto, no veo lo que nos consiguió en primer lugar). Finalmente,
Ahora, al pasar a un nuevo desarrollo, estamos comenzando a usar g ++ y subversion (no portamos el repositorio antiguo, eso sí, solo para las cosas nuevas). Además, estamos comenzando a hacer más pruebas unitarias ("más" podría dar una imagen incorrecta ... es más como cualquiera ), y pruebas de integración (usando python). Me está costando descubrir cómo encajarlos en mi configuración existente.
Entonces, ¿dónde me he equivocado filosóficamente aquí? ¿Cómo puedo seguir adelante (con buildbot, es la única pieza del rompecabezas en la que tengo licencia para trabajar) para que mi configuración sea realmente mantenible? ¿Cómo abordo algunas de las debilidades de mi diseño? ¿Qué funciona realmente en términos de estrategias de CI para bases de código grandes (posiblemente demasiado) complejas?
EDITAR:
Pensé que había explicado mi problema, pero obviamente no estaba lo suficientemente claro. Estoy no buscando sugerencias para cambiar las plataformas de CI. Se no va a pasar, y no lo acepten respuestas que sugieren que. Lo que quiero saber es cómo otras personas manejan bases de código complicadas usando CI. Tengo una docena de productos diferentes al cuadrado , y tengo dependencias dispersas al viento, y todas son diferentes. ESTO es con lo que quiero saber cómo lidiar.