Integración CVS, Hudson, Maven y Archiva en proyectos Java
Vamos a ver aquí una pequeña descripción de cómo pueden interactuar todas estas herramientas (CVS, Hudson, Maven y Archiva) en un proyecto java. Por supuesto, he puesto estas herramientas en concreto por poner algo y porque son con las que estoy más familiarizado, pero de todas ellas tenemos alternativas. Por ejemplo, podemos usar Subversion en vez de CVS, CruiseControl en vez de Hudson, etc.
Breve descripción de las herramientas[editar]
Antes de nada, por si no las conoces, una breve descripción de qué es cada una de estas herramientas y para qué sirven.
CVS[editar]
CVS es un sistema de control de versiones. Si montamos un servidor de CVS, podemos guardar en él los ficheros fuente de nuestros proyectos, con todas sus diferentes versiones. De esta forma, podemos obtener versiones antiguas, comparar unas con otras para ver qué cambios hemos realizado, etc.
Los desarrolladores, con un cliente de CVS, pueden obtener los fuentes, modificarlos y volver a subirlos al servidor, de forma que este almacenará tanto las versiones antiguas como la nueva. Normalmente, los IDEs habituales (eclipse, netbeans, ...) tienen integrado su propio cliente de CVS, de forma que el desarrollador puede hacer estas operaciones desde el mismo IDE.
Maven[editar]
Maven es una herramienta de línea de comandos, sin interface gráfica de usuario. Permite realizar, entre otras, las siguientes cosas:
- Crear la estructura de directorios de un proyecto java desde cero, creando subdirectorios para los fuentes java, para los test unitarios, para los ficheros de configuración, etc.
- Nos da directamente los comandos para compilar nuestro proyecto, generar los jar (o war, ear, etc), el zip de distribución de nuestro proyecto, etc.
- Se encarga de guardar los jar de los que dependemos y de buscarlos en internet o en el servidor que le indiquemos si no disponemos de ellos.
- Cada vez que se compila con maven, se pasan automáticamente todos los test unitarios, dando fallo en el compilado si falla algún test.
Las ventajas de usar maven frente a no usarlo son básicamente las siguientes:
- Todos los proyectos tienen la misma estructura. Un desarrollador puede cambiar de un proyecto a otro sin necesidad de que nadie le indique dónde están las cosas.
- Todos los proyectos se compilan de la misma forma. Un desarrollador que conozca maven puede compilar el proyecto sin que nadie le diga dónde está el script de compilado o cómo ejecutarlo.
- No tenemos que preocuparnos de los jar que necesite nuestro proyecto, maven se encarga de gestionarlos.
- No tenemos que preocuparnos de lanzar los test automáticos cada cierto tiempo. Maven lo hace por nosotros cada vez que compilamos.
Archiva[editar]
Cuando un proyecto maven depende de otros jar (por ejemplo, de log4j), maven lo busca en determinados servidores de jars de internet, como ibiblio, donde hay montones de librerías (jar) de java organizadas de forma que maven pueda encontrarlas.
Archiva es un servidor de jars compatible con maven. De esta forma, podemos montar nuestro propio servidor de jars para maven, en el que almacenar nuestras propias librerías y proyectos. Podremos entonces hacer proyectos que dependan de estas librerías propias y maven sabrá encontrar los jar correspondientes.
Archiva hace además de proxy con internet. Podemos configurar maven para que sólo busque jars en nuestra instalación de Archiva. Será Archiva el que comprobará si tiene dicho jar para pasárselo a maven o va a buscarlo a internet en los repositorios de jars que le configuremos.
Hay además lo que se conocen como repositorios de SNAPSHOTS. Son repositorios que guardan jar que están todavía en desarrollo, por lo que cambian con frecuencia. En dicho repositorio se guardan los jar que se van generando con su fecha y hora de compilado. Si nuestro proyecto depende de una versión SNAPSHOT, maven ira a buscar el jar siempre a Archiva, indpendientemente de que el desarrollador tenga o no esa jar. Si la versión del jar en Archiva es más moderna que la que tiene el desarrollador, maven traerá y usará la versión más moderna. Esto garantiza que cada vez que el desarrollador compile, lo hará con las versiones más modernas de los jar de los que depende.
Hudson[editar]
Hudson es un sistema de integración continua. Si tenemos Hudson arrancado y configurado, se encargará de mirar todas las noches si ha habido cambios en los fuentes de CVS. Si ha habido cambios, sacará los fuentes de CVS y los compilará. Si todo el proceso es correcto, dejará los jar a disponsición del que los necesite. Si el compilado falla, enviará un correo a los responsables del proyecto y a los desarrolladores que hayan metido los cambios en cvs.
Una herramienta de este estilo ayuda a que los fuentes en CVS compilen correctamente, avisando por medio de email si hay algún problema.
Hudson tiene además interface a través del navegador web, en el que podemos ver de un vistazo que proyectos han compilado correctamente, cuales han fallado, qué cambios se han hecho en ellos, etc.
Todo junto[editar]
Veamos como funciona todo esto junto.
- Un desarrollador toca los fuentes del proyecto y compila con maven.
- maven busca en archiva los jar más modernos de los que depende el proyecto para actualizarlos. Realiza el compilado y pasa los test automáticos.
- Si todo va bien, el desarrollador prueba su código y luego mete los fuentes en CVS.
- Por la noche, Hudson ve que ha habido cambios en CVS, extrae los últimos fuentes de CVS y compila el proyecto usando maven. Si no compila correctamente, envía un correo al desarrollador que ha metido en CVS.
- Lanzado por Hudson, maven compila el proyecto, pasa los test automáticos y si todo va bien, sube el jar generado a Archiva.
En la siguiente figura se muestra todo el proceso. Se han puesto los servidores de Archiva, Hudson y CVS por separado, pero podrían ser perfectamente una misma máquina. Los comandos "mvn ..." son comandos maven. Los comandos "cvs ..." son comandos de CVS.