2016-04-25 14 views
12

C'è un modo per eseguire cleanup (o rollback) se la build in Jenkinsfile fallisce?Come eseguire azioni per build fallite in Jenkinsfile

Vorrei informare la nostra istanza di Stash di Atlassian che la compilazione non è riuscita (eseguendo un curl con l'URL corretto).

Fondamentalmente sarebbe una fase di post quando lo stato di generazione è impostato su fallito.

Devo usare try {} catch()? In tal caso, quale tipo di eccezione dovrei prendere?

risposta

17

Attualmente sto anche cercando una soluzione a questo problema. Finora il meglio che ho potuto fare è creare una funzione wrapper che esegua il codice della pipeline in un blocco catch try. Se si desidera notificare il successo, è possibile memorizzare l'eccezione in una variabile e spostare il codice di notifica in un blocco finale. Si noti inoltre che è necessario rilanciare l'eccezione in modo che Jenkins consideri la build come fallita. Forse qualche lettore trova un approccio più elegante a questo problema.

pipeline('linux') { 
    stage 'Pull' 
    stage 'Deploy' 
    echo "Deploying" 
    throw new FileNotFoundException("Nothing to pull") 
    // ... 
} 

def pipeline(String label, Closure body) { 
    node(label) { 
     wrap([$class: 'TimestamperBuildWrapper']) { 
      try { 
       body.call() 
      } catch (Exception e) { 
       emailext subject: "${env.JOB_NAME} - Build # ${env.BUILD_NUMBER} - FAILURE (${e.message})!", to: "[email protected]",body: "..." 
       throw e; // rethrow so the build is considered failed       
      } 
     } 
    } 
} 
+3

punti bonus per 'TimestamperBuildWrapper', non sapevo esistesse –

+0

Ho usato' try {} finally {} 'in un paio di posti nel mio Jenkinsfile e ha funzionato meravigliosamente. Vorrei anche notare che i blocchi try/catch/finally ** non ** devono essere scomposti in una funzione separata o funzione wrapper - funzionano perfettamente ovunque in una pipeline con script. – jayhendren

11

Dal 2017/02/03, Declarative Pipeline Syntax 1.0 può essere utilizzato per ottenere questa funzionalità dopo passaggio di generazione.

È una nuova sintassi per la costruzione di pipeline, che estende Pipeline con una struttura predefinita e alcuni nuovi passaggi che consentono agli utenti di definire agenti, post azioni, impostazioni dell'ambiente, credenziali e fasi.

Ecco un esempio Jenkinsfile con sintassi dichiarativa:

pipeline { 
    agent label:'has-docker', dockerfile: true 
    environment { 
    GIT_COMMITTER_NAME = "jenkins" 
    GIT_COMMITTER_EMAIL = "[email protected]" 
    } 
    stages { 
    stage("Build") { 
     steps { 
     sh 'mvn clean install -Dmaven.test.failure.ignore=true' 
     } 
    } 
    stage("Archive"){ 
     steps { 
     archive "*/target/**/*" 
     junit '*/target/surefire-reports/*.xml' 
     } 
    } 
    } 
    post { 
    always { 
     deleteDir() 
    } 
    success { 
     mail to:"[email protected]", subject:"SUCCESS: ${currentBuild.fullDisplayName}", body: "Yay, we passed." 
    } 
    failure { 
     mail to:"[email protected]", subject:"FAILURE: ${currentBuild.fullDisplayName}", body: "Boo, we failed." 
    } 
    } 
} 

Il postale blocco codice è quello che gestisce tale alberino azione passo

dichiarativa tubazioni Sintassi riferimento è here

Problemi correlati