Jenkins 发邮件的Job

Jenkins要做到构建失败的时候发送邮件,常规做法是加个全局的post failure,类似这样的代码

pipeline {
    agent any

    stages {

        stage('deploy') {
            steps {
                script {
                    error 'failed';

                }
            }
        }

    }

    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: "foo@foomail.com";
        }
        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'
        }
    }

}

  这种做法有一点不好之处就是有几个JOB 需要发邮件就需要写几份发邮件代码,对原来Jenkins代码也有侵染。

有一种办法可以避免这样的情况,新建一个JOB ,这个JOB名字就叫做发邮件,把这个JOB 设置为上游JOB 触发,意思是当需要发邮件的JOB 在构建完以后,不管成功失败都会触发发邮件的JOB,来实现统一发邮件。

1.新建pipeline JOB, 在‘其它工程后触发’ 这里填上你想要发邮件的job,如果有多个使用逗号分隔 .

2.pipleline 的代码

pipeline {
    agent any

    stages {

        stage('deploy') {
            steps {
                script {
                    String buildResult = "";
                    String buildNumber = "";
                    String jobName = "";
                    (buildResult, jobName, buildNumber) = getUpstreamBuildResult();

                    String buildUrl = "http://localhost:8080/job/${jobName}/${buildNumber}/console"

                    if (buildResult == 'FAILURE') {
                        echo "send email";
                        mail bcc: '', body: "<b>Example</b><br>Project: ${jobName} <br>Build Number: ${buildNumber} <br> URL de build: ${buildUrl}", cc: '', charset: 'UTF-8', from: 'tianhe1006@126.com', mimeType: 'text/html', replyTo: '', subject: "ERROR CI: Project name -> ${jobName}", to: "jonas.tian@activenetwork.com";
                    }

                }
            }
        }

    }

}

def getUpstreamBuildResult() {
    def upstream = currentBuild.rawBuild.getCause(hudson.model.Cause$UpstreamCause)
    String jobName = upstream ? .getUpstreamProject();
    echo jobName;
    String buildNumber = "${upstream?.getUpstreamBuild()}";
    echo buildNumber;
    def upstreamTriggerBuildResult = Jenkins.instance.getAllItems(AbstractItem.class)
        .findAll {
            it.fullName == upstream.getUpstreamProject()
        }
        .collect {
            proj - > proj.getBuilds().findAll {
                it.number == upstream.getUpstreamBuild()
            }.collect {
                it.getResult()
            }
        }
        .flatten()[0];

    echo "${upstreamTriggerBuildResult}";

    return [upstreamTriggerBuildResult, jobName, buildNumber];
}

  注意一点,这里用到了不安全代码,需要手动approve,运行一次,就会看到报错,一直点approve 就好了,但是如果不想这么麻烦可以安装一个插件

Permissive Script Security Plugin

https://wiki.jenkins.io/display/JENKINS/Permissive+Script+Security+Plugin

安装这个插件后就可以自动approve 不安全代码。

原文地址:https://www.cnblogs.com/MindSharing/p/12054672.html