因为想解放人工,实现代码push完后jenkins自动部署代码,代码仓库用的是gitlab,首先想到当然是,gitlab通过webhook去通知jenkins部署代码。在网上找文档,发现大多数都是粘贴复制而且质量参差不齐,爬坑不少

 

前期准备

  1. 安装部署jenkins(参考Jenkins官方文档
  2. 安装部署gitlab(参考gitlab官方文档

配置jenkins

  1. 安装插件
    去jenkins系统管理下的插件管理,在线安装Gitlab Hook Plugin和Gitlab Plugin这两个插件,然后叫重启jenkins

     

  1. 系统配置
    安装完插件后,去jenkins的系统管理下的系统设置,设置好Gitlab的参数,并测试时候能连接上Gitlab

     

 

API token可以在gitlab中的用户的设置中找到

  1. 新建任务

     

     

     

    这里要提醒下,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的复选项的选中,保存就可以

     


原文链接:https://www.jianshu.com/p/2b2c204dcbe2

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐