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

时间:2016-06-01 11:53:43

标签: jenkins continuous-integration bitbucket

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

  • 每次推送到BitBucket中的分支都会触发发送到Jenkins服务器的webhook
  • 当Jenkins服务器收到webhook时,它将构建更改的分支(通过在配置中将分支名称指定为**
  • 构建完成后,使用BitBucket notifier
  • 将通知发送回构建状态的BitBucket

只需插件中的说明和一些快速的谷歌即可轻松设置其中的每一项。但是,我现在遇到了一个问题,这个问题可能更多的是想要以非传统的方式运行而不是其他任何问题。

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

  • 请求者
  • 开发人员(所有根据其最新版本在构建中提交的人员)
  • 收件人列表(预设列表)
  • 各种"责备"破碎版本的设置

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

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

1 个答案:

答案 0 :(得分:0)

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

脚本可以利用环境变量,但很难测试,因为没有办法运行脚本。您可以从Home -> Manage Jenkins -> Script console测试简单的Groovy脚本。

一个重要的"陷阱"与环境变量是他们被包括"包括"在脚本中,而不是变量或常量。例如。在脚本编译和运行之前,粘贴变量的内容以代替其$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命令会覆盖任何现有收件人。因此,如果用户未被识别,则应将收件人列表或其他电子邮件配置设置为后备。此外,如果没有人选择发送电子邮件,脚本将无法运行。添加调试时,包括正文中的用户名可能有所帮助。

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