Jenkins 的 multi-branch pipeline 想必很多人已经在用了,使用这种类型的 Jenkins Job 最显著的作用就是可以对 Git 仓库里的任何分支和任何 Pull Request(以下简写为 PR)进行构建。
在做 Jenkins 与 Bitbucket 的集成时,需要安装插件:Bitbucket Branch Source,可以通过该插件在 Jenkins 里进行 webhook 的配置。这种方式对于没有 Bitbucket 仓库的管理权限,CI/CD 暂且处于变更比较频繁的阶段,不想麻烦的去申请添加 webhook 的同学来说是非常友好的。即可以不用通过管理员在 Bitbucket 设置里添加 webhook 也可以实现创建 PR 后触发 Jenkins 构建。
遇到问题
但我最近遭遇了两次失灵的情况,在创建 PR 后没有触发 Jenkins 自动构建,然而 Jenkins 和 Bitbucket Branch Source 并没有什么改动,也各种 Google 之后也没有找到相应的解决办法(如果有遇到此情况的小伙伴欢迎一起交流)。
那既然这条路不稳定,不好走,那就走一条可以走通的路、直接的硬路。即在 Bitbucket 对应的仓库中添加 webhooks。
如何配置
在申请添加 webhooks 之前,我先在个人的私人仓库下,创建了测试仓库对 webhook 进行了测试,在经过反复的测试,觉得没有问题后,将相应的配置通过管理员添加到对应的 Repository 中。如下示例:
- Webhook name: test-multibranch
- Webhook URL: http://localhost:8080/multibranch-webhook-trigger/invoke?token=test-multibranch
- Test connection: 返回 200, 连接测试通过。
- Events:
- Repository: N/A
- Pull Request: Opened, Merged, Declined, Deleted.
- Active: enable
Bitbucket webhooks 设置
Jenkins multi-branch pipeline 设置
最终效果
通过以上的设置,开发人员在每次创建 PR 都会立即触发 Jenkins 构建,显著的变化有两个:
- 比以前依赖插件响应速度要快很多,之前的响应速度一般在 1~2 分支才能触发构建
- 稳定程度大大提高,目前为止没有再出现创建 PR 之后没有触发 Jenkins 构建的情况
最终的与 Jenkins 的集成效果是这样的:
- 当创建 (Opened) 一个 Pull Request 时,会自动在 Jenkins 上创建相应的 Pull Request 任务(比如 PR-123)并开始构建。
- 当合并 (Merged) 这个 Pull Request 时,会自动删除 Jenkins 中的 PR-123 任务。
- 当拒绝 (decline) 这个 Pull Request 时,会自动删除 Jenkins 中的 PR-123 任务。
- 当删除 (Deleted) 这个 Pull Request 时,会自动删除 Jenkins 中的 PR-123 任务。
已经 Merge 的分支,会显示已经划掉了,灰色的,这种分支不可以再进行执行构建;而 develop
和 master
分支则可以继续手动或自动构建。
已经 Merge 了的 Pull Request 同样显示为已经划掉了,灰色的。PR-12
, PR-13
, PR-14
可以继续手动或自动构建。
事件补充
这里说一下我为什么没有添加 Modified 事件。此前我是添加了这个事件,但我发现一些处于待合并的分支不知不觉被 webhook 触发了很多次,由于我们的全平台构建、扫描、以及测试需要至少 2~3 小时的时间,当处于待合并的 Pull Request 过多时,对构建资源的占用可能会是全天候的。
我想应该是其中的哪个事件的特性所导致引起的,果不其然,这时候才注意到 Modified 事件的这段解释:A pull request's description, title, or target branch is changed. 从解释里可以看到 Modified 事件包含修改 PR 描述、标题、还包括了目标分支的变更都会触发构建。
其实这个 Modified 事件的这个特性本身是特别好的,可以不断的将已经合并到目标分支的代码拉取到源分支进行构建,保证源分支的代码一直是与最新的代码进行集成、构建和测试,这样集成的结果才是最准确可靠的。但只是不适合目前的我们,因此暂且没有开启 Modified 事件。
这里没有添加其他 webhook 事件,比如对于主分支的触发事件,这个可以根据具体需要进行添加。如果不是那么频繁,每日构建满足需求,那么在 Pipeline
里添加一个 trigger
就可以了。