2014-10-15 16 views
5

Vorrei aprire il file di report di alcuni dei plugin "check" e "test" che utilizzo quando un controllo fallisce. So che ho can use "finalizedBy per eseguire un'altra attività, indipendentemente dal fatto che l'attività originale sia stata eseguita. Usando questa conoscenza ho provato quanto segue per aprire il report solo se l'attività corrispondente (in questo esempio checkstyle) fallisce:Gradle: esegue un'azione solo se un'operazione fallisce

task showCheckStyleResultsInBrowser(type: Exec) { 
    ext.htmlFileName = "main.html" 
    executable 'open' 
    args 'file:///' + checkstyleMain.reports.xml.destination.parent + "/" + ext.htmlFileName 
} 

task showCheckStyleResultsIfFailed { 
    ext.aCheckFailed = true 
    doLast { 
     if (ext.aCheckFailed) { 
      showCheckStyleResultsInBrowser.execute() 
     } 
    } 
} 

checkstyleMain { 
    finalizedBy 'showCheckStyleResultsIfFailed' 
    doLast { 
     // convert the xml output to html via https://stackoverflow.com/questions/20361942/generate-checkstyle-html-report-with-gradle 
     ant.xslt(in: reports.xml.destination, 
       style: new File('config/checkstyle/checkstyle-noframes-sorted.xsl'), 
       out: new File(reports.xml.destination.parent, showCheckStyleResultsInBrowser.htmlFileName)) 

     showCheckStyleResultsIfFailed.aCheckFailed = false 
    } 
} 

Spiegazione (per quanto ho capito):

  • showCheckStyleResultsInBrowser ist il compito che in realtà fa l'apertura del rapporto. È possibile ignorare ciò che effettivamente fa, ma è quello che dovrebbe essere eseguito se l'attività di controllo non riesce
  • L'attività showCheckStyleResultsIfFailed dichiara una proprietà aCheckFailed e la inizializza su true. Quando viene eseguito, controlla se è ancora vero (il che significa che il controllo non è stato completato con successo) e, in tal caso, apre il report utilizzando showCheckStyleResultsInBrowser.
  • checkstyleMain è l'attività che esegue il controllo effettivo. Sono interessato al suo risultato. Comunque non so come arrivarci. Quindi, al termine dell'attività checkStyleMain, ho impostato la proprietà aCheckFailed su false basandosi sul fatto che l'ultimo passaggio verrà eseguito solo se nessuno dei controlli precedenti ha avuto esito negativo.
  • showCheckStyleResultsIfFailed è impostato per l'esecuzione dopo checkstyleMain indipendentemente dal numero di finalizedBy. In questo modo verrà eseguito anche se l'errore non riesce. Utilizza la proprietà aCheckFailed per determinare se è stato completato correttamente.

Questo funziona correttamente se eseguo una compilazione completa. Ma se eseguo solo una ricostruzione parziale e l'attività checkstyleMain non viene eseguita, poiché tutti i suoi risultati sono già aggiornati, ho finito con aCheckFailed true perché non è stato eseguito checkstyleMain, il che fa sembrare che qualcosa effettivamente è andato storto.

Quindi, come posso eseguire l'attività showCheckStyleResultsInBrowser se e solo se l'attività checkstyleMain non riesce? Inoltre, la mia soluzione sembra piuttosto ingombrante e hacky anche per quello che ottiene. C'è un modo più semplice?

risposta

8

È possibile interrogare lo stato dell'attività per determinare se ha avuto esito negativo o meno.

task showCheckStyleResultsIfFailed { 
    onlyIf { 
     checkstyleMain.state.failure != null 
    } 
} 
+0

Questo rende davvero molto più bello grazie. –

+0

@PeterNiederwieser true, se possibile, vorrei utilizzare il risultato effettivo del controllo. Ma per ora stavo cercando come generalmente qualcosa a seconda del risultato del compito. Ma se sai come arrivare alla lista delle violazioni dello stile di controllo, sarebbe fantastico. Attualmente, tutto ciò che non è un "errore" nello stile di controllo rende l'attività completata correttamente, il che significa che non mostrerò alcun risultato. –

+1

@JoachimKurz Ripensandoci, non conosco una soluzione migliore di questa. Per quanto riguarda il codice originale, si noti che 'Task # execute' è un metodo interno e non deve essere chiamato dal codice utente. Invece farei 'showCheckStyleResultsIfFailed' un altro task' Exec'. Le due attività possono essere configurate in un colpo solo, ma probabilmente non ne vale la pena. –

Problemi correlati