2012-10-08 16 views
6

Tengo una configuración maven tradicional con proyecto principal y una serie de módulos, que son subproyectos. Cuando hago mvn deploy, ejecuta el ciclo de vida completo (incluyendo test) hasta deploy para cada proyecto en secuencia (primero en profundidad). Me gustaría evitar implementar cualquier subproyecto si alguno de los proyectos falla en la construcción. En otras palabras, me gustaría que el deploy del proyecto principal sea "todo o nada". ¿Hay alguna forma de lograr esto?Hacer que el proyecto matriz maven pruebe todos los módulos antes de implementar cualquiera de ellos

Respuesta

3

Si su repositorio remoto es un Pro ejemplo Sonatype Nexus, entonces la instalación de "puesta en escena" de Nexus Pro permitirá la publicación atómica para el buen repositorio.

Si está utilizando Jenkins, hay un plugin demora en el despliegue que va a desplegar todos sus artefactos como posterior a la generación (o muy posterior a la generación) acción (no le importa demasiado qué administrador de repositorio que use)

por último, uno de mis objetivos de mediano a largo plazo para el MRM-experto-plugin @ Codehaus es permitir la estadificación local del despliegue de modo que usted será capaz de hacer algo como

mvn mrm:catch-deploy deploy mrm:push-deploy 

PERO que ¡el último no está escrito todavía!

+0

Estoy cambiando la respuesta aceptada a esta porque creo que es correcto sugerir el uso de un servidor de CI para esto en lugar de maven, ese es el enfoque que voy a tomar. – Ramon

+0

Stephen, ¿a qué plugin de Jenkins se refiere para el despliegue retrasado? –

+0

No hace referencia a ningún complemento específico –

8

Maven en sí no puede hacer esto (todavía). Actualmente, el proceso de compilación ejecuta todos los objetivos en cada módulo individualmente. Hay planes para permitir que los objetivos para ver la imagen grande, pero eso es probablemente por Maven 4.

Por el momento, se puede utilizar un pequeño script de shell:

mvn clean install && mvn deploy -DskipTests=true 

La primera carrera se basa todo. La segunda ejecución no hará mucho (todo el código ya está compilado y las pruebas largas se saltan), así que es bastante rápido.

En realidad, prefiero este enfoque porque mi script también reemplaza cualquier elemento distributionManagement existente con los de la memoria caché de mi empresa. Esto significa que puedo implementar cualquier proyecto para mi empresa sin necesidad de realizar ningún cambio en el POM original. Aquí está la secuencia de comandos:

#!/bin/bash 

if [[ ! -e pom.xml ]]; then 
    echo "Missing pom.xml" 1>&2 
    exit 1 
fi 

sed \ 
    -e '/<distributionManagement>/,/<\/distributionManagement>/d' \ 
    -e '/<\/project/d' \ 
    pom.xml > pom-deploy.xml || exit 1 

cat >> pom-deploy.xml <<EOF 


    <!-- ADDED BY $0 --> 
    <distributionManagement> 
     ... whatever you need ... 
    </distributionManagement> 
</project> 
EOF 

mvn -f pom-deploy.xml clean install && \ 
    mvn -f pom-deploy.xml deploy -DskipTests=true && \ 
    rm pom-deploy.xml 

exit 0 

gist

Cuestiones relacionadas