本文针对如何设置GitLab以及Jenkins,实现每次GitLab上有提交事件的时候,都能触发Jenkins执行相应的操作,主要分为以下几个步骤:(注意,不同的版本,操作步骤、选项位置可能不一样,但是大同小异)
1、新建GitLab测试用例
进入个人GitLab账号,在右上角的加号中,选择GitLab 的 New Project,或者直接点击右上角的绿色 New Project 按钮,可以新建个人的GitLab工程:
其余都走默认的设置,填写好project的名字,可以创建一个新的project,权限该咋配咋配,我这里新建的是test, 如图:(我为了方便演示,选择public权限,private无非就是去gitlab设置账号密码等等,这里不专门讨论这个)
2、设置Jenkins
2.1 首先安装 GitLab plugin
在“系统管理”->“插件管理”,查看已安装插件,输入 GitLab, 看看是否已经安装,如果没有,则 查看 可选插件,搜索 GitLab,安装后重启即可。
2.2 新建一个测试工程
新建一个job,如图:
源码管理选择Git, 输入刚刚新建的GitLab的 URL,我这是公开项目,你是私有的,那就设置好你的git。
目前只有master分支,后续可以根据不同分支对应设置不同的url,监听不同分支的情况。
在构建触发器选项中,勾选 Build when a change is pushed to GitLab ,该选项最后的URL就是这个工程的URL路径,注意如果是本机,则会显示localhost, 可以将localhost改为个人的ip。
注意这个url:http://192.168.31.36:8080/project/test10
下一步会用到这个url。可以在工程中设置构建后的操作为执行一句python脚本: print(“gitlab webhook jenkins”)。点击应用和保存。
3. 设置GitLab的webhook
GitLab版本在不断变换,该版本的GitLab,如图可以找到WebHook的设置入口:
你的可能是这个,反正都是一样的,有时候功能可能会移到其他地方,你得找一下
填入的url就是刚刚测试, 勾选push Event,这样就是每次有push操作的时候,就会触发webhook,执行填入的url中的操作:
(因为我的jenkins服务器是台内网服务器,所以操作很方便,但是你操作的时候,jenkins和gitlab要能相通才行,比如,一个是内网,一个是外网,那肯定不行,必须搞通,否则他怎么去收发数据?)
填入URL
如果出现添加不上的,如下所示:提示 Url is blocked: Requests to the local network are not allowed。那你需要用系统管理员账号去打开权限
用系统管理员登陆,选择Setting里的Network
把Allow requests to the local network from hooks and services 打勾,然后保存配置
返回我刚才创建的test用户,这次可以正常保存了
点击保存,然后点击Test,可以测试是否可以执行
如果返回200就说明测试成功,钩子可以正常使用了
如果报错,比如404,403,500等等,不用惊慌失措,基本上都是jenkins权限配置的问题,我只搜了些报错你们参考下:
备注:为了方便演示,我写了个简单的输出hello world的pipeline语法,你们自行参考:
一般会报这些错误:
3.1 anonymous build
不支持匿名build, 这是回到jenkins中,在 系统管理 -> 全局安全管理中, 勾选 匿名用户具有可读权限 如图:
然后点击应用和保存, 回到GitLab,继续测试. 如果继续抱该错,则进入刚刚构建的工程,点击 构建触发器中选中的Build When a change is pushed右下角的高级选项,有一个Secret token,点击 Generate,会生成一个安全代码:
复制到webhook中的url下面:
然后保存,再测试,就可以通过,这时候会触发jenkins执行一次操作:
看看控制台输出:
3.2 valid crumb
如果报该错,则在安全设置中,不勾选 CSRF, 如图:
测试通过,后续可以在此基础上拓展, 监听不同GitLab,同一个GitLab的不同分支的push操作,来分别触发jenkins端执行对应的操作。
总之我遇到的错基本都是jenkins的权限配置问题,如果权限要配得非常精细,那调整的参数选项就很多,处处都要留意。另外如果gitlab测试时报错不一定就是失败,我就遇到过测试时死活通不过,各种报错,但是无意间回到jenkins一看,钩子居然触发了。
4. GitLab webhook的原理
hook就是在相应的事件下设置钩子,当相应的事件触发的时候,比如push event, merge event等操作的时候,就会触发hook下面的脚本执行,而gitlab webhook, 就是会触发执行这个webhook的url,类似于前面在jenkins调用中提到的打开url触发jenkins执行job。