因为想解放人工,实现代码push完后jenkins自动部署代码,代码仓库用的是gitlab,首先想到当然是,gitlab通过webhook去通知jenkins部署代码。在网上找文档,发现大多数都是粘贴复制而且质量参差不齐,爬坑不少
前期准备
- 安装部署jenkins(参考Jenkins官方文档)
- 安装部署gitlab(参考gitlab官方文档)
配置jenkins
-
安装插件
去jenkins系统管理下的插件管理,在线安装Gitlab Hook Plugin和Gitlab Plugin这两个插件,然后叫重启jenkins
-
系统配置
安装完插件后,去jenkins的系统管理下的系统设置,设置好Gitlab的参数,并测试时候能连接上Gitlab
API token可以在gitlab中的用户的设置中找到
-
新建任务
这里要提醒下,jenkins所在的服务器的jenkins用户(注意是jenkins用户,而不是root)要设置好ssh公私钥免密登录,这就需要为jenkins生成公私钥,并ssh-copy-id到代码部署服务器和gitlab服务器
后面的URL可以copy下来,后面会用到
这里记得需要选择Filter branches by name并且填上分支名,选择这个可以做到,如果改分支有push事件,就会触发这个job的构建。如果选择Allow all branches to trigger this job,则所有分支的push事件都会触发这个job的构建,显然这个并不是很合理。
最后配置好构建步骤直接保存
配置gitlab
点击你要配置的项目,进入设置
在链接那里输入之前jenkins上提供的webhook url,编辑完后保存,点击测试,如果返回200,那就成功了,去jenkins看看有没有自动构建的记录。
第二种链接URL格式是http://<jenkisn的IP地址和端口>/gitlab/build_now/<jenkins的job名称>,例如jenkins的IP地址为192.168.4.1:8080,job名称是job,那么该URL为http://192.168.4.1:8080/gitlab/build_now/job1
在这一步我遇到了两个问题
- 测试失败返回404,Hook execution failed: execution expired
后来查看文档,得知原因是如果jenkins是通过调度器去分发请求来访问的或者是利用iptables去转发的话都会出现这种问题,解决方法是直接把webhook中的jenkins的ip地址改成内网jenkins的Ip地址和端口(前提是jenkins和gitlab在内网能互通) -
测试返回Anonymous
解决方法是在jenkins系统管理下的系统设置中的gitlab选项的配置那里,取消Enable authentication for '/project' end-point的复选项的选中,保存就可以