Hudson and Tomcat 7 (Spanish version)

24 Sep 2013

Compartelo:Share on Facebook0Share on Google+0Tweet about this on TwitterShare on LinkedIn0

La evolución en nuestra profesión es frenética. Como consecuencia de ello no dejan de aparecer nuevas herramientas que pretenden hacernos el día a día más llevadero, aunque en mi opinión la mayoría de ellas solo consiguen complicarlo más (mi filosofía es que lo simple es lo que funciona).

Sin embargo, entre tanta herramienta descartable siempre aparecen herramientas realmente útiles, y en este grupo metería con honores a los entornos de integración continua como Bamboo, Continuum, Hudson, etc. No pretendo dar un curso sobre ellos (en google los hay muy buenos) pero el que los haya usado sabe que nos ahorran mucho trabajo al poder automatizar gran cantidad de tareas.

Uno de los entornos más populares es Hudson, y una de sus funciones más prácticas es la capacidad de compilar y desplegar una aplicación sobre un servidor Tomcat, pudiendo incluso programar la tarea para que se ejecute periódicamente. Una maravilla desde luego… hasta que llegó Tomcat7. Aquellos que hayan intentado desplegar un proyecto en Tomcat7 usando Hudson se habrán encontrado con una bonita excepción tal que:

 Caused by: java.io.FileNotFoundException: http://localhost:8080/manager/list

¡Vaya por Dios, con lo bien que iba en Tomcat6 y ahora deja de funcionar! El problema es fácilmente resoluble: usa Jenkins. Sin embargo esta migración no es siempre trivial. Hay empresas de cierto volumen donde no es posible tanta flexibilidad y el hecho de migrar a otro entorno de integración contínua puede no ser planteable a corto plazo.

Si buscamos con nuestro amigo Google, es un bug reconocido y se plantean soluciones muy variopintas, incluyendo el reemplazo de algún jar dentro de hudson. Personalmente esta solución no me gusta y hay una solución mucho más elegante para conseguir esto mismo sin necesidad de tocar Hudson: sírvete de Apache.

El problema que tiene Hudson con Tomcat7 es causado porque en Tomcat7 las urls del manager han cambiado respecto a Tomcat6, de ahí que cuando intenta el despliegue no encuentre la url. De hecho tomcat7 tiene más de un manager (no solo html) y todos igualmente válidos para nuestro propósito. Apache tiene un módulo muy práctico, mod-proxy, que permite redirigir peticiones desde una url a otra. Dicho esto ya veis por donde va la solución ¿verdad? Tan simple como montar un apache redirigiendo a las nuevas urls del tomcat7. Con las siguientes reglas en Apache el problema queda resuelto:

ProxyPass /manager/list http://SERVIDOR:PUERTO/manager/text/list
ProxyPassReverse /manager/list http://SERVIDOR:PUERTO/manager/text/list

ProxyPass /manager/undeploy http://SERVIDOR:PUERTO/manager/text/undeploy
ProxyPassReverse /manager/undeploy http://SERVIDOR:PUERTO/manager/text/undeploy

ProxyPass /manager/deploy http://SERVIDOR:PUERTO/manager/text/deploy
ProxyPassReverse /manager/deploy http://SERVIDOR:PUERTO/manager/text/deploy

Escuchamos las urls originales (/manager/*) y las dirigimos a las nuevas del Tomcat7 (/manager/text/*). Ahora basta con entrar en nuestro proyecto configurado en hudson, en la sección Tomcat URL tendremos algo tal http://servidor:8080/ (suponiendo el tomcat levantado en el puerto 8080) y simplemente hay que cambiarlo por algo tal que http://servidor/ (puerto 80 por defecto, esto es el del apache).

Con las 3 reglas definidas anteriormente el hudson será capaz de recuperar las aplicaciones desplegadas (list), replegar la versión antigua si fuera necesario (undeploy) y desplegar la nueva versión (deploy).

Así de simple y fácil, sin necesidad de modificar nuestra instalación de hudson.

Post relacionados

Compartelo:Share on Facebook0Share on Google+0Tweet about this on TwitterShare on LinkedIn0

Sin comentarios

Dejar un comentario

*