2016-04-25 21 views
12

Czy istnieje sposób przeprowadzenia czyszczenia (lub wycofania), jeśli kompilacja w Jenkinsfile nie powiodła się?Jak wykonywać akcje dla nieudanych kompilacji w Jenkinsfile

Chciałbym poinformować naszą instancję Atlassian Stash, że kompilacja nie powiodła się (wykonując curl pod prawidłowym adresem URL).

Zasadniczo byłby to krok po kroku, gdy status kompilacji jest ustawiony na niepowodzenie.

Czy powinienem używać try {} catch()? Jeśli tak, jaki typ wyjątku powinienem złapać?

Odpowiedz

17

Obecnie poszukuję również rozwiązania tego problemu. Do tej pory najlepsze, co mogłem wymyślić, to stworzyć funkcję otoki, która uruchamia kod potoku w bloku catch catch. Jeśli chcesz również powiadomić o sukcesie, możesz zapisać wyjątek w zmiennej i przenieść kod powiadomienia do bloku finally. Zwróć też uwagę, że musisz ponownie rzucić wyjątek, aby Jenkins uznał kompilację za nieudaną. Może jakiś czytelnik znajdzie bardziej eleganckie podejście do tego problemu.

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

punkty bonusowe dla 'TimestamperBuildWrapper', nie wiedziałem, że istnieje –

+0

Użyłem' try {} finally {} 'w kilku miejscach w moim Jenkinsfile i działało cudownie. Chciałbym również zauważyć, że bloki try/catch/finally ** nie ** muszą być podzielone na osobną funkcję lub funkcję wrappera - działają dobrze wszędzie w skrypcie. – jayhendren

11

Od 2017-02-03, Declarative Pipeline Syntax 1.0 można wykorzystać, aby osiągnąć ten build krok funkcjonalność post.

Jest to nowa składnia do budowy potoków, która rozszerza Pipeline o predefiniowaną strukturę i kilka nowych kroków, które umożliwiają użytkownikom definiowanie agentów, akcji po, ustawień środowiska, referencji i etapów.

Oto przykład Jenkinsfile z deklaratywnej składni:

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

kod pocztowy blok jest co uchwyty, które postu działanie krok

deklaratywna Pipeline Składnia odniesienia jest here