目录
前言
接上一篇文章——单元测试 CI/CD_Swuagg的博客-CSDN博客。之前是通过“新建任务”的方式实现的单元测试CI,但遇到了如下问题或者说是需求:
-
Github单测结果可视化——需要以机器人的方式在Github展示;
-
Github单测结果失败或异常时,不允许PR。
于是重新寻找解决方案,多种尝试这里就不赘述了,最后发现Jenkins的“新建Pipeline”比“新建任务”更强大,可定制性更高,索性再次研究Pipeline去实现Github单元测试的CI流程。
新建任务 | |
---|---|
Pipeline | |
1 Pipeline
Pipeline方式也叫流水线方式。首先,Pipeline需要实现之前新建任务方式已实现的功能,即:
- Github提交PR时,能够触发Jenkins;
- Jenkins在代码仓库的某个分支执行单元测试;
- 将单元测试结果告知Github。
其次,还需要实现:
- Github以机器人的形式展示单元测试结果,而不是以开发者个人名义去展示;
- Github实时显示Jenkins Pipeline状态;
- Pipeline正在执行或单测失败、异常时,不允许Github点击PR;
- 支持手动触发Jenkins再跑一遍流水线。
2 Github Robot
后面将详细讲述Pipeline的配置,这里先讨论下Github机器人的问题。
我理解的Github机器人就是Github Apps,这就需要我们自己去实现,那我们可以找到网上已有的轮子吗?事实是有这个轮子,也可以说是没有,且让我慢慢道来,毕竟利用零碎时间花了好几天去寻找方案。
(1)可以自己去创建一个Github App(创建 GitHub 应用程序 - GitHub Docs),然后使用Github API实现机器人的功能(在应用程序中使用 GitHub API - GitHub Docs)。
(2)可以使用Probot开源机器人的方式简化创建Github App。其一,可以查找是否有现成免费的机器人可供使用(https://probot.github.io/apps/),我把这几十个Robot细看了一番,未发现符合要求的Github Commit机器人;其二,Probot也提供新建机器人的方式去实现Github App(https://probot.github.io/docs/)
(3)自己创建Github App比较麻烦,Probot开源机器人也没找到合适的,且创建Probot机器人也还是需要费一些时,而创建一个Github机器人账号的方式也未找到合适的,最后还是决定使用一种不太优雅的方式实现——单独创建一个Github小号作为机器人。
寻找方案过程:
- Github App
- Probot开源机器人
- 创建Github机器人账号
- 创建Github小号作为机器人
3 Pipeline配置
3.1 配置Github项目,且不允许流水线并发构建
3.2 配置GitHub Pull Requests插件
1、触发模式选择:Hooks with Persisted Data
2、触发流水线执行的事件:(1)在Commit输入Jenkins please retry unit test;(2)PR打开时;(3)代码Commit改变时。
3、触发流水线执行的分支:在WhiteList Target Branches中填写分支名
3.3 编写Pipeline脚本
1、定义阶段:Init、Clone、Build、Test...
2、setGitHubPullRequestStatus向Github发送status
3、script可执行shell脚本,clone仓库、编译项目和执行单测等。如:
setGitHubPullRequestStatus context: 'Robot', message: 'Cloning...', state: 'PENDING'
script {
sh '''
if [ ! -d "BUD-Android-Global" ]; then
echo mkdir 当前项目 and clone
mkdir 当前项目
git clone git@github.com:***/当前项目.git
cd ./当前项目
else
echo 当前项目 'already exists'
cd ./当前项目
fi
git pull origin master
git checkout master
./gradlew clean
./gradlew unit_test:test
'''
}
setGitHubPullRequestStatus context: 'Robot', message: 'Unit Test Success.', state: 'SUCCESS'
githubPRComment comment: githubPRMessage('Unit Test Success. '), statusVerifier: allowRunOnStatus("SUCCESS"), errorHandler: statusOnPublisherError("UNSTABLE")
对应Github响应结果如下:
4 Github配置
4.1 配置Branches
要求在merge之前通过状态检查,下面的Status checks需要搜索用户或者用户创建的Jenkins任务、Jenkins Pipeline。(多说一句:这里之前我遇到一直没有拦截成功状态,就是没设置对,多尝试下。ps:吐槽一下,Github这里的交互也不好,没有列表可供选择)
4.2 新建Github Robot
上文也提到,这里的Github Robot是采取曲线救国的方式。
1、首先,需要申请一个小号,名字就叫GitRobot,并生成一个Personal access tokens。
2、然后,在Jenkins中新建名为GitRobot的凭据,接着在系统管理-系统配置中配置Github服务器,并使用到GitRobot凭据(详细步骤可参考我的上一篇文章,有详细讲解)。
注:这里不用配置Github的WebHook,本文3.2节配置的GitHub Pull Requests插件应该会自动帮忙创建一个WebHook。
5 小结
Jenkins Pipeline的简单配置就分享到这了,CI/CD这条路其实也才刚刚开始,后面还有很多知识等待去探讨。