在 Bitbucket 中显示 PR 构建状态

Show PR Build status in Bitbucket

我们使用 Team City(版本 2017.1.5)设置构建管道,并使用本地 Bitbucket 服务器( 4.8 版)用于我们的 git 存储库。我们的分支模型是 GitHub Flow

我们使用 mendhak Team City 插件向 Bitbucket 服务器报告构建状态。此外,我们在团队城市中创建了一个构建,以使用分支触发器构建拉取请求:+:refs/(pull-requests/*)/merge.

但是,此分支过滤器的构建状态在拉取请求的 Bitbucket 中不可见 window/page。

如果我们在功能分支上使用分支过滤器(例如 +:refs/heads/(feature/*)),构建状态将在 PR 上正确显示。但是,我们有兴趣在我们的合并请求中显示 PR 构建状态。

我们发现自 2013 年以来,Atlassian 已经有一个 open issue是 - 将近 5 年)。看来短期内不会修复。

问:

是否有任何可用的解决方法或 Bitbucket 插件(或 Team City 插件)可以解决此问题。我们希望避免添加任何额外的分支过滤器/触发器。

我觉得这是一个相当普遍的问题,应该已经被许多其他团队/个人解决了。我只是碰巧找不到合适的资源/ material.

非常感谢任何指点。

问题是您正在使用的引用(在 refs/pull-request/* 下)仅供内部使用,在 Bitbucket 网络中不可见 UI。

假设您在 Bitbucket Server 上有一个像这样的存储库:

现在假设您创建了一个从 "branch" 到 "master" 的 PR。 Bitbucket Web 中可见的引用 UI 没有改变,但是 git clone --mirror 揭示了在幕后创建的隐藏 refs/pull-request/* 引用:

git clone --mirror http://vm.bit-booster.com/bitbucket/scm/bb/rebase-example-1.git
cd ./rebase-example-1.git
git log --all --date-order --decorate --graph

结果:

与仅构建 branch 相比,使用 Team City 或 Jenkins 或 Bamboo 或使用 refs/pull-requests/1/merge 的任何构建(例如,本例中的 01ebefda503c)确实具有一大优势。 在实际合并之前,您可以先发制人地构建真实的东西(合并)。这就像是对未来的偷窥。

但是,如果您随后尝试使用相同的引用发布构建状态,则它有一个主要缺点。提交 ID 01ebefda503c 在 Bitbucket 的 Web UI 中不可见,因此拉取请求构建状态集成不会在成功(或失败)的构建中出现。

但是有一个很好的解决方法。让 Team City(或 Jenkins 或 Bamboo 等)毫无意义地将构建状态推送到抢先合并,然后使用 curl 将相同构建状态的副本发送到 HEAD^2,又名 01ebefda503c^2又名 e466842138b65.

(背景:插入符运算符“^”获取指定提交的给定父级,例如,^1 是第一个父级,^2 是第二个父级,如果您正在与疯狂的人一起工作,^3 会成为章鱼合并的第 3 个父代,依此类推。就我个人而言,多年来我没有在野外看到真正的章鱼合并。还记得绝大多数提交只有一个父代,也就是 "string-of-pearls" 样式提交。只有合并有 2 个或更多父项。)

您可以像这样触发针对 HEAD^2 的构建状态:

curl --user user:password -H "Content-Type: application/json" -X POST -d \
  '{"state":"SUCCESSFUL", "key":"K", "name":"K-9", "url":"http://bit-booster.com/"}' \
  http://vm.bit-booster.com/bitbucket/rest/build-status/1.0/commits/e466842138b658a1b09caa0b1caea065194311ce 

然后构建状态将在 PR 上可见。

并查看我的 Bitbucket add-on。 :-)