Pipeline: Sending email on failed and fixed builds

11,701 views
Skip to first unread message

Sverre Moe

unread,
Jun 23, 2016, 3:20:41 AM6/23/16
to Jenkins Users
One benefit with sending email in pipeline script is better control of which error in the pipeline deserves sending email and to whom.

By adding a try-catch surrounding the code compile I send out email when it fails. That case the developers get notified only for errors that concern them.
try {
    preInstall
()
    compileAndBuild
()
    postInstall
()
} catch(e) {
   
final def RECIPIENTS = emailextrecipients([
       
[$class: 'DevelopersRecipientProvider'],
       
[$class: 'CulpritsRecipientProvider']
   
])
   
final def SUBJECT = "${env.JOB_NAME} ${env.BRANCH_NAME} - Build #${env.BUILD_NUMBER} - FAILED!"
   
final def CONTENT = "Check console output at ${env.BUILD_URL} to view the results."
   
if (RECIPIENTS != null && !RECIPIENTS.isEmpty()) {
        mail to
: RECIPIENTS, replyTo: "donot...@company.com", subject: SUBJECT, body: CONTENT
   
} else {
        mail to
: "jenkins-admin", replyTo: "donot...@company.com", subject: SUBJECT, body: CONTENT
   
}
   
throw e
}
I need to re-throw the exception otherwise the pipeline continues.

However I still want email to be sent out if there is an error anywhere in the code. The Jenkins administrators should get an email if the build scripts fails and has nothing to do with the code. I cannot put a try-catch everywhere in the code.

Also how do I send out email on fixed builds? Do I have to do it manually. Check the previous build, get the recipient list (culprits, developers) from that build and send a fixed build email message.

Craig Rodrigues

unread,
Jun 23, 2016, 3:31:20 AM6/23/16
to Jenkins Users
You need to set and check the currentBuild.result value, and do different things based on that.

--
Craig

--
You received this message because you are subscribed to the Google Groups "Jenkins Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to jenkinsci-use...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/jenkinsci-users/dbb8fc19-458f-4114-937c-b5136b792562%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Sverre Moe

unread,
Jun 23, 2016, 3:53:39 AM6/23/16
to Jenkins Users, rod...@freebsd.org
Same solutions I thought about, to put a try-catch surrounding all the stages in the build.
However I could not find anything in those examples how to send email on fixed builds. Unless step Mailer does that for you. I use Email-ext because I want to a minimalist email content.

It should only send out email on FAILED and SUCCESS(if previously FAILED). I could do something like this if I had access to previousBuild.result

It seems the pipeline sets the currentBuild.result to SUCCESS or FAILED at the end. Unless setting the result in the script the value is always null.

Craig Rodrigues

unread,
Jun 23, 2016, 4:07:31 AM6/23/16
to Sverre Moe, Jenkins Users
Yes, step mailer sends mail on fixed builds, but currentBuild.result is null unless you
set it.  The step mailer depends on currentBuild.result.

--
Craig

Sverre Moe

unread,
Jun 23, 2016, 4:58:51 AM6/23/16
to Jenkins Users, sverr...@gmail.com, rod...@freebsd.org
Ok
We went away from the Mailer because we wanted to minimize the content in body.

I tried with your example, but it did not send out email on success after failed.
} catch (caughtError) {
    currentBuild
.result = "FAILURE"
} finally {
   
if (currentBuild.result != "ABORTED") {

       
final def RECIPIENTS = emailextrecipients([
           
[$class: 'DevelopersRecipientProvider'],
           
[$class: 'CulpritsRecipientProvider']
       
])


       step
([$class: 'Mailer', notifyEveryUnstableBuild: true, sendToIndividuals: true, recipients: RECIPIENTS])
   
}

   
/* Must re-throw exception to propagate error */
   
if (err) {
       
throw err
   
}
}


Using the following will send out emails on every SUCCESS, regardless of previous build result.
emailext body: CONTENT, subject: SUBJECT, replyTo: 'donot...@company.com', recipientProviders: [[$class: 'CulpritsRecipientProvider'], [$class: 'DevelopersRecipientProvider']]

I could use the following to send out email on every failed build, but will not get sent when build is fixed.
} catch(e) {
   
final def RECIPIENTS = emailextrecipients([
       
[$class: 'DevelopersRecipientProvider'],
       
[$class: 'CulpritsRecipientProvider']
   
])
   
final def SUBJECT = "${env.JOB_NAME} ${env.BRANCH_NAME} - Build #${env.BUILD_NUMBER} - FAILED!"
   
final def CONTENT = "Check console output at ${env.BUILD_URL} to view the results."
   
if (RECIPIENTS != null && !RECIPIENTS.isEmpty()) {
        mail to
: RECIPIENTS, replyTo: "donot...@company.com", subject: SUBJECT, body: CONTENT
   
} else {

        mail to
: "jenkins-admins", replyTo: "donot...@company.com", subject: SUBJECT, body: CONTENT
   
}


   
/* Must re-throw exception to propagate error */
   
throw e
}

Sverre Moe

unread,
Jun 23, 2016, 5:26:13 AM6/23/16
to Jenkins Users, sverr...@gmail.com, rod...@freebsd.org
I got Mailer to send success after failed.
I wish "mail" or "emailext" could support this as those allow to define the subject and body.
Message has been deleted

James Douglas Robinson

unread,
Nov 15, 2016, 12:25:26 PM11/15/16
to Jenkins Users
Reply all
Reply to author
Forward
0 new messages