2010-11-15 20 views
8

Tengo un proyecto maven de varios módulos y me gustaría poder ejecutar una operación (antrun) después de que todos los submódulos hayan terminado su ejecución.Proyecto de varios módulos de Maven: cómo ejecutar una operación después de que todos los submódulos hayan terminado

En mis proyectos construyo RPM de cada submódulo y en la fase de implementación copio los RPM (por ssh) en un repositorio de RPM.
El repositorio RPM requiere que ejecute un comando createdb después de agregar nuevos RPM para que pueda indexarlos.
Tengo un antrun que realmente ejecuta scp y copia los RPM al repositorio. Se ejecuta para cada submódulo que realmente produce un RPM y está enganchado al maven desplegar la fase. Lo que puedo hacer es que después de cada scp ejecute el comando createrepo, pero eso sería un desperdicio, tengo más de 10 submódulos y cada createrepo demora alrededor de un minuto, por lo que perderé un tiempo de construcción precioso.

Lo que me gustaría hacer es después de que todos los submódulos hayan terminado, y luego ejecutar el createrepo. Una vez.

Mi primer intento fue enganchar el antrun que llama al comando createrepo al pom del padre (el super-pom) desplegar la fase. Lo hice y el problema fue que la fase de despliegue del padre ejecuta antes de la fase de implementación de los submódulos. Quería que se ejecutara después de
No puedo adjuntar el createrepo antrun a ninguna otra fase posterior ya que la fase de implementación es la última en el ciclo de vida.

Así que mi pregunta es: ¿hay alguna manera de ejecutar un antrun de "limpieza" o un complemento en general que se ejecutará una vez, después de que todas las operaciones de compilación de todos los submódulos hayan finalizado correctamente?

Un truco sería crear otro submódulo y asegurarse de que sea el último al hacerlo dependiente de todos los demás módulos y ejecutar el createrepo desde la fase de implementación de este módulo. Pero eso es feo y difícil de mantener. Yo prefiero una solución más limpia.

Gracias

versión 2.2.1 Maven es

+0

¿Se le ocurrió una solución más agradable? –

Respuesta

3

no estoy tan seguro de que su última sugerencia de crear un módulo dedicado depende de todos los demás es tan feo. Después de todo, está aprovechando la gestión de dependencia de Maven. Puede nombrarlo de una manera muy obvia para dejar claro a los mantenedores lo que está sucediendo y que encajará muy bien con el proceso de construcción general del proyecto.

¿Por qué no ponerlo en su lugar y ver qué tan bien funciona para usted? Recuerde que el código de trabajo supera el código hermoso pero no funciona todo el tiempo.

+0

Mi concierto es de mantenimiento (cuando se agregan nuevos módulos) y cuán obvio es que v/s es un truco. Voy a ir con eso si no hay otra solución incorporada y obvia – Ran

+3

Estoy de acuerdo, un módulo llamado específicamente para esta tarea tiene mucho sentido. También puede colocarlo en un perfil separado para que solo se ejecute para una implementación específica. –

0

Estoy usando una solución que separa la construcción y el embalaje de las cosas de publicación. Como usamos Jenkins, cada compilación invoca el trabajo de publicación, que también es createrepo, y lo más agradable es que Jenkins también le permite ejecutar este trabajo de publicación en paralelo.

Lo complicado fue que, en realidad, durante la fase createrepo si dos trabajos se ejecutan exactamente en el mismo momento uno va a fallar, ya que no pueden hacer la misma operación en la misma carpeta en el mismo conjunto de archivos. Sin embargo, implementé el rebaño aquí solo para la fase createrepo, y ahora todos los trabajos se ejecutan realmente en paralelo y tres publicaciones en paralelo, así como también se probaron, pero estamos usando dos debido a algunas otras decisiones.

Sin embargo, utilizando este enfoque, hemos reducido el tiempo de construcción total de 1.5h a 15 minutos en total para más de veinte compilaciones.

Cuestiones relacionadas