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.





Importar módulos en OpenCms por lotes… ¿cómo?

17 02 2010

Una de las tareas más tediosas a la hora de poner en marcha nuestro gestor de contenidos basado en OpenCms es, sin duda alguna, la importación de los módulos que queramos añadir, máxime si estos son demasiados y si son dependientes entre ellos, ¿no es cierto?.

Para facilitar esta tarea, mientras desarrollaba para un proyecto con OpenCms en la empresa en la que trabajo, se me ocurrió hacer un pequeño alto en el camino y construir un modulito que permitiese importar módulos por lotes a nuestro gestor de contenidos. De aquí salió MultiModuleImporter.

La idea es sencilla, recopilamos todos aquellos módulos que queramos importar en un fichero comprimido .zip, lo seleccionamos desde la administración del workplace y todos nuestros módulos quedan importados, es más, todas las dependencias entre el conjunto de módulos a instalar quedan resueltas gracias a la ordenación topológica que ofrece la API de OpenCms.

A este módulo se le saca verdadero partido cuando, tras instalar OpenCms debemos instalar todos los módulos que conformen nuestra versión final del gestor de contenidos que hayamos desarrollado, evitando tener que importarlos uno a uno y evitando comprobar las dependencias, cosa que puede llegar a ser bastante frustrante.

Os paso el enlace a la descarga del módulo en la web de OpenCms Hispano, para que lo probéis y juzguéis vosotros mismos:





Sincronización de instancias de OpenCms. ¡Gracias Ángel!

11 02 2010

A los que desarrolléis con OpenCms os invito a que echéis un vistazo al excelente trabajo que ha realizado mi colega Ángel C. Lázaro desarrollando un nuevo módulo para sincronizar instancias de OpenCms cuando tenemos un cluster de éstas para conseguir alta disponibilidad.

Este trabajo pretende ser una alternativa Open Source al módulo de pago ya existente

comenta Ángel.

Os paso el enlace al proyecto publicado en Google Code

También os dejo el post en el que Ángel nos cuenta todo acerca de su trabajo.

Buen trabajo Ángel.








A %d blogueros les gusta esto: