设置 Jenkins 以通过电子邮件将构建通知发送给推送分支的 BitBucket 用户

Setting Jenkins to email a build notification to the BitBucket user who pushed a branch

项目存储库已使用 BitBucket plugin 成功连接到 Jenkins 服务器,项目设置如下:

只需按照插件中的说明和一些快速的 Google 搜索,即可轻松设置其中的每一项。然而,我现在 运行 遇到了一个问题,这个问题可能更多的是想要 运行 以一种非常规的方式而不是其他任何方式。

使用普通的 emailer 插件或 Email-ext 插件,可以将电子邮件设置为发送给参与构建创建的人员。例如,Email-ext 插件允许选择:

所遵循的开发过程涉及每个项目都由指定分支中的一名开发人员处理,例如userA/projectB。显然,其他开发人员可以检查并推动进行更改,但这是不受欢迎的。即使在那种情况下,推送 BitBucket 更改的用户也应该得到通知。

None 的当前设置支持此功能。 Requester 是最接近的,但仅适用于手动构建。触发构建的向 SCM 的推送应该通知推送的用户,这似乎是一个非常简单的要求,但是在任何容易找到的地方都没有记录。

经过大量搜索,似乎实现此目的的唯一方法是使用 预发送脚本。这被添加到 Email-ext post-构建步骤的 Advanced 设置中,并采用 Groovy 中编写的代码形式,即 Java 扩展。

该脚本可以利用环境变量,但很难测试,因为无法 运行 将这些设置到位的脚本。您可以测试来自 Home -> Manage Jenkins -> Script console.

的简单 Groovy 脚本

环境变量的一个重要 "gotcha" 是它们在脚本中 "included",而不是变量或常量。例如。在脚本编译和 运行 之前,变量的内容被粘贴到其 $NAME 的位置。在下面的示例中,多行字符串语法用于包含 BitBicket 有效负载,而可能预期 def payload = $BITBUCKET_PAYLOAD 会简单地工作。

import javax.mail.Message.RecipientType
import javax.mail.Address
import javax.mail.internet.InternetAddress
import javax.mail.internet.MimeMessage
import groovy.json.JsonSlurper

def jsonSlurper = new JsonSlurper()

def bitbucket = jsonSlurper.parseText('''
   $BITBUCKET_PAYLOAD'''
)

switch (bitbucket.actor.username){
  case "userA":
    msg.setRecipients(MimeMessage.RecipientType.TO, InternetAddress.parse("user.a@domain.com"));
  break;
  case "userB":
    msg.setRecipients(MimeMessage.RecipientType.TO, InternetAddress.parse("user.b@domain.com"));
  break;
}

setRecipients 命令覆盖任何现有收件人。因此,如果用户未被识别,收件人列表 或其他电子邮件配置应设置为备用。此外,如果没有选择将电子邮件发送给任何人,则脚本根本不会 运行。作为添加的调试,在正文中包含用户名可能会有所帮助。

如果脚本失败,应将堆栈跟踪打印到测试的控制台日志输出中,构建 pass/fail 不应受到影响,但将使用正常的电子邮件地址设置。在堆栈跟踪中查找其中包含 Script() 的行,因为这是评估 Groovy 脚本的容器。