web-dev-qa-db-fra.com

Comment effectuer des actions pour les builds ayant échoué dans Jenkinsfile

Existe-t-il un moyen d'effectuer un nettoyage (ou une restauration) si la génération dans Jenkinsfile a échoué?

Je voudrais informer notre instance Atlassian Stash que la construction a échoué (en faisant un curl à la bonne URL).

Fondamentalement, il s'agirait d'une étape de publication lorsque l'état de la génération est défini sur échouer.

Dois-je utiliser try {} catch ()? Si oui, quel type d'exception dois-je intercepter?

14
Krzysztof Krasoń

Je recherche également actuellement une solution à ce problème. Jusqu'à présent, le mieux que j'ai pu trouver est de créer une fonction wrapper qui exécute le code du pipeline dans un bloc try catch. Si vous souhaitez également notifier en cas de succès, vous pouvez stocker l'exception dans une variable et déplacer le code de notification dans un bloc enfin. Notez également que vous devez relancer l'exception afin que Jenkins considère la génération comme ayant échoué. Peut-être que certains lecteurs trouvent une approche plus élégante de ce problème.

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                        
            } 
        }
    }
}
19
Till Kuhn

Depuis le 2017-02-03, Declarative Pipeline Syntax 1. peut être utilisé pour obtenir cette fonctionnalité de l'étape de post-génération.

Il s'agit d'une nouvelle syntaxe pour la construction de Pipelines, qui étend Pipeline avec une structure prédéfinie et de nouvelles étapes qui permettent aux utilisateurs de définir des agents, des actions de post, des paramètres d'environnement, des informations d'identification et des étapes.

Voici un exemple de fichier Jenkins avec une syntaxe déclarative:

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

Le bloc de code post est ce qui gère cette action post-étape

La référence déclarative de la syntaxe du pipeline est ici

20
amarruedo