【问题标题】:Setting Jenkins to email a build notification to the BitBucket user who pushed a branch将 Jenkins 设置为通过电子邮件将构建通知发送给推送分支的 BitBucket 用户
【发布时间】:2020-03-29 19:02:29
【问题描述】:

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

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

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

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

  • 请求者
  • 开发人员(所有在基于最新版本的构建中提交的人)
  • 收件人列表(预设列表)
  • 损坏构建的各种“责备”设置

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

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

【问题讨论】:

  • 在 Git 中没有像 Pusher 这样的东西,因为远程仓库和任何其他仓库一样:它只包含提交者提交的提交(唯一的例外是它可能成为bare repo)。这就是为什么 Git 是一个 DCVS。
  • 你会用什么术语来描述将一组提交从他们的存储库推送到远程存储库的人? BitBucket 使用术语actor,但这似乎很笼统。对我来说,Pusher 是描述那个人的最清晰的方式。
  • 你是对的,它来自工作流 POV。但是 Git 本身并没有 Pusher 的概念。它只知道Committers (and Authors)

标签: jenkins continuous-integration bitbucket bcbsn


【解决方案1】:

经过大量搜索,似乎实现此目的的唯一方法是使用预发送脚本。这被添加到 Email-ext post-build 步骤的 Advanced 设置中,并采用以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 脚本的容器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 2010-11-17
    相关资源
    最近更新 更多