简体   繁体   中英

How can I change the FROM email address in Jenkins email-ext plugin on a per-trigger basis?

Let me start with what I know. I know you can change the SysAdmin email address globally in the Jenkins Configuration page and that is what the default FROM address is in the email-ext plugin. I also know you can change the FROM address on a per build basis with the pre-send groovy script.

What I am looking for is a way to change the FROM email address when a specific trigger (Test Regression) occurs for a specific build in Jenkins. I don't know if Groovy can switch based on this information (or if it even has access to it) at the build level. I have also tried adding a groovy scrip in the content portion of the specific trigger but am receiving an error.

Any help or direction on this would be greatly appreciated! Thanks!

The presend script has a variable called "trigger" that is the trigger that caused the email to occur. You could check the type of that and change the from address based on that.

Summary:

  1. in Pre-send Script:

    1.1 debug dumping build (and trigger/msg/other objects) NOTE that THIS trigger object is the email trigger (eg "Always" or "Failure - Any") NOT the build trigger (AKA build cause).

    1.2 check build object for trigger(cause) of build

    1.3 set recipient email address

Starting with the doc for . . . Email-ext plugin in Post-build Actions - Editable Email Notification - Advanced In Pre-send Script . . . https://wiki.jenkins-ci.org/display/JENKINS/Email-ext+plugin#Email-extplugin-PresendScript

"""The pre-send script is a feature which allows you to write a script that can modify the MimeMessage object prior to sending. This would allow adding custom headers, modifying the body, etc. Predefined variables include:

  • msg - the MimeMessage object which can be modified
  • logger - a PrintStream and will write to the job's log.
  • build - the build this message belongs to
  • cancel - a boolean, which when set to true will cancel the sending of the email """

Also available:

  • trigger - the email trigger, NOT the build trigger

1.1 THIS perl Data::Dumper equivalent for debugging java objects is useful. http://www.perlmonks.org/?node_id=699918 Try this in the Email-Ext - Pre-send Script of a jenkins job:

logger.println "MSG: " + msg;
logger.println "ENV: " + msg;    
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.json.JsonHierarchicalStreamDriver;
XStream dumper = new XStream(new JsonHierarchicalStreamDriver());
logger.println "TRIGGER: " + trigger;
logger.println(dumper.toXML(trigger));
logger.println "BUILD: " + build;
logger.println(dumper.toXML(build));

See the partial result (not showing much of the build object). The trigger here is the email "AlwaysTrigger" but we can see that the build action cause was the admin user:

TRIGGER: hudson.plugins.emailext.plugins.trigger.AlwaysTrigger@431ff400
{"hudson.plugins.emailext.plugins.trigger.AlwaysTrigger": {
  "email": {
    "recipientList": "",
    "subject": "$PROJECT_DEFAULT_SUBJECT",
    "body": "$PROJECT_DEFAULT_CONTENT",
    "recipientProviders": [
      {},
      {}
    ],
    "attachmentsPattern": "",
    "attachBuildLog": false,
    "compressBuildLog": false,
    "replyTo": "$PROJECT_DEFAULT_REPLYTO",
    "contentType": "project"
  }
}}
BUILD: custom_email_test_gunk #14
{"hudson.model.FreeStyleBuild": {
  "actions": [
    {
      "default": {},
      "int": 4,
      "hudson.model.CauseAction": {
        "causeBag": [
          [
            {
              "userId": "admin"
            },
            1
          ]
        ]
      },
      "hudson.scm.CvsRevisionState": {
  .
  .

From a run with build triggered by Script Trigger we can see the difference in the build object, the build action/cause has ScriptTrigger details:

BUILD: custom_email_test_gunk #10
{"hudson.model.FreeStyleBuild": {
  "actions": [
    {
      "default": {},
      "int": 6,
      "org.jenkinsci.plugins.scripttrigger.ScriptTriggerRunAction": {
        "description": "\n[jenkins] $ /bin/sh -xe /tmp/hudson6220381111236932099.sh\n+ set +x\nJOB_NAME=custom_email_test_gunk\nJOB_VARS_CMD=JUNK=custom_email_test_;SYSTESTNAME=Docker;PRODUCT=gunk;REL=LATEST;DRIVER=gunk;SUT=gunk;SUSER=\nPRODUCT=gunk REL=LATEST DRIVER= SUT= SYSTESTNAME=Docker SUSER=\n./system_test/regression/run_scripts/poll_stuff.sh STDIR=yadda yada yadda \ndiff: yadda yadda \n<description>"
      },
      "org.jenkinsci.lib.xtrigger.XTriggerCauseAction": {
        "build": {
          "@class": "hudson.model.FreeStyleBuild",
          "@reference": "../../../.."
        }
      },
      "hudson.model.CauseAction": {
        "causeBag": [
          [
            {
              "triggerName": "ScriptTrigger",
              "causeFrom": " and <description>\n[jenkins] $ /bin/sh -xe /tmp/hudson6220381111236932099.sh\n+ set +x\nJOB_NAME=custom_email_test_gunk yadda yadda ",
              "logEnabled": true
            },
            1
          ]
        ]
      },
      "hudson.scm.CvsRevisionState": {
      .
      .

1.2 TODO: work out the bit of logic to differentiate between build cause. I'm working on this myself.

1.3 We can set recipients something like this in the Pre-send Script:

import javax.mail.Message.RecipientType
msg.setRecipients(RecipientType.TO, 'someone+FROM_JENKINS_CUSTOM_RECIPIENT@gmail.com') 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM