首页 » 运维 » 正文

如何配置github repo 通过jenkins pipeline来检查pull request

最近发现市面上讲配置jenkins来配合github 做ci检查的文章不是很清楚,所以周末抽了两天时间自己从头搭建了一套jenkins+ github 的PR检测流程

主要的目标是:当有人提交Pull request的时候,会触发jenkins来对这次提交的内容进行一个简单的检测,例如,语法格式检测,如果通过,则会允许PR继续merge, 如果pipeline 检测失败,pull request无法merge

文章以github为例(gitlab也搭建了一套,给我自己的云服务器给干死了,好资源太多)

在动手之前,先看一下两个大哥:

首先我们要搞清楚一件事:那就是jenkins 和github之间是要通信的,比如:

  • jenkins要去github 拉最新的代码,最起码要有Pull的权限
  • github也要有能够触发jenkins 中的Pipeline的权限(当然也有可能jenkins 允许任何人通过url触发)
  • jenkins 跑完Pipeline以后要能够去github 中更新Pull request的状态的权限(失败/成功)

所以我们要配置相应的credentail

那么从头开始吧:

第一步:创建一个新的repo 

我创建的repo (创建的步骤我就不重复了):

https://github.com/BlueShells/testpipelinejenkins

第二步:生成一个github token

GitHub个人头像->ettings > Developer settings > Personal access tokens, 点击Generate new token

选择对应的权限,基本意思就是如果有个人拿着这个token来,他能干哪些事情(jenkins后边会拿着这个token来更新pipleline的结果让github知道)

注意,生成以后记得复制出来存起来,要不一会就看不到了

第三步:为jenkins安装GitHub Pull Request Builder插件

Jenkins->Manage plugins -> Available

安装插件并重启jenkins

第四步: 配置 jenkins

我们现在需要配置我们前边说的credentail, 让jenkins能够和github进行沟通:

Jenkins-> Manage Jenkins->Configure Credentials ->system->Global credentials->Add Credentials(jenkins这个配置简直坑爹,我找了好半天)

先添加第二部的token

然后我们再添加一个github的用户名密码用来pull code

注意,如果可以还是通过秘钥的方式来Pull code能方便一些,用户名密码也不是麻烦,如果使用ssh 秘钥,可以参考下图配置

第五步:配置GitHub Pull Request Builder插件

Jenkins->Manage jenkins->Config system

配置参考下图:

配置完还可以添加Test Credentails 来测试,测试成功说明最起码jenkins能和github沟通了

第六步:创建pipeline

然后需要配置的地方为:

然后

再然后:

注意,这个地方要注意下,Pipeline 这个地方我图省事,用的是一个repo,也就是说,我把我的Pipeline的配置文件放到了我新创建的repo里,名字叫Jenkinsfile

逻辑就是:  有人提交pr -> 触发当前Job->根据jenkinsfile里边写的逻辑完成检测->然后返回github

pipeline这个地方完全可以是另外的repo

第七步:repo配置webhook

这一步就是我们让我们的github在监控到有新的PR的时候,去主动触发jenkins job

在我们新建的repo中,Settings > Webhooks->Add web hook

然后勾选

创建完成可以在列表页面看到状态,webhook的状态是”✅”说明正常,否则,你需要根据提示修好它

 

第八步:测试

创建自己的pull request 就可以测试了

 

这里要说明一下,新的pr提交过来以后,我们的Pipeline到底做了什么?其实就是第六步中定义的groovy文件里定义了我们要做的东西https://github.com/BlueShells/testpipelinejenkins/blob/master/Jenkinsfile,我现在什么都没有做,只是单纯打印出里如下信息:

  • PR的源branch
  • PR 的target branch
  • PR 的link
  • Push 的conmmetns

也就是说,我打印出来了所有 github 触发jenkins时传递过来的参数,拿到这些参数以后,我们就可以做一些事情了,例如:

通过传递过来的参数我知道了PR 的源branch, 我就可以通过命令把这个branch pull 到本地来(然后我们可以通过git命令拿到这次修改的文件git diff –name-only origin/master…HEAD)

然后我们就可以对修改的文件进行一些格式的检查…….

 

 

 

Zhiming Zhang

Senior devops at Appannie
一个奔跑在运维路上的胖子
Zhiming Zhang

Latest posts by Zhiming Zhang (see all)

发表评论