陈同学
微服务
Accelerator
About
# 15min运维之Phabricator与Jenkins集成 ## 背景介绍 团队一直使用Facebook开源产品 [Phabricator](https://secure.phabricator.com/) 作为开发及项目管理产品。 近期开发管理服务器好几次因 Jenkins导致CPU短时间内持续爆满,因此记录下问题,同时也介绍下如何使用Phabricator触发Jenkins的job进行构建。 ## 问题记录 ### Jenkins导致CPU爆满 部署了Jenkins的服务器偶尔短时间内CPU耗尽,原因是jenkins用户运行了大量线程通过git在pull代码,下图仅截取了部分线程。 ![](https://blog-1256695615.cos.ap-shanghai.myqcloud.com/2018/06/21/b1d862be89eb4f40ac1dec85c66d3751.png) 由于一直采用的是Jenkins的 **Poll SCM** 方式来定期检查git库是否有更新再触发构建,检查频率一般为几分钟一次。团队的小项目本来就众多,特别是在使用Spring Cloud后,几套环境下来,Jenkins上已经有上百个JOB。 上图是五十多个JOB同时检查git repository的情景,直接导致CPU爆满。 ### Jenkins Poll SCM是性能的噩梦 这篇文章 [ Jenkins “Poll SCM” the Nightmare for Performance](https://blogs.microsoft.co.il/leonj/2017/01/24/jenkins-poll-scm-the-nightmare-for-performance/) 写的特别好,大意是: **每隔一定时间检查下代码库然后在有更新时触发构建** ,配置起来是很简单,特别爽,但是对于服务器来说却**苦不堪言**,因为Jenkins需要根据你配置的频率去 **获取源代码、比对是否有变更**,如果就几个Job倒是小菜一碟,但如果遇到 **上百个** 个Job,同时代码变更还很多、下载又很慢的话,服务器就该头疼了。 ### Webhook才是正确的打开姿势 Jenkins提供了便利的Rest API,各VCS仓库在检测到提交代码后自动调用Jenkins的API即可,这样可以让Jenkins按需构建,不需要进行定时检查工作。 像github等VCS产品都提供了便捷的webhook配置方式,可以非常方便的与CI工具集成。 ## Phabricator触发Jenkins构建 因这方面资料较少,这里演示下过程。 流程如下图,这里仅以一个git库的develop/master两个分支来演示,两个分支假设分别对应开发环境和测试环境,同时对应两个Jenkins Job。 ![](https://blog-1256695615.cos.ap-shanghai.myqcloud.com/2018/06/21/e0fab630cc714814bc777364da328d1e.png) Git Repo编码为: HSCFTEST Jenkins Job分别为:DEV-HSCFTEST、TEST-HSCFTEST,分别为开发、测试环境的构建job 下面是配置步骤,这里仅拿DEV做演示: ### 配置Jenkins触发远程构建 设置 **DEV-HSCFTEST** JOB支持触发远程构建,身份令牌随意给即可。Jenkins构建的API为(截图有点不对 ``` JENKINS_URL/job/jobName/build?token=TOKEN_NAME&cause=CauseReason ``` ![](https://blog-1256695615.cos.ap-shanghai.myqcloud.com/2018/06/21/a9c181ac2b86439e8f921aa65c57cea6.png) ### 创建build plan 使用Phabricator的Harbormaster来创建构建计划,用于调用Jenkins的API。 先创建一个 Build Plan,并添加一个类型为**Make HTTP Request** 的Build Step ![](https://blog-1256695615.cos.ap-shanghai.myqcloud.com/2018/06/21/f463bae5aa9940ac98abc8e2a178a17b.png) HTTP Request内容如下(DEV为对应的环境,每个环境配一个build plan即可): URI:`http://JENKINS_URL/job/DEV-${repository.callsign}/build?token=123456&cause=${repository.callsign}` Credentials:配置Jenkins用户的账号密码即可 ![](https://blog-1256695615.cos.ap-shanghai.myqcloud.com/2018/06/21/1e428d06f9014de0ad501ebcf4c1ef62.png) 需要特别注意的是,build plan中的参数有限,因此这里采用repository的编码即可。 ![](https://blog-1256695615.cos.ap-shanghai.myqcloud.com/2018/06/21/e0df0aa2a0be459f98422c9be0153d11.png) ### 配置触发规则 利用**Herald**来创建触发规则 规则为:当代码commit并提交上来后,如果是develop分支,则运行我们上面创建的build plan。 通过这个规则就可以实现推代码后自动触发Jenkins的构建。当然,你也可以配置更多条件,如:指定某些repository、指定某些分支、仅代码审核通过后才处理等等,这里仅做测试。 ![](https://blog-1256695615.cos.ap-shanghai.myqcloud.com/2018/06/21/e90c8691be2c45968fc8b4356138707c.png) ### 触发测试 我们往HSCFTEST库推代码后,会触发Herald规则再运行build plan. 下面是一次build plan运行的Demo ``` build plan配置:http://JENKINS_URL/job/DEV-${repository.callsign}/build?token=123456&cause=${repository.callsign} build plan运行:http://yourdomain/job/DEV-HSCFTEST/build?token=123456&cause=HSCFTEST ``` 上面的 *${repository.callsign}* 被替换成了git repository的编码 HSCFTEST ![](https://blog-1256695615.cos.ap-shanghai.myqcloud.com/2018/06/21/03f59d585e3f47dd8c252ae198826859.png) 下面是Jenkins被触发的job,刚才改了test文件。 ![](https://blog-1256695615.cos.ap-shanghai.myqcloud.com/2018/06/21/1e2039cc46ca4e10948e5e01388f798a.png) ### 约定优于配置 由于我们的git repository编码和Jenkins Job没有对应关系(改起来麻烦),所以暂时没有采用这个方案,而是把Job构建频率调慢了一些。但是对于新项目来说,这是个非常好的方式。 下面是**约定**,基于这个约定,phabricator可以非常便利的触发Jenkins构建,每套环境创建一个build plan即可 * git repository编码:XXX * Jenkins 任务编码:env-XXX,env为环境 因此,git库不要乱命名,因为Jenkins 的Job还是需要有可读性的。
本文由
cyj
创作,可自由转载、引用,但需署名作者且注明文章出处。
文章标题:
15min运维之Phabricator与Jenkins集成
文章链接:
https://chenyongjun.vip/articles/49
扫码或搜索 cyjrun 关注微信公众号, 结伴学习, 一起努力