2012-10-08 4 views
6

Ho una configurazione tradizionale maven con progetto padre e un numero di moduli che sono sottoprogetti. Quando eseguo mvn deploy, esegue l'intero ciclo di vita (compreso test) fino a deploy per ciascun progetto in sequenza (profondità-prima). Vorrei evitare di distribuire sottoprogetti se uno qualsiasi dei progetti non riesce a creare. In altre parole, mi piacerebbe che lo deploy dell'intero progetto padre fosse "tutto o niente". C'è un modo per raggiungere questo obiettivo?Fare in modo che tutti i moduli del progetto padre maven testano tutti i moduli prima di distribuirli.

risposta

3

Se il repository remoto è un esempio Pro Sonatype Nexus, quindi l'impianto "messa in scena" di Nexus Pro permetterà per la pubblicazione atomica al corretto repository.

Se si utilizza Jenkins, esiste un plugin distribuzione ritardata che sarà schierare tutti i vostri artefatti come un post-generazione (o molto di post-generazione) l'azione (non importa troppo che repository manager si utilizza)

Infine, uno dei miei obiettivi a medio-lungo termine per il MRM-maven-plugin @ Codehaus è quello di consentire stadiazione locale di distribuzione in modo che si sarà in grado di fare qualcosa di simile

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

MA che l'ultimo non è ancora stato scritto!

+0

Sto cambiando la risposta accettata a questo perché ritengo che tu abbia ragione a suggerire di utilizzare un server CI per questo anziché per Maven, questo è l'approccio che prenderò. – Ramon

+0

Stephen, a quale plugin di Jenkins ti riferisci per l'implementazione ritardata? –

+0

Non si riferisce a nessun plug-in specifico –

8

Maven non può farlo (ancora). Attualmente, il processo di compilazione esegue tutti i target su ciascun modulo individualmente. Ci sono piani per permettere obiettivi per vedere il quadro generale, ma questo è probabilmente per Maven 4.

Nel frattempo, è possibile utilizzare un piccolo script di shell:

mvn clean install && mvn deploy -DskipTests=true 

La prima esecuzione si basa tutto. La seconda esecuzione non farà molto (tutto il codice è già compilato e i test lunghi sono saltati), quindi è piuttosto veloce.

In realtà preferisco questo approccio perché il mio script sostituisce anche eventuali elementi esistenti distributionManagement con quelli per la cache della mia azienda. Ciò significa che posso implementare qualsiasi progetto per la mia azienda senza dover apportare alcuna modifica al POM originale. Ecco lo script:

#!/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

Problemi correlati