domingo, 28 de octubre de 2007

Integración continua usando Hudson

Hudson es otra herramienta de integración continua open source que se encarga de monitorear la ejecución de tareas repetidas ya sea la creación de un proyecto o la ejecución de tareas en un cron, es muy similar a Continuum y Cruise Control.

Entre las características de la herramienta tenemos:

  • Fácil de instalar. Se distribuye como war que se instala muy fácil en cualquier web container como tomcat. También se puede ejecutar como standalone ejecutando el comando
  • java -jar hudson.war

  • La administración se realiza totalmente usando una interfaz web lo cual facilita enormemente su configuración.
  • Soporta notificación via IM, e-mail y RSS.
  • Gran cantidad de reportes para JUnit y TestNG.
  • Extensión de la herramienta a través de plugins. Actualmente se cuentan con plugins de JIRA, findbugs, Plot, Polarion, Trac, Clover entre otros.
  • Soporta cvs y subversion como scm. También se puede trabar sin repositorio para control de versiones (scm) lo cual es útil cuando se tienen proyectos personales que se almacenan de forma local.

A continuación tenemos una serie de pantallas de la herramienta


  • Pagina principal


  • Agregar un nuevo proyecto





  • Opciones de administración


  • Detalle de un proyecto




  • Ejecución de un build





  • Opciones al agregar un proyecto


  • Estructura en disco





Powered by ScribeFire.

10 comentarios:

Blanca dijo...

Hola
Estoy empezando a trabajar con Maven 2 y Continuum, y la verdad es que aun ando bastante despistada.
Tengo un problema con las dependencias, al generar el war, en WEB-INF/lib/ maven introduce los .jar correspondientes a las dependencias que se indican en el pom.xml y también los .jar que están en el directorio WEB-INF/lib/ del proyecto, con lo que algunas de ellas se duplican. He intentado indicar en el pom que excluya en el war los .jar que hay en el directorio WEB-INF/lib/ del proyecto pero no consigo que funcione.
Si usted pudiera ayudarme se lo agradecería.
Muchas gracias de antemano y disculpe las molestias.

Unknown dijo...

Por lo que entiendo tu tienes configurado un proyecto donde algunas dependencias están en el pom.xml y otras las tienes en una carpeta que asumo es src/main/webapp/WEB-INF/lib. Creo que hay varias formas de lograr lo que quieres, una puede ser definir esa carpeta como un recurso (build-resources-resource) y agregar un exclude del tipo **/*.jar. No se si esta opción fue la que usaste. La que yo recomiendo es que no exista ningún jar en tu proyecto. Todas las dependencias deben estar en el repositorio de maven 2 y de allí se van a tomar al momento de generar el war. Supongo que las tienes definidas en el proyecto para poder usarlas por el IDE de desarrollo (eclipse, netbenas, etc). Si esa es la razon entonces es mas fácil porque existen plugins que te permiten integrar las dependencias del pom.xml como dependencias del IDE (se agregan al classpath). No se si esto te ayuda, si quieres me das mas detalles de la estructura de directorios de tu proyecto y de los cambios que has intentado en el pom para poder ayudarte.

Blanca dijo...

Hola, muchísimas gracias por tu atención y ayuda. Has acertado de pleno :)
El problema es que se utiliza JDeveloper, y hasta donde yo se (que no es mucho, para que engañarnos) no hay plugin para este IDE.
Otro problema viene porque la plataforma de Integración Continua no está en funcionamiento real, se ha instalado y estoy probandolo todo a la vez que intento por el momento no interferir en los desarrollos, lo que empiezo a sospechar que no es una buena idea.
Todos los proyectos se distribuyen básicamente en dos directorios Proyecto/src y Proyecto/web. Las librerías se encuentran en Proyecto/web/WEB-INF/lib.
En principio probé lo siguiente (no se si se verá bien aquí por las tabulaciones, además he tenido que usar paréntesis porque me lo tomaba como etiquetas HTML):
(build)
(sourceDirectory)src(/sourceDirectory)
(plugins)
(plugin)
(groupId)org.apache.maven.plugins(/groupId)
(artifactId)maven-war-plugin(/artifactId)
(configuration)
(warSourceDirectory)web(/warSourceDirectory)
(resource)
(directory)web/WEB-INF/lib(/directory)
(excludes)
(exclude)**.jar(/exclude)
(/excludes)
(/resource)
(/configuration)
(/plugin)
(/plugins)

Como no funcionó, probé esto:

(build)
(sourceDirectory)src(/sourceDirectory)
(plugins)
(plugin)
(groupId)org.apache.maven.plugins(/groupId)
(artifactId)maven-war-plugin(/artifactId)
(configuration)
(warSourceDirectory)web(/warSourceDirectory)
(warSourceExcludes)web/WEB-INF/lib/*.jar(/warSourceExcludes)
(/configuration)
(/plugin)
(/plugins)

También he probado a sacarlo de la configuración del plugin war:

(resources)
(resource)
(directory)src(/directory)
(/resource)
(resource)
(directory)web/WEB-INF/lib(/directory)
(excludes)
(exclude)**.jar(/exclude)
(/excludes)
(/resource)
(/resources)

Hasta el momento no he conseguido que me haga caso, y la verdad, ya no se me ocurre que más probar.
Reitero mi agradecimiento.

Unknown dijo...

La verdad que no conozco mucho de JDeveloper pero basado en lo que me explicastes cree un proyecto de prueba y puede reproducir tu problema.

En principio defini lo siguiente (use tu nomenclatura :) )

(sourceDirectory)
src/main/java
(/sourceDirectory)
(resources)
(resource)
(directory)web(/directory)
(/resource)
(/resources)

De esta forma toma los fuentes desde src/main/java y agrega los recursos definidos en la carpeta web. Esta definicion incluye todo el contenido de la carpeta web y alli es donde esta tu problema, porque agrega todos los jars en web/WEB-INF/lib y los definidos en el pom.xml.

Para arreglarlo solo hace falta un pequeño cambio y es agregar un exclude (usa notacion tipo ant)

(sourceDirectory)
src/main/java
(/sourceDirectory)
(resources)
(resource)
(directory)web(/directory)
(excludes)
(exclude)**/*.jar(/exclude)
(/excludes)
(/resource)
(/resources)

y con esto me funciono tal y como tu lo quieres (no duplico jars, solo incluye los del pom).

Revisando mas a detalle tus pruebas quizas quitando un * en la ultima definicion tambien funcione

cambiar
(exclude)**.jar(/exclude)
por
(exclude)*.jar(/exclude)

Prueba ambas opciones y me avisas si tienes inconvenientes.

Con respecto a integracion continua, yo tambien uso Continuum y lo tengo en ambiente de produccion desde hace unos meses, si tienes problemas con algo avisame.

Blanca dijo...

Hola de nuevo
¡Lo conseguí!
Al comentarme el error de notación que tenía al indicar la exclusión de los .jar (**.jar), estuve dándole vueltas a todas las pruebas que había hecho. Además de eso, tenía un error al indicar el directorio WEB-INF, parece ser que hay que ponerlo relativo al directorio web, y no relativo al directorio donde está el pom. Con esto he conseguido que funcione:

Otra cuestión que tenía pendiente era que en el war generado me incluía los .java, para evitarlo he seguido al pie de la letra lo que tú me indicaste ¡y funcionó a la primera!. Así que al final la sección build queda así:

(build)
(sourceDirectory)src(/sourceDirectory)
(plugins)
(plugin)
(artifactId)maven-war-plugin(/artifactId)
(groupId)org.apache.maven.plugins(/groupId)
(version)2.0(/version)
(configuration)
(warSourceDirectory)web(/warSourceDirectory)
(warSourceExcludes)WEB-INF/lib/*.jar(/warSourceExcludes)
(/configuration)
(/plugin)
(/plugins)
(resources)
(resource)
(directory)src(/directory)
(excludes)
(exclude)**/*.java(/exclude)
(/excludes)
(/resource)
(/resources)
(/build)


En cuanto al tema del plugin para JDeveloper, estuve buceando por internet y en la web de Oracle localicé una página donde tratan la posibilidad de trabajar desde JDeveloper con Maven, y por lo que parece si que hay un plugin, aunque aun no he tenido tiempo de mirarlo a fondo. Te pongo el enlace por si te interesa.
http://www.oracle.com/technology/products/jdev/howtos/1013/maven/maven.html

Ahora me toca pegarme con los despliegues, que funcionan a veces si, a veces no, (puf), aunque esto sospecho que va a ser cuestión del comando de despliegue oc4j remoto.

Muchísimas gracias por tu ayuda, y para tu desgracia ;), te tomo la palabra, y me temo que seguiré dándote guerra.

Un saludo muy cordial

Unknown dijo...

Te ayudare en lo que pueda :)

Unknown dijo...

Hola
estoy empezando a utilizar Hudson pero tengo un problema. Como ejecutar una tarea ant en este CI
Agradezco de antemano

Saludos

Unknown dijo...

La configuracion de ant es muy similar a la del resto de los proyectos. En esta pagina puedes ver como se configura un script de ant con hudson

http://hudson.gotdns.com/wiki/display/HUDSON/Building+a+software+project

Unknown dijo...

gracias

Juan C dijo...

Hola..

Me gustaria saber si existe algun plugin para power builder.

Muchas gracias de antemano