web-dev-qa-db-fra.com

Envoyer un e-mail sur l'échec du pipeline jenkins

Comment puis-je ajouter à un pipeline jenkins une tâche post-génération de style ancien qui envoie un courrier électronique lorsque la construction échoue? Je ne parviens pas à trouver les "actions de post-construction" dans l'interface graphique d'un pipeline. Je sais que je peux envelopper le script de construction entier try/catch, mais cela semble moche quand le script de construction est volumineux et continue d'envoyer des courriels même si le travail a été annulé manuellement. Je souhaite obtenir les mêmes fonctionnalités qu'avec le précédent email-ext action post-construction basée.

try {
    // Do sth
} catch(e) {
    emailext body: '$DEFAULT_CONTENT', 
        recipientProviders: [
            [$class: 'CulpritsRecipientProvider'],
            [$class: 'DevelopersRecipientProvider'],
            [$class: 'RequesterRecipientProvider']
        ], 
        replyTo: '$DEFAULT_REPLYTO', 
        subject: '$DEFAULT_SUBJECT',
        to: '$DEFAULT_RECIPIENTS'
    throw err
}
22
Mariusz Jamro

Cette réponse a fonctionné sur mon ver Jenkins. 2,96.

Email du pipeline Jenkins non envoyé en cas d'échec de la construction - Dépassement de pile

 pipeline {  
     agent any  
     stages {  
         stage('Test') {  
             steps {  
                 sh 'echo "Fail!"; exit 1'  
             }  
         }  
     }  
     post {  
         always {  
             echo 'This will always run'  
         }  
         success {  
             echo 'This will run only if successful'  
         }  
         failure {  
             mail bcc: '', body: "<b>Example</b><br>Project: ${env.JOB_NAME} <br>Build Number: ${env.BUILD_NUMBER} <br> URL de build: ${env.BUILD_URL}", cc: '', charset: 'UTF-8', from: '', mimeType: 'text/html', replyTo: '', subject: "ERROR CI: Project name -> ${env.JOB_NAME}", to: "[email protected]";  
         }  
         unstable {  
             echo 'This will run only if the run was marked as unstable'  
         }  
         changed {  
             echo 'This will run only if the state of the Pipeline has changed'  
             echo 'For example, if the Pipeline was previously failing but is now successful'  
         }  
     }  
 }
28
kujiy

Pour prendre des mesures uniquement lorsque le statut de construction a changé, vous pouvez utiliser le post> bloc modifié .

Et pour vérifier, dans quel état le statut a changé, vous pouvez utiliser le bloc de script en combinaison avec la vérification de la valeur de currentBuild.currentResult propriété.

Ainsi:

pipeline {
    ...

    post {
        changed {
            script {
                if (currentBuild.currentResult == 'FAILURE') { // Other values: SUCCESS, UNSTABLE
                    // Send an email only if the build status has changed from green/unstable to red
                    emailext subject: '$DEFAULT_SUBJECT',
                        body: '$DEFAULT_CONTENT',
                        recipientProviders: [
                            [$class: 'CulpritsRecipientProvider'],
                            [$class: 'DevelopersRecipientProvider'],
                            [$class: 'RequesterRecipientProvider']
                        ], 
                        replyTo: '$DEFAULT_REPLYTO',
                        to: '$DEFAULT_RECIPIENTS'
                }
            }
        }
    }

}
15
Jonas Masalskis

Pour le moment, vous devez utiliser cette procédure avec un try-catch pour obtenir une action post-build.

Mais à l'avenir, cette étape est planifiée (en réalité, elle est en cours de révision). Vous pouvez lire l'article du blog pour plus d'informations (voir la partie déclarative du pipeline). Voir aussi le le ticket Jenkins Jira et la demande d'extraction .

Mise à jour:

Le pipeline déclaratif Jenkins a maintenant la section post qui exécutera les étapes de manière conditionnelle à la fin de chaque génération. Voir la documentation pour plus d'informations.

post {
 always {
   sh 'echo "This will always run"'
 }
 success {
  sh 'echo "This will run only if successful"'
 }
 failure {
  sh 'echo "This will run only if failed"'
 }
 unstable {
  sh 'echo "This will run only if the run was marked as unstable"'
 }
 changed {
  sh 'echo "This will run only if the state of the Pipeline has changed"'
  sh 'echo "For example, the Pipeline was previously failing but is now successful"'
  sh 'echo "... or the other way around :)"'
 }
}
15
ansib

Cela fonctionne bien sur mon Jenkins (version 2.164.2 actuelle et emailext) avec pipeline déclaratif:

    pipeline {
    ...

    environment {
            EMAIL_TO = '[email protected]'
        }
    post {
            failure {
                emailext body: 'Check console output at $BUILD_URL to view the results. \n\n ${CHANGES} \n\n -------------------------------------------------- \n${BUILD_LOG, maxLines=100, escapeHtml=false}', 
                        to: EMAIL_TO, 
                        subject: 'Build failed in Jenkins: $PROJECT_NAME - #$BUILD_NUMBER'
            }
            unstable {
                emailext body: 'Check console output at $BUILD_URL to view the results. \n\n ${CHANGES} \n\n -------------------------------------------------- \n${BUILD_LOG, maxLines=100, escapeHtml=false}', 
                        to: EMAIL_TO, 
                        subject: 'Unstable build in Jenkins: $PROJECT_NAME - #$BUILD_NUMBER'
            }
            changed {
                emailext body: 'Check console output at $BUILD_URL to view the results.', 
                        to: EMAIL_TO, 
                        subject: 'Jenkins build is back to normal: $PROJECT_NAME - #$BUILD_NUMBER'
            }
        }
    }

Vous pouvez contrôler le courrier électronique en cas d'échec de la construction ou du statut modifié. Aussi, j'ai mis le journal de construction dans le corps de l'email

1
Milan