miércoles, 30 de septiembre de 2009

Usando Hudson como servidor de integración contínua

En el artículo anterior se hizo una descripción de lo que es la integración continua.

Ahora vamos a ver cómo usar Hudson como servidor de integración contínua, para que construya nuestro proyecto de forma automática si hay algún cambio en el repositorio de Subversion y nos informe por email en caso de que se produzca algún error.

En primer lugar, nos descargamos la última versión de Hudson de la web:
https://hudson.dev.java.net/

Nos descargaremos la último versión de Hudson como un archivo .war. Hudson es tan fácil de instalar en un servidor Tomcat cómo copiar el .war en el directorio webapps. Arrancamos el Tomcat y vamos a http://localhost/hudson:

Antes de trabajar con ningún proyecto, vamos a configurar el entorno de Hudson desde Manage Hudson:

Clicamos sobre Configure System:

En nuestro caso, nos interesa configurar Maven y el JDK para que Hudson sea capaz de encontrar sus rutas:

También querremos configurar la notificación por email parapoder enviar correos que alerten sobre construcciones erróneas del proyecto. En caso de no tener un servidor de correo, se puede usar fácilmente Apache James como servidor de correo. Vimos cómo hacerlo en un post anterior.

Una vez tenemos el servidor de correo instalado, podemos modificar la configuración de Hudson:

Ahora podemos crear un nuevo proyecto Java en Eclipse. Para nuestro ejemplo hemos creado un proyecto Maven de una aplicación web y la hemos incorporado a Subversion.

Posteriormente, volvemos a la pantalla principal de Hudson para crear un nuevo job que maneje nuestro proyecto:

Seleccionaremos la última opción Build a maven2 project. A continuación entraremos a la ventana de configuración del proyecto. Configuramos el repositorio de Subversion del proyecto y la consulta de Hudson a este repositorio en busca de cambios que lancen una nueva construcción. Hacemos que esta consulta a Subversion se realice cada minuto:

Ahora lanzamos una construcción de forma manual para construir el espacio de trabajo desde el apartado Workspace del proyecto:

Desde este momento, una vez construido el proyecto, cualquier cambio en el proyecto que sea entregado a Subversion debería reflejarse en una reconstrucción del proyecto. Si subimos una modificación a Subversion, podemos ver cómo Hudson programa una nueva construcción cuando detecta el cambio:


Si ahora introducimos un cambio con un error de compilación, la construcción detectará este error y enviará un correo alertando de este situación:

Con esto, hemos visto cómo configurar y empezar a usar Hudson cocmo servidor de integración continua.

5 comentarios:

  1. Muy interesante.

    Una pregunta. De cara a tener un servidor de integración continúa, qué te parece la idea de que los "artifact" generados desde Hudson se despleguen automáticamente en el servidor de aplicaciones?

    Otras cosillas interesantes que vi por ahí. Maven se integra con los análizadores de código estático "Findbugs" y "PMD", con el análizador de formato de código "checkstyle". Sería interesante poder disponer en el momento de la generación del "artifact" de la siguiente información (a ser posible publicada en un servidor web):

    - Reportes del análisis estático de código (Posibles problemas de diseño).
    - Reportes del estilo del código (están todos los javadocs?, se siguen las convenciones?).
    - Documentación Javadoc.
    - etc.

    ¿Qué te parece?

    ResponderEliminar
  2. Lo de desplegar automáticamente los artifacts en el servidor de desarrollo me parece que puede ser problemático si se quiere tener un entorno de desarrollo algo estable donde poder ver algo. Si constantemente se están haciendo entregas de código que Hudson detecta y automáticamente reinicia la aplicación, esto podría fastidiar a alguien que esté probando la aplicación en el servidor de desarrollo.

    Aunque, por otra parte, el no realizar el despliegue de forma automática no te permite probar en todo momento sobre la última versión del proyecto. Supongo que dependerá de cuál sea tu prioridad...

    Respecto a las herramientas de gestión de la calidad del software como Checkstyle, Findbugs, PMD y otras como Cobertura, JXR o JDepend, son interesantísimas. Tanto, que verás aparecer en el blog artículos sobre ellas.

    Me parecen muy útiles, sobre todo por la disponibilidad de plugins para incorporarlas tanto en Eclipse como en Maven.

    Un saludo.

    ResponderEliminar
  3. Hola.

    No se si sea demasiado tarde para hacer preguntas sobre este post, pero quisiera preguntarte algo:

    Como manejas tu la automatización de las pruebas en hudson, cuando los test cases hacen cambios en las bases de datos e invocan Web Services que modifican información en otros sitios? He visto que se habla mucho de stub y de Mocks, pero no sé como hacer para pasar del ambiente de pruebas a producción sin tener que tocar el código de los test cases. Cualquier idea y/o comentario es bien recibido.Muchas gracias y buena noche.

    ResponderEliminar
  4. Hola.

    No estoy seguro de haber entendido muy bien la pregunta, pero voy a intentar responderte.

    El código y las pruebas deberían estar separados de forma que se pudiesen desplegar de forma independiente, y no estar en el mismo proyecto.

    Para las pruebas unitarias, por ejemplo, utilizar una herramienta de géstión de proyectos como Maven facilita estas tareas. Simplemente siguiendo las propias convenciones de Maven, se separan en directorios diferentes el código y los tests. En la construcción de los artefactos se obviaran los casos de prueba para tener desplegables que sólo contienen el código.

    Espero haberte servido de ayuda.

    Un saludo,

    Jorge Roldán

    ResponderEliminar
  5. Hola que tal.

    Me explico, lo que pasa es que yo tengo unos testCases en mi proyecto web que tengo con maven. Este proyecto a su vez ya lo tengo en Hudson y me ejecuta automaticamente los testCases. Los testCases y el código java los tengos en ramas distintas de mi proyecto y hasta ahi todo esta muy bien. Mi problema es que cuando algunos de mis testCases me ejecutan tareas en la base de datos o invocando web services, me están generando basura en mi entorno, o en algunos casos fallan mis testCases, porque los WS que invocan no esta disponibles. He leido que para ello usan Mocks y Stubs, pero no tengo claro como trabajarian estos mocks y stubs con Hudson, y como hacer para que llevar mi proyecto a producción sea algo transparente con estos mocks y stubs.

    Agradezco cualquier comentario.

    Gracias y buen día.

    ResponderEliminar