Per prima cosa, passa il mouse sull'area grigia sottostante. Non fa parte della risposta, ma va assolutamente detto:
Se hai uno script di shell che fa "checkout, build, deploy" tutto da solo, allora perché stai usando Jenkins? Stai rinunciando a tutte le caratteristiche di Jenkins che lo rendono quello che è. Potresti anche fare in modo che un cron o un hook post-commit SVN chiami direttamente lo script. Jenkins che esegue il checkout SVN stesso è fondamentale. Consente alle build di essere attivate solo quando ci sono modifiche (o su timer, o manuale, se preferisci). Tiene traccia delle modifiche tra le build. Mostra tali modifiche, così puoi vedere quale build era per quale set di modifiche. Invia un'e-mail ai committenti quando le loro modifiche hanno causato la compilazione riuscita o non riuscita (di nuovo, come configurato come preferisci). Invierà un'email ai committenti quando le loro correzioni hanno risolto la build in errore. E sempre di più. L'archiviazione degli artefatti da parte di Jenkins li rende inoltre disponibili, per build, direttamente da Jenkins. Sebbene non sia cruciale come il checkout SVN, questo è ancora una volta parte integrante di ciò che lo rende Jenkins. Lo stesso con la distribuzione. A meno che non si disponga di un unico ambiente, la distribuzione di solito avviene in più ambienti. Jenkins può tenere traccia di quale ambiente viene distribuito in una build specifica (con un set specifico di modifiche SVN), attraverso l'uso delle promozioni. Stai rinunciando a tutto questo. Sembra che ti venga detto "devi usare Jenkins" ma non lo vuoi veramente, e lo stai facendo solo per toglierti di dosso i tuoi capi, solo per mettere un segno di spunta "sì, ho usato Jenkins"
La risposta breve è: il codice di uscita dell'ultimo comando della Jenkin è Esegui Shell passaggio di generazione è ciò che determina il successo / insuccesso del costruire passo dopo . 0
- successo, anything else
- fallimento. Nota, questo determina il successo / fallimento della fase di costruzione , non dell'intero lavoro eseguito . Il successo / fallimento dell'intero lavoro può essere ulteriormente influenzato da più passaggi di compilazione e da azioni e plug-in post-compilazione.
Hai menzionato Build step 'Execute shell' marked build as failure
, quindi ci concentreremo solo su un singolo passaggio di costruzione. Se la tua fase di compilazione Execute shell ha solo una singola riga che chiama il tuo script di shell, il codice di uscita del tuo script di shell determinerà il successo / fallimento della fase di build. Se hai più righe, dopo l'esecuzione dello script di shell, esaminale attentamente, poiché sono quelle che potrebbero causare errori.
Infine, leggi qui Jenkins Build Script esce dopo l'esecuzione di Google Test . Non è direttamente correlato alla tua domanda, ma nota quella parte relativa al lancio di Jenkins nella fase di compilazione Esegui Shell , come script di shell con/bin/sh -xe
I -e
mezzi che lo script shell uscire con il fallimento, anche se solo 1 comando non riesce, anche se si fa il controllo degli errori per questo comando (perché lo script si chiude prima che arrivi al tuo controllo degli errori). Ciò è contrario alla normale esecuzione degli script di shell, che di solito stampano il messaggio di errore per il comando fallito (o lo reindirizzano a null e lo gestiscono con altri mezzi), e continuano.
Per aggirare questo problema, aggiungi set +e
all'inizio del tuo script di shell.
Dal momento che dici che il tuo script fa tutto ciò che dovrebbe fare, è probabile che il comando fallito sia da qualche parte alla fine dello script. Forse un'eco finale? O una copia di artefatti da qualche parte? Senza vedere l'output completo della console, stiamo solo supponendo.
Si prega di inviare l'output della console di esecuzione del lavoro, e preferibilmente anche lo stesso script di shell, e quindi potremmo dirvi esattamente quale riga sta fallendo.