首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jenkins下游作业如何通过email-ext向上游git提交者发送电子邮件通知

jenkins下游作业如何通过email-ext向上游git提交者发送电子邮件通知
EN

Stack Overflow用户
提问于 2013-01-27 05:12:45
回答 1查看 5.5K关注 0票数 7

这个问题是关于如何向在jenkins的下游工作中破坏集成测试的git提交者发送电子邮件,并查看下游工作中的更改列表。

我还没有尝试我在这里写的所有东西,所以我可能是错的,这些是我遇到的代码的印象。

显然,有许多尝试来回答这个问题,但没有一个似乎是令人满意的,所以我将详细说明。详情如下:

我们曾经使用svn。我们的作业层次结构是一个作业签出和编译,并触发其他作业,这些作业接受编译工件并对其执行misc集成测试。

需要将电子邮件发送给破坏构建的上游svn提交者。

我们喜欢通过email-ext插件(https://wiki.jenkins-ci.org/display/JENKINS/Email-ext+plugin)发送电子邮件,因为它非常可定制,而且我们经常使用这个功能。

email ext插件使用当前作业的changelog.xml来发现谁破坏了构建。由于changelog.xml是由签出操作创建的,因此它存在于上游作业中。因此,email-ext似乎不知道应该向谁发送电子邮件。

如果你决定包括罪犯,你可以用-Dhudson.upstreamCulprits=true开始你的jenkins,它改变了电子邮件-ext的行为,但如果你不想包括罪犯,这对你没有帮助。此外,变更集似乎在下游作业中不可用。

也有一个指责上游提交者插件,但它似乎不能很好地与email-ext一起运行。

upstreamCulprits和files of upstream似乎都需要指纹识别,我们不希望这样做,因为我们有很多文件和工作……这有严重的性能问题。

我们用BlameSubversion插件(https://wiki.jenkins-ci.org/display/JENKINS/BlameSubversion)解决了这个问题。显然,它从触发此作业的上游项目复制changelog.xml,因此当此作业失败并在changelog中查找破坏构建的用户时,它可以找到这些用户,并且这些用户也会出现在changelog中。

因此,我们对svn感到非常高兴。现在,我们迁移到了git。没有指责Git插件。我们不介意写一篇。我们只需要了解我们是否应该这样做。人们一起使用git和jenkins已经有相当一段时间了。我们不可能是第一个遇到这种困难的人……

谢谢,内森。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-21 08:01:03

这就是我使用Clearcase的方式,在svn上应该非常类似。在您输入要接收电子邮件的地址列表的区域中,添加以下内容:

,${脚本,script="committers.groovy"}

在$JENKINS_HOME/email-templates中创建一个新脚本committers.groovy,如下所示:

代码语言:javascript
复制
// the goal is to find the top level job which should contain the changelist
def upstreamBuild = null
def cause = build.causes.find {
    if(it instanceof hudson.model.Cause.UpstreamCause) {
        return true 
    }
    return false
}

try {
    while(cause != null) {
        upstreamBuild = hudson.model.Hudson.instance.getItem(cause.upstreamProject).getBuildByNumber(cause.upstreamBuild)
        if(upstreamBuild == null) {
            break;
        }
        cause = upstreamBuild.causes.find {
            if(it instanceof hudson.model.Cause.UpstreamCause) {
                return true 
            }
            return false
        }
    }   
} catch(e) {
    // do nothing
}

// now we loop through the changeset and add all the users to a list
committers = []

if(upstreamBuild != null && upstreamBuild.changeSet != null) {
    upstreamBuild.changeSet.each() { cs ->
        if(cs.user != null) {
            committers.add(cs.user)
        }
    }
}

committers.unique().join(',')

这将生成一个字符串,该字符串将用上游作业中的提交者列表替换${SCRIPT}内容令牌。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14541617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档