2016-04-25 6 views
12

Gibt es eine Möglichkeit, Bereinigung (oder Rollback) durchzuführen, wenn das Build in Jenkinsfile fehlschlug?So führen Sie Aktionen für fehlgeschlagene Builds in Jenkinsfile aus

Ich möchte unsere Atlassian Stash-Instanz darüber informieren, dass der Build fehlgeschlagen ist (indem Sie eine curl unter der richtigen URL machen).

Grundsätzlich wäre es ein Post-Schritt, wenn Build-Status auf Fehler festgelegt ist.

Sollte ich try {} catch() verwenden? Wenn ja, welchen Ausnahmetyp sollte ich fangen?

Antwort

17

Ich suche derzeit auch nach einer Lösung für dieses Problem. Das Beste, was ich bisher erreichen konnte, ist eine Wrapper-Funktion, die den Pipeline-Code in einem try catch-Block ausführt. Wenn Sie auch bei Erfolg benachrichtigen möchten, können Sie die Ausnahme in einer Variablen speichern und den Benachrichtigungscode in einen finally-Block verschieben. Beachten Sie auch, dass Sie die Ausnahme erneut auslösen müssen, sodass Jenkins die Erstellung als fehlgeschlagen ansieht. Vielleicht findet ein Leser eine elegantere Herangehensweise an dieses Problem.

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

Bonuspunkte behandelt ist für 'TimestamperBuildWrapper', wusste ich nicht, dass es existierte –

+0

Ich benutzte 'try {} schließlich {}' an einigen Stellen in meinem Jenkinsfile und es hat wunderbar funktioniert. Ich möchte auch darauf hinweisen, dass try/catch/finally-Blöcke ** nicht ** in eine separate Funktion oder Wrapper-Funktion aufgeteilt werden müssen - sie funktionieren überall in einer Skript-Pipeline problemlos. – jayhendren

11

Seit 2017.02.03 kann Declarative Pipeline Syntax 1.0 verwendet werden, diesen Beitrag Build-Schritt-Funktionalität zu erreichen.

Es ist eine neue Syntax zum Erstellen von Pipelines, die Pipeline mit einer vordefinierten Struktur und einigen neuen Schritten erweitert, die es Benutzern ermöglichen, Agenten, Postaktionen, Umgebungseinstellungen, Anmeldeinformationen und Phasen zu definieren.

ist hier eine Probe Jenkinsfile mit deklarative Syntax:

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." 
    } 
    } 
} 

Der Post Codeblock ist, was das Beitrag Schritt Aktion

deklarative Pipeline Syntax Referenz here

Verwandte Themen