La integración continua consiste en la ejecución programada de procesos que revisan periódicamente los cambios realizados en el código de un proyecto a través del sistema de control de versiones (subversion, git, mercurial…) para proceder si es necesario a la compilación del código, la realización de las pruebas unitarias, cálculos de métricas de calidad,etc, . El objetivo final es monitorizar constantemente los proyectos de forma que cualquier incidencia (una actualización de código que impida la compilación, un test unitario que deja de funcionar, etc) sea detectada automáticamente lo antes posible y comunicada a los responsables para proceder a su resolución.

Las ventajas de utilizar herramientas de integración continua en los procesos de desarrollo de software y de supervisión de calidad son ciertamente importantes:

  • No hay que esperar a que alguien descubra que un test falla o que se ha realizado una subida incorrecta de código al sistema de control de versiones puesto que la integración continua hace esto por nosotros de forma automática.
  • Como consecuencia del punto anterior, los problemas se pueden afrontar de inmediato. Así evitamos sorpresas de última hora cuando se aproximan las fechas de entrega.
  • El origen de los problemas detectados es fácilmente identificable.
  • Tenemos siempre disponibles para consultar las métricas de calidad del proyecto debidamente actualizadas.
  • Se permite la trazabilidad de la evolución del código del proyecto. Esto nos proporciona un feedback muy valioso a la hora de mejorar nuestros procesos.
  • Se agiliza el proceso de desarrollo ya que se consiguen que algunas tareas se ejecuten de forma automática y cuando más nos convenga en función del proyecto. Esto libera a los desarrolladores de tener que realizar estas tareas o procesos manualmente y que a menudo suelen ser tediosos, como por ejemplo ejecutar y revisar los resultados de los tests unitarios.

Podemos dar un paso más, y además de llevar a cabo procesos de integración de continua realizar Continuous Deployment o Despliegue Continuo, que consiste en la publicación y entrega automática de nuevas versiones (ya sea en entornos de pruebas o , en raras ocasiones, directamente en producción) correspondientes a la última versión del código de la aplicación que haya superado satisfactoriamente las verificaciones que hayamos impuesto en el proceso de integración contínua. Así pues, complementar los procesos de integración continua con procesos de entrega continua aporta estas ventajas adicionales:

  • Cualquier persona implicada en el proyecto pero que no sea desarrollador (equipo de testing, comerciales, jefes de proyectos, incluso clientes) tienen siempre lista para utilizar o revisar la última versión de la aplicación.
  • El paso a producción puede ser totalmente programado y desatendido.
  • Al igual que en el caso de la integración contínua, seguimos automatizando tareas y liberando de su realización manual al equipo de desarrollo.

En Soltel IT Software utilizamos tanto la integración como la entrega continua dentro de nuestros procesos de desarrollo de software y supervisión de calidad, siempre en función de los requisitos y necesidades específicas de cada proyecto y cliente. Esta praxis está documentada en nuestros procesos de desarrollo los cuales cumplen con la normativa ISO 15504 SPICE y están certificados por AENOR.

El siguiente diagrama recoge de forma muy esquemática esta forma de trabajar:

  proceso

Para realizar la integración y entrega continua, nos hemos decantado por utilizar la aplicación web Jenkins, un fork de Hudson (proyecto Open Source iniciado por Kohsuke Kawaguchi en Sun Microsystems). Este fork se originó tras la compra de Sun por parte de Oracle y posteriores disputas entre la comunidad de desarrolladores de Hudson y Oracle.

Los motivos por los que usamos y recomendamos esta herramienta son numerosos:

  • Es software libre, por lo que su utilización no supone un coste en licencias aunque existen empresas que ofrecen soporte, siendo la más conocida CloudBees que cuenta una versión Enterprise.
  • Proporciona por defecto (out-of-the-box) soporte para nuestro principal stack tecnológico: Maven (y sus plugins), Subversion y Java.
  • Pese a ser una herramienta muy potente y configurable, la interfaz es sencilla y la aplicación resulta fácil de utilizar. La curva de aprendizaje es baja tanto para los usuarios como para los administradores.
  • Es una herramienta muy popular, por lo que es fácil encontrar documentación y ayuda en la red.
  • Jenkins ofrece unas funcionalidades muy básicas pero está concebido para ser muy extensible mediante plugins que podemos instalar desde la misma aplicación. En la actualidad existen oficialmente más de 400 plugins disponibles, entre ellos los que nos permiten utilizar Jenkins con proyectos en otros lenguajes que no sean Java tales como PHP o Ruby.
  • Hay plugins que permiten realizar entrega continua. Por ejemplo nosotros usamos Deploy Plugin para realizar publicaciones automáticas de aplicaciones web en un Tomcat alojado en otra máquina y así tener siempre disponible la última versión estable de cada aplicación.
  • Se integra perfectamente con Sonar, herramienta que utilizamos para las métricas de calidad. También tiene soporte para Cobertura, PMD, Checkstyle…
  • Posee un sistema de gestión de roles y agrupación de proyectos que la hacen bastante escalable en función del número de proyectos y equipos de desarrollo existentes.
  • Los problemas detectados en la ejecución de cualquier tarea son notificados inmediatamente al equipo de desarrollo mediante correo electrónico, aunque también hay plugins que ofrecen otras opciones.
  • Disponemos de un histórico totalmente configurable tanto de las tareas ejecutadas como de los productos resultantes de las mismas. Esto nos permite seguir la evolución del proyecto y la posibilidad de recuperar versiones antiguas de los aplicativos en caso de que fuera necesario.

Nosotros usamos la instancia de Jenkins incluída en el ecosistema de desarrollo Clinker que además incluye Sonar, Redmine, Subversion…un producto excelente que también recomendamos.

Por último, y como curiosidad, aquí dejamos el enlace a la instancia de Jenkins utilizada para realizar las tareas de integración continua del propio Jenkins para que podáis ver su funcionamiento «en directo».

jenkins-pantalla-principal