Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use Jenkins 'Mailer' inside pipeline workflow

I'd like to leverage the existing Mailer plugin from Jenkins within a Jenkinsfile that defines a pipeline build job. Given the following simple failure script I would expect an email on every build.

#!groovy  stage 'Test' node {     try {         sh 'exit 1'     } finally {         step([$class: 'Mailer', notifyEveryUnstableBuild: true, recipients: '[email protected]', sendToIndividuals: true])     } } 

The output from the build is:

Started by user xxxxx [Pipeline] stage (Test) Entering stage Test Proceeding [Pipeline] node Running on master in /var/lib/jenkins/jobs/rpk-test/workspace [Pipeline] { [Pipeline] sh [workspace] Running shell script + exit 1 [Pipeline] step [Pipeline] } [Pipeline] // node [Pipeline] End of Pipeline ERROR: script returned exit code 1 Finished: FAILURE 

As you can see, it does record that it performs the pipeline step immediately after the failure, but no emails get generated.

Emails in other free-style jobs that leverage the mailer work fine, its just invoking via pipeline jobs.

This is running with Jenkins 2.2 and mailer 1.17.

Is there a different mechanism by which I should be invoking failed build emails? I don't need all the overhead of the mail step, just need notifications on failures and recoveries.

like image 439
rkeilty Avatar asked May 11 '16 17:05

rkeilty


People also ask

Can a Jenkinsfile have multiple pipelines?

A multi-branch pipeline project always includes a Jenkinsfile in its repository root. Jenkins automatically creates a sub-project for each branch that it finds in a repository with a Jenkinsfile . Multi-branch pipelines use the same version control as the rest of your software development process.

For which purpose do we use mailer plugin in Jenkins?

This plugin allows you to configure email notifications for build results. This is a break-out of the original core based email component.

What is the difference between freestyle project and pipeline in Jenkins?

Freestyle projects are meant to orchestrate simple jobs for a project. Pipeline Project: Pipeline Project is a new type of Jenkins project that is suitable either when you have to set up a continuous delivery pipeline or to define the deployment pipeline as code.


1 Answers

In Pipeline failed sh doesn't immediately set the currentBuild.result to FAILURE whereas its initial value is null. Hence build steps that rely on the build status like Mailer might work seemingly incorrect.

You can check it by adding a debug print:

stage 'Test' node {     try {         sh 'exit 1'     } finally {         println currentBuild.result  // this prints null         step([$class: 'Mailer', notifyEveryUnstableBuild: true, recipients: '[email protected]', sendToIndividuals: true])     } } 

This whole pipeline is wrapped with exception handler provided by Jenkins that's why Jenkins marks the build as failed in the the end.

So if you want to utilize Mailer you need to maintain the build status properly. For instance:

stage 'Test' node {     try {         sh 'exit 1'         currentBuild.result = 'SUCCESS'     } catch (any) {         currentBuild.result = 'FAILURE'         throw any //rethrow exception to prevent the build from proceeding     } finally {         step([$class: 'Mailer', notifyEveryUnstableBuild: true, recipients: '[email protected]', sendToIndividuals: true])     } } 

If you needn't to rethrow the exception you can use catchError. It is a Pipeline built-in which catches any exception within its scope, prints it into console and sets the build status. Example:

stage 'Test' node {     catchError {         sh 'exit 1'     }      step([$class: 'Mailer', notifyEveryUnstableBuild: true, recipients: '[email protected]', sendToIndividuals: true]) } 
like image 89
izzekil Avatar answered Sep 21 '22 23:09

izzekil