2016-04-25 9 views
25

Ecco il codice che sto giocando conmostra una fase oleodotto Jenkins come non riuscito senza fallire l'intero lavoro

node { 
    stage 'build' 
    echo 'build' 

    stage 'tests' 
    echo 'tests' 

    stage 'end-to-end-tests' 
    def e2e = build job:'end-to-end-tests', propagate: false 
    result = e2e.result 
    if (result.equals("SUCCESS")) { 
     stage 'deploy' 
     build 'deploy' 
    } else { 
     ?????? I want to just fail this stage 
    } 
} 

C'è un modo per me per segnare la fase di 'end-to-end-test' come fallito senza fallire l'intero lavoro? Propagare false indica sempre il livello come vero, che non è quello che voglio, ma Propagate true contrassegna il lavoro come fallito che anch'io non voglio.

risposta

12

Suoni come JENKINS-26522. Attualmente il meglio che puoi fare è impostare un risultato complessivo:

if (result.equals("SUCCESS")) { 
    stage 'deploy' 
    build 'deploy' 
} else { 
    currentBuild.result = e2e.result 
    // but continue 
} 
+2

Esiste un modo per fare viceversa . Per contrassegnare lo stage non riuscito con il colore rosso, ma lo stato di costruzione (quella palla) con il colore blu? – Sviatlana

+0

grazie) mi ha salvato il tempo – gokareless

+0

Ciao @Sviatlana, sei stato in grado di accompagnarlo? per contrassegnare il palcoscenico senza successo con il colore rosso? – user3768904

2

si potrebbe aggiungere un esplicito non riescono compito, come ad esempio 'sh 'non esiste comando'' nella fase.

if (result.equals("SUCCESS")) { 
    stage 'deploy' 
    build 'deploy' 
} else { 
    try { 
     sh "not exist command" 
    }catch(e) { 
    } 
} 
13

Ora la scena prende un blocco, quindi avvolgi il palco in try-catch. Provare a catturare all'interno del palco lo fa riuscire.

La nuova funzione menzionata in precedenza sarà più potente. Nel frattempo:

try { 
    stage('end-to-end-tests') { 
    node {  
     def e2e = build job:'end-to-end-tests', propagate: false 
     result = e2e.result 
     if (result.equals("SUCCESS")) { 
     } else { 
      sh "exit 1" // this fails the stage 
     } 
    } 
    } 
} catch (e) { 
    result = "FAIL" // make sure other exceptions are recorded as failure too 
} 

stage('deploy') { 
    if (result.equals("SUCCESS")) { 
     build 'deploy' 
    } else { 
     echo "Cannot deploy without successful build" // it is important to have a deploy stage even here for the current visualization 
    } 
} 
0

Recentemente ho provato ad usare la risposta di Vaza Show a Jenkins pipeline stage as failed without failing the whole job come modello per la scrittura di una funzione che excutes un lavoro in una propria fase di nome come il nome del lavoro. Sorprendentemente ha funzionato, ma forse alcuni esperti groove avere uno sguardo esso :)

Ecco come appare come se uno dei posti di lavoro viene interrotto: enter image description here

def BuildJob(projectName) { 
    try { 
     stage(projectName) { 
     node {  
      def e2e = build job:projectName, propagate: false 
      result = e2e.result 
      if (result.equals("SUCCESS")) { 
      } else { 
       error 'FAIL' //sh "exit 1" // this fails the stage 
      } 
     } 
     } 
    } catch (e) { 
     currentBuild.result = 'UNSTABLE' 
     result = "FAIL" // make sure other exceptions are recorded as failure too 
    } 
} 

node { 
    BuildJob('job1') 
    BuildJob('job2') 
} 
Problemi correlati