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

标签 git jenkins continuous-integration email-notifications email-ext

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

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

显然有很多尝试来回答这个问题,但没有一个看起来令人满意,所以我会详细说明。 详情如下:

我们曾经使用 svn。 我们的作业层次结构是一个作业检查和编译,并触发其他作业,这些作业采用编译工件并对它们执行杂项集成测试。

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

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

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

如果您决定包含罪魁祸首,您可以使用 -Dhudson.upstreamCulprits=true 启动您的 jenkins,这会改变 email-ext 的行为,但如果您不想包含罪魁祸首,那将无济于事。此外,变更集似乎在下游作业中不可用。

还有一个 blame-upstream committers 插件,但它似乎不能很好地与 email-ext 配合使用。

upstreamCulprits 和 blame-upstream 似乎都需要指纹识别,我们宁愿不需要,因为我们有很多文件和很多工作......这有严重的性能问题。

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

所以我们很高兴,关于svn。 现在,我们迁移到 git。 没有 Blame Git 插件。 我们不介意写一个。我们只需要了解是否应该这样做。人们一起使用 git 和 jenkins 已经有一段时间了。我们不能第一个遇到这个困难...

谢谢, 内森。

最佳答案

这是我用 Clearcase 做的方式,在 svn 上应该很相似。在您输入用于接收电子邮件的地址列表的区域中,添加以下内容:

, ${SCRIPT, script="committers.groovy"}

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

// 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} 内容标记。

关于git - jenkins 下游作业如何通过 email-ext 向上游 git 提交者发送电子邮件通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14541617/

相关文章:

python - 是否有任何交叉引用 Python 源代码的 git web 网关

continuous-integration - 持续集成 - 最佳实践

git - 如何开发和测试本地 go 模块

gitkraken 不会自动删除远程功能分支

jenkins - 如何更改 Jenkins 中的文件夹图标

android - 是否可以将 Jenkins 用于 Flutter?

jenkins - Jenkins作业中止时运行构建后脚本

continuous-integration - GoCD 从管道中提取以前的工件

continuous-integration - 自动构建失败时播放声音

angularjs - 我已经安装了 angular cli 但它在 cmd 中无法识别