2009-09-03 16 views
31

sto scrivendo uno script bash per automatizzare il processo di compilazione. ci sono due principali blocchi di build, uno è un compito ant e uno è un semplice vecchio "installazione mvn clean". Voglio fare qualcosa quando ci sono errori di compilazione provenienti da questi due processi di compilazione.come rilevare un errore di generazione da ant/maven tramite uno script bash?

e il problema è che queste build conterranno errori o errori di test di tanto in tanto, ma il risultato finale ha esito positivo. e credo che il codice di stato ($?) restituito da questi processi dovrebbe essere 0, indipendentemente dal fatto che la compilazione abbia esito negativo o abbia esito positivo, potrei sbagliarmi.

quindi qual è il modo migliore per il mio script di rilevare il risultato finale (generazione fallita/riuscita) senza catturare le false informazioni durante la compilazione intermedia (errori di test, ecc.) Da loro?

+2

Gli strumenti devono restituire gli stati di uscita appropriati. – derobert

+0

in realtà non sono sicuro di quale sia lo stato di uscita per ant/maven, presumo solo che restituiscano 0 anche il build fallito. quindi stai dicendo che restituiranno un valore diverso da zero quando la compilazione fallisce? questo renderà la mia vita molto più facile. – fei

+0

Se i tuoi test a volte passano e talvolta falliscono e non ti interessa in alcun modo, perché preoccuparti di eseguirli come parte della tua build? –

risposta

4

Secondo il Ant manual:

la formica avviare gli script (nella loro versione di Windows e Unix) restituire il codice di ritorno del programma Java. Quindi una build di successo restituisce 0, le build fallite restituiscono altri valori.

Maven restituisce anche un codice di uscita diverso da zero in caso di errore. Ecco come a link mostra come interrogare questo stato utilizzando l'API di Invasione Maven.

Quindi mi sembra che si dovrebbe essere in grado di gestire in modo esplicito i codici di ritorno nello script . Presumibilmente puoi ignorare i codici di errore relativi ai test ecc. Se questi non ti riguardano.

exec i codici di errore in Ant sono specifici del sistema operativo. Questi possono aiutare:

3

Qui è esattamente quello che faccio per ottenere il risultato desiderato.

<exec executable="${env.M2_HOME}/bin/mvn" dir="${basedir}" 
      failonerror="true" osfamily="unix"> 
     <arg value="-DskipTests=${argSkipTests}"/> 
     <arg value="-Doffline=${argOffline}"/> 
     <arg line="${projectsLine}"/> 
     <arg line="${resumeFromLine}"/> 
     <arg line="${alsoMakeLine}"/> 
     <arg line="${alsoMakeDependentsLine}"/> 
     <arg line="${commandsLine}"/> 
    </exec> 
11

Ci sono alcuni problemi contro Maven 2 ritornano i codici di ritorno non corretti (vale a dire sempre di ritorno 0). In particolare MNG-3651 corretto in Maven 2.0.9.

Nelle versioni più vecchie, mvn.bat è concluso con questa linea:

exit /B %ERROR_CODE% 

Da Maven 2.0.9 in poi, l'ultima riga è stato cambiato in questo:

cmd /C exit /B %ERROR_CODE% 

Quindi, un non-0 il codice di ritorno viene restituito se la compilazione fallisce. Nel caso di un ERRORE di build, il codice di ritorno è 1. Se non si è in grado di effettuare l'aggiornamento a 2.0.9+, si potrebbe considerare di modificare mvn.bat come sopra per restituire il codice corretto.

36
mvn clean test 
rc=$? 
if [[ $rc -ne 0 ]] ; then 
    echo 'could not perform tests'; exit $rc 
fi 
+4

Sarebbe molto meglio se potessi approfondire questa risposta. Come e perché risponde alla domanda meglio delle altre risposte? – nietonfir

+1

Questa risposta mi piace di più. Ho cercato su google come gestire i codici di errore da mvn in uno script di bash e la risposta di Renaud si adatta perfettamente. Sospetto che Fei abbia finito per usare una tecnica molto simile dopo aver scoperto che mvn restituirà un codice diverso da zero per i fallimenti del test. –

+0

Quasi perfetto - ma vorrei usare le virgolette, se vuoi davvero fare il confronto tra stringhe (vedi https://www.gnu.org/software/bash/manual/bashref.html/search for "=="), o "-ne", che è l'operatore di confronto per gli interi (non quotati). – cslotty

Problemi correlati