by David on April 27, 2009

La Integración Continua es un concepto ampliamente definido en el que básicamente se pretende automatizar la construcción/compilación e integración del desarrollo de un producto software, para agilizar el ciclo de diseño-ejecución-prueba, detectando de forma óptima los errores, bugs y fallos en dicho proceso de desarrollo.

En el caso de desarrollo de software realizado por un equipo, queremos integrar nuestro código propio con el que finalmente va a ser lanzado. Para la gestión del desarrollo de todo el equipo, la integración de código, su compilación y pruebas habrá que seguir ciertas directrices, que están dentro del concepto de Integración Continua.

Una de las grandes ventajas de la Integración Continua está en el hecho de probar nuestro código “en tiempo real”. Esto está dentro del concepto Kaizen o mejora continua, cuyas ventajas se reducen en gran parte a la reducción de tiempo de integración con una fiabilidad enorme.

Los aspectos a tener en cuenta en la Integración Continua pueden resumirse a:

  • Mantener un repositorio de código
  • Automatizar la compilación e integración
  • Hacer tus propios tests
  • Commits diarios
  • Cada commit debe compilar
  • Compilar rápida y ágilmente
  • Testar en clon de producción
  • Hacerlo fácil
  • Resultados accesibles por parte de todos
  • Automatizar despliegue

Basándonos entonces en estos aspectos es importante poder realizar las tareas necesarias para disponer siempre de una última versión de nuestro código que esté testada y probada. Para ello existen herramientas software que nos proporcionarán un Servidor de Integración Continua que nos facilite la realización de esas tareas basadas en los aspectos anteriormente comentados.

Por ello, es esencial la elección de la herramienta que utilicemos para desarrollar en un entorno de Integración Continua. Esta elección vendrá determinada por ciertos criterios de selección que marcarán nuestras necesidades de desarrollo y el entorno. Estos criterios tratarán de ser lo más objetivo posibles.

Nuestros criterios a la hora de la elección estarán basados en:

  1. Características de la herramienta software, como
    • Integración de sistema de control de versiones
    • Capacidad de manejo e integración de plataformas de construcción y despliegue (Maven, Ant)
    • Metodología de feedback e informes
    • Etiquetado
    • Si soporta dependencia de otros proyectos o no
    • Facilidad de extender
  2. Fiabilidad y rendimiento. Productos opensource nos permitirán hacer pruebas de rendimiento fiables.
  3. “Longevidad” del software. Sin perder la funcionalidad y robustez de una herramienta consolidada y establecida, hay que tener una visión de futuro y pensar a largo plazo (posibilidad de extender nuestro producto o modularlo).
  4. Entorno objetivo. Hay que tener también una visión más allá de la calidad del código y no perder de vista el entorno de producción, trabajo y ejecución. Tendremos que tener en cuenta entonces los sistemas operativos soportados por los servidores, los requerimientos del sistema, el versionado y el soporte de versionado.
  5. Facilidad de uso. Aunque a veces este criterio puede ser subjetivo, el uso de consolas web, configuración a través de edición de archivos, utilización de asistentes o paneles de control vendrán determinados por los usuarios de la herramienta-servidor que va a ser utilizada y administrada.

Estos criterios de selección no deben ser rígidos y buscamos un entorno lo más flexible posible. Pero el exceso de flexibilidad puede llegar a hacer nuestro sistema improductivo y algo caótico, provocando el efecto contrario al deseado y por tanto, algo de rigidez del sistema nos puede ayudar a establecer las líneas adecuadas de actuación.

Por estas razones y según los criterios que hemos expresado para la elección de nuestras herramientas en un entorno de Integración Continua, una buena elección será el uso de Hudson como “CI Tool” (herramienta de Integración Continua) y Maven como “Lifecycle Build Tool” (herramienta de construcción del ciclo de vida).

De forma resumida exponemos las ventajas y características de estas dos herramientas para la gestión de nuestro proyecto de desarrollo de software.

Maven

De forma más detallada a nuestra introducción anterior, Maven es una herramienta de gestión y comprensión de proyectos de desarrollo de software, normalmente en Java, que nos permite compilar, testar integridad y compilación, desplegar, documentar y gestionar las dependencias de código de forma sencilla y extendible.

Maven es una herramienta abierta y libre (pertenece al Proyecto Apache) claramente orientada al trabajo en equipo, siendo esta es una de las principales razones por las que la elegimos como herramienta ideal para metodologías agiles de programación y posterior Integración Continua con otras herramientas software.

La herramienta es compleja pero fácil de usar y muy rápida a la hora de compilar y desplegar proyectos. Entre las ventajas de usar Maven como herramienta de desarrollo en el trabajo en equipo, podemos destacar:

La dependencia entre proyectos no es problema
Un mismo proyecto se puede ejecutar en distintos entornos. Sólo hay que cambiar un archivo de configuración
La integración del trabajo de desarrolladores es transparente
Hay una maximización de la cohesión del código y una minimización del acoplamiento
Fácil reutilización del código

Para los desarrolladores familiarizados con herramientas similares, como Apache Ant, Maven ofrece las mismas funcionalidades, con la diferencia de gestionar las dependencias de proyectos de una forma mucho más sencilla y comprensible, optimizando notablemente el tiempo de desarrollo en trabajos multiproyecto.

El funcionamiento de Maven viene expresado según el siguiente diagrama:

Los cuadros grises son dados por el desarrollador, los rojos por la herramienta, y el marrón es la salida y resultado final (lo que en Maven se denominan Artefactos). Es decir, podemos comprobar que Maven es muy flexible a la hora de poder personalizar plugins para nuestro proyecto y también para gestionar las dependencias y configuraciones con un simple archivo POM (Project Object Model). Pero tampoco podemos olvidar que nos proporciona la rigidez suficiente con su arquitectura y metodología para no perder el foco y que los trabajos multiproyectos no se conviertan en los temidos “dinosaurios” difíciles de gestionar.

En definitiva y en nuestro caso, Maven nos proporciona una solución modular orientada al trabajo en equipo que elimina problemas de herramientas anteriores, como es la compleja resolución de dependencias, a la vez que nos permite integrar el trabajo con otras herramientas de Integración Continua. Es importante destacar para nuestro caso que se dispone de un plugin para proyectos JRuby.

Hudson

Esta herramienta de Integración Continua nos lleva un paso más allá de los resultados de nuestra solución de Ciclo de Vida, que es Maven. Es decir, ya no sólo se trata de paquetizar e integrar las distintas áreas de desarrollo de nuestro producto resolviendo las dependencias de código de los paquetes subdivididos, sino de que la integración sea efectiva, cumpla nuestros criterios de calidad y el tiempo empleado en la detección de errores y su resolución sea el menor posible. Hudson nos proporciona una solución sencilla para llevarlo a cabo.

Hudson es una herramienta libre y abierta relativamente nueva de Integración Continua muy utilizada y de gran éxito en el entorno de desarrollo del software. Su arquitectura basada en plugins y su fácil instalación la hacen una herramienta potente y fácil de usar. El desarrollo de plugins es una característica importante al destacar su flexibilidad.

Podemos comprobar las diferencias con otras herramientas CI (Integración Continua) en este link, comprobando que además de ser una de las más completas, su extensibilidad viene proporcionada por plugins, lo que la hace bastante modular y ligera si no se necesita de amplia funcionalidad.

Podemos comparar a Hudson con una de las herramientas CI más consolidadas actualmente, que es CruiseControl, comprobando que, además de ofrecer mayor amplitud de funcionalidad, sus características vienen determinadas por la instalación sencilla de plugins.

Resumiendo, parte de las ventajas de Hudson vienen determinadas por:

  • Fácil instalación y uso (un fichero WAR es toda la herramienta de instalación)
  • Plugins fácilmente extensibles
  • Soporte completo de Maven, lo que nos facilita enormemente la integración
  • Soporte para entornos “colaborativos” (múltiples equipos y grupos de proyectos)
  • Software Libre 100%
  • Sistema de alertas intuitivo para los desarrolladores
  • Muy pocos problemas “reportados” de esta herramienta

En definitiva, Hudson es una herramienta sencilla, de alta funcionalidad, abierta, bien documentada y con un futuro muy prometedor como CI Tool consolidada, y además, se integra muy bien con Maven. En nuestro caso cubre las necesidades, además de proporcionar un entorno “user-friendly”.

by David on April 9, 2009

Tras un duro y largo día de curro, ayer me encontré con una gran y grata sorpresa. Nada más y nada menos que un retrato-collage de mí mismo, de todo lo que me rodea y me gusta. Mi chica se toma bastante bien el hecho de que yo sea un geek, y me representa con un humor excelente. El dibujo me parece magnífico y me ha gustado tanto que me he tomado la libertad de postearlo en nuestro blog.

David\'s World

Si os ha gustado el dibujo tanto como a mí no dudéis en agradecérselo a la autora en su MySpace, donde también podréis encontrar magníficos dibujos suyos y contactar con ella.