Instalación personalizada de OpenCms con Maven y Ant

15 06 2010

Una tarea que puede resultar enormemente tediosa es aquella de poner en producción un sistema desarrollado sobre el gestor de contenidos OpenCms, debido al gran número de módulos que pueden llegar a desarrollarse para un proyecto meianamente complejo. Poniendo que tengamos listas nuestras máquinas y el software de producción (aka, servidores de bases de datos, contenedor servlet, etc) y que ya hemos instalado OpenCms from scratch desplegando el war y siguiendo el asistente de instalación de Alkacon, instalar todos los módulos que hemos desarrollado, así como establecer todos los parámetros de configuración que nuestro sistema requiera en los ficheros de configuración de OpenCms puede suponer una verdadera pérdida de nuestro valioso tiempo.

No hace mucho que en la empresa donde trabajo estábamos preparando la puesta en producción de un sistema desarrollado sobre OpenCms que contaba con un número considerable de módulos y una configuración muy específica para que los mismos funcionasen correctamente sobre la instalación estándar de OpenCms, cosa que nos hizo tomar la decisión de hacer una pausa y emplear algo de tiempo en pensar una estrategia que hiciera de esta labor una tarea fácil y completamente automática. Pues bien, tras no demasiado tiempo pensando dimos con la solución que mejor se ajustaba a esta necesidad: construir nuestro propio asistente de instalación. ¿Cómo se consigue esto? Querido lector, siga usted leyendo.

La herramienta fundamental que se ha empleado para la construcción de un asistente de instalación personalizado ha sido Apache Maven.

En primera instancia, antes de abordar esta idea ya contábamos con las bondades de Maven para modelar y construir los módulos de OpenCms, como explica un antiguo compañero en este post, lo cual nos dejaba entrever un camino interesante para el propósito que estamos tratando.

Como elementos indispensables para desarrollar este instalador necesitamos:

En principio, modelamos nuestro asistente personalizado como un proyecto Maven conteniendo los siguientes elementos:

  • El asistente de instalación de Alkacon, que no es más que el war que desplegamos en nuestro contenedor, pero descomprimido en un directorio en el proyecto.
  • Los fuentes de todos los módulos de nuestro proyecto que queramos instalar en OpenCms, cada uno será un proyecto Maven, siendo el proyecto objeto de estudio en este post el proyecto padre.
  • Un fichero build.xml el cual le diremos a Ant cómo compilar y empaquetar nuestro asistente de instalación.

La estructura, pues, del sistema de ficheros de nuestro proyecto es algo con la siguiente forma:

/custom-opencms
| + opencms-module-1
  ...
   | - pom.xml
   | - profiles.xml
| + opencms-module-2
  ...
   | - pom.xml
   | - profiles.xml
 ...
| + opencms-module-N
  ...
   | - pom.xml
   | - profiles.xml
| + opencms-webapp
| + build.xml
| + pom.xml

A partir de este punto se asume que el lector he trabajado lo suficiente con Maven y Ant como para que sea capaz de entender el desarrollo que a continuación se expone.

Lo primero que tendremos que hacer, una vez montado el proyecto anterior en nuestro IDE favorito será escribir el fichero pom.xml para que contemple la compilación de todos los módulos de OpenCms de nuestro proyecto, para ello, simplemente crearemos una sección modules conteniendo todos los módulos que deseamos instalar:

<modules>
    <module>opencms-module-1</module>
    <module>opencms-module-2</module>
    ...
    <module>opencms-module-N</module>
</modules>

Hecho esto, debemos conseguir que los módulos compilados se alojen en algún lugar en el target de nuesto proyecto, para ello, mediante maven-antrun-plugin, crearemos un directorio bajo el directorio target del proyecto donde copiaremos todos los zips de los módulos ya compilados.

<build>
    <plugins>
        <plugin>
	    <groupId>org.apache.maven.plugins</groupId>
	        <artifactId>maven-antrun-plugin</artifactId>
	        <version>1.1</version>
	        <executions>
	            <execution>
	                <id>zip-module</id>
	                    <goals>
	                        <goal>run</goal>
	                    </goals>
	                    <phase>package</phase>
	                    <inherited>false</inherited>
	                    <configuration>
	                        <tasks>
	                            <echo>Packaging OpenCMS Modules...</echo>
	                                <mkdir dir="target/dist/modules" />
	                                <copy file="opencms-module-1.zip/target/es.joselopezpua.opencms-module-1.zip"
	                                      todir="target/dist/modules" />
	                                <copy file="opencms-module-2.zip/target/es.joselopezpua.opencms-module-1.zip"
	                                      todir="target/dist/modules" />
                                        ....
	                                <copy file="opencms-module-N.zip/target/es.joselopezpua.opencms-module-1.zip"
	                                      todir="target/dist/modules" />
                                        ...

Hasta aquí ya tenemos todos los módulos de nuestro proyecto recién salidos del horno con sólo hacer $ mvn clean package, ¿qué tal si los copiamos al instalador y le decimos que se prepare para instalarlos?

En la estructura de ficheros del asistente de instalación de Alkacon, que está bajo nuestro directorio opencms-webapp, en WEB-INF/packages/modules/, se encuentran los zips de todos los módulos que se instalarán durante el proceso de instalación, así que escribiremos las líneas apropiadas en nuestro fichero build.xml para que nuestra tarea Ant realice este trabajo.

<project>
    <target name="dist">
        <!-- Genera el directorio target/opencms-webapp -->
	<mkdir dir="target/opencms-webapp"/>
	<!-- Copia los ficheros del webapp de instalación de OpenCms -->
	<copy todir="target/opencms-webapp">
	    <fileset dir="opencms-webapp/target/dist" />
	</copy>
	<!-- Copia los módulos del proyecto a la carpeta de módulos del webapp de instalación -->
	<copy todir="target/opencms-webapp/WEB-INF/packages/modules">
	    <fileset dir="target/dist/modules" />
        </copy>
   </target>
</project>

Con esto el asistente ya tendrá nuestros módulos en el directorio en el que los espera, sólo nos falta indicarle que los importe, cosa que haremos modificando el fichero opencms-webapp/setup/components.properties, suponiendo que la paquetería de nuestros módulos es es.joselopezpua.custom.* y que el nombre para el conjunto de módulos será custom:

component.custom.name=Modulos de ejmplo de este post
component.custom.description=Modulos de OpenCms de mi proyecto
component.custom.modules=es\.joselopezpua\.custom.*
component.custom.position=200
component.custom.checked=true

Sólo queda decirle a nuestra tarea Ant que comprima el asistente en un war que desplegaremos en nuetro contenedor J2EE para instalar nuestro proyecto, para ello, añadir estas líneas a build.xml antes del cierre del nodo target:

	    <zip destfile="target/custom-opencms.war" basedir="target/opencms-webapp" />

Y listo, ahora cada vez que deseemos realizar un nuevo instalador con nuestros módulos tan sólo tendremos que ejecutar Maven y Ant de la siguiente forma:

$ mvn clean package

$ ant dist

Tendremos en el directorio target un war con un asistente de instalación de OpenCms que instalará todos nuestros módulos.

Para personalizar la configuración de partida de nuestro OpenCms, antes de construir este proyecto simplemente habrá que modificar conveniente los ficheros de configuración de OpenCms del instalador (en nuestro ejemplo, el directorio opencms-webapp). Incluso es posible modificar, dentro del subdirectorio setup, las páginas de los pasos del asistente, imágenes, scripts de creación de tablas en la base de datos, etc.

El punto fuerte de lo que se ha presentado en este post es la automatización, la cual nos brinda la oportunidad de distribuir el software que hemos desarrollado sobre la plataforma OpenCms de manera rápida, sencilla y segura (siempre y cuando hayamos realizado las instalaciones de prueba oportunas en nuestros entornos de prueba y preproducción) con el acabado profesional de una instalación desde cero en forma de Wizard.

Atrás quedan esas tardes aburridas instalando módulos uno por uno, desafiando a los ficheros de configuración y obteniendo desagradables sorpresas.

Anuncios







A %d blogueros les gusta esto: