Los servidores de integración continua se utilizan principalmente para garantizar que todo el código que se sube a los repositorios de un proyecto es correcto. Entendiendo como «correcto» que el nuevo código permite seguir compilando el proyecto sin errores y que pasa las pruebas automatizadas (tests unitarios, de integración, …)
Su funcionamiento es sencillo. Se componen de procesos que corren automáticamente y comprueban cada poco tiempo si ha habido cambios en los repositorios de código, aunque normalmente también admiten que se les programe para, por ejemplo, que se ejecuten a una determinada hora. Pero por lo general se configuran para que cuando se detecte un cambio se descarguen el código, lo compilen si es preciso, ejecuten las pruebas, y si todo fue correcto generen los binarios, empaquetados, o lo que requiera el lenguaje de programación utilizado y la configuración del proyecto.
El resultado de cada ejecución de cada proceso de un servidor de integración continua normalmente se puede consultar a través de una web que proporciona el propio software del servidor. De esta forma cualquiera puede ver si el código actual subido al repositorio compila antes de descargárselo a su máquina local.
Otras de las ventajas, cuando se trata con lenguajes de programación que tienen que compilarse, como C/C++ o Java por ejemplo, es que la generación del ejecutable o empaquetado se realiza siempre en una misma máquina, en un entorno estable y controlado, en vez de en la máquina de un desarrollador cualquiera del equipo.
Los proyectos de código abierto tradicionalmente se limitaban a ofrecer el código fuente y las instrucciones para su compilación en algún repositorio público gratuito, y dependiendo del lenguaje de programación y de las características del proyecto, los binarios y recursos resultantes para los sistemas operativos más extendidos que cada proyecto generaba según sus posibilidades, aunque no todos podían permitirse generar todo para todos los entornos.
Hoy en día, en el desarrollo de cualquier proyecto, medianamente serio, en cualquier empresa, también medianamente seria, los servidores de integración continua son, como se suele decir, un «must». Es decir, no se concibe el desarrollo de un proyecto sin ellos. Lo único que tiene que decidirse es que software utilizar, ya sea uno gratuito, como Jenkins, o uno comercial, como TeamCity, por poner un par de ejemplos.
Sin embargo, para los proyectos pequeños que algunos desarrollamos en casa y luego liberamos como código abierto esto no suele ser una opción. No tanto por la instalación y configuración del software del servidor, sino por el propio servidor. A la mayoría no nos resulta rentable invertir en la adquisición, mantenimiento y actualización de un servidor de integración continua propio. Afortunadamente, como ocurre con los repositorios gratuitos, también existen servidores de integración continua gratuitos.
Yo en particular estoy ahora utilizando drone.io, que permite utilizarlo de forma gratuita para tantos proyectos de código abierto como se quiera, aunque también tiene tarifas para repositorios privados. Yo lo utilizo principalmente porque tiene un buen soporte para Dart, el lenguaje que llevo utilizando para mis proyectos personales en los últimos años.
La configuración de los proyectos se realiza a través de una interface web muy clara y bien organizada. Los parámetros básicos que se tienen que indicar para cada proyecto son la url del repositorio, el lenguaje de programación (C/C++, Dart, Erlang, Go, Groovy, Haskell, Node, Java, PHP, Python, Ruby, Scala, …), las variables de entorno, y los comandos (Linux) a ejecutar para compilar el proyecto y ejecutar las pruebas.
Si el proyecto utiliza una base de datos, la configuración permite indicar el tipo de base de datos que se necesita para la ejecución de las pruebas (MySQL, PostgreSQL, MongoDB, Redis, Memcache, …) El servicio creará automáticamente una instancia de base de datos del tipo seleccionado para poder ejecutar las pruebas y la destruirá también de forma automática una vez acabadas. La url, usuario y password son siempre los mismos, y están perfectamente documentados en las páginas de ayuda de la propia web.
Otra característica interesante del servicio es que permite realizar deploys automáticos. Es decir, copiar el resultado de la compilación a otro servidor y desplegar la nueva versión si es preciso.
Por último, comentar que el servicio ofrece urls que se resuelven como imágenes y con las que se puede comprobar de un sólo vistazo el estado que se encuentra un proyecto:
La imagen muestra el resultado del último build, de color verde si se ejecutó con éxito, o de color rojo si falló. Pinchando sobre la imagen se accede a una página web donde se muestra el detalle de la ejecución de cada comando como si se tratara de una consola de línea de comandos.