1. 前言
运维工作中总是会频繁的出现重复的工作,最近因为项目联调,导致构建和部署的频率剧增,这大大的增加的运维的工作量。所以本次采用 Jenkins 来进行项目的自动构建。
本次采用的组件:
1 | Jenkins 2.176.2 |
2. 思路
要使用jenkins,首先要现在本地使用脚本跑一遍部署流程
公司项目使用的是 容器 进行部署,首先列出简单的部署流程
- 构建镜像
- 更新节点拉取新版本镜像
- 启动新容器
大体的实现思路就是这样,其中还需要配置WEB Hook,以及在节点中操作的脚本
3. 部署及配置
3.1 配置Jenkins
3.1.1 Jenkins 使用的插件
1 | Generic Webhook Trigger # Webhook 插件 |
3.1.2 插件前置配置
- 添加git用户
1
2
3打开 Jenkins - 凭据 - 系统 - 全局凭据 - 添加凭据 - 选择Username with password
如下图界面,配置用户名以及密码

- 配置 Publish over SSH 节点
1 | Jenkins - 系统管理 - 系统配置 - Publish over SSH 配置 |

- 添加跳板机用户
1
因为需要部署的节点与镜像构建节点分开,所以需要添加一个跳板机用户.这个是根据项目的情况来添加的,添加步骤与第一步一样, 不过选择的是以私钥的方式添加。
3.1.3 配置代码管理 git
- 新建一个工程,选择自由风格的项目
- 配置Git 地址,并进行测试

3.1.4 配置触发器
- 在触发器中,选择 Generic Webhook Trigger 插件
插件的配置很简单,只需要注意两个方面即可
- 获取和过滤 Gitlab 发送过来的内容
- 定义Token
Git web hook 请求body如下
1 | { |
- 调试 Generic Webhook Trigger ,获取tag号
- 面对git带来的参数,我们如何获取呢?
插件使用了,json来进行解析.
在线测试路径如下:
https://jsonpath.curiousconcept.com/
研发提交代码后,我们需要按照代码中的TAG号进行切换和打包工作,所以我们需要过滤出json中的tag号。
只需要从json对象中调用出相应的值就可以了
1
2
3
4$.ref 即可解析出结果为:refs/tags/v1.0.0
同理,如果有多层嵌套,只需要多调用几次即可
$.project.git_http_url 即可获得项目的URL如果获取到的结果,还需要进行进一步处理,我们可以使用正则表达式进行匹配
Value filter 中所填的值,为正则表达式
他会将匹配到的字符串进行剔除,只留下为匹配到的字符
比如:
字符串 : refs/tags/v1.0.0
正则表达式:refs/tags/
匹配后,字符串就仅剩下 v1.0.0 ,也就是我们需要的tag号

- 定义Token
PS: 注意了,这个Token不可与其他项目相同,这是插件唯一鉴权的方法,如果相同,则会出现一次Hook,多个项目同时构建
3.1.5 构建环境
在构建环境中,我们勾选 Delete workspace before build starts ,已清理上次构建的数据

3.1.6 构建
此步骤需要两个操作
- 打包
- 构建容器
而打包可根据不同的项目分不同的步骤,有些项目需要 make 以及其他的编译操作,所以根据不同的项目做出相应的调整
这次更新的内容只是一个PHP 项目,只需要将代码放置在WEB环境中即可,所以不需要编译操作,所以操作的话如下图:

将源码打包后,通过 SSH 插件上传至镜像构建服务器,并进行构建

脚本可根据不同情况进行编写,这里不过多介绍
3.1.6 部署
部署的话,我采用的是另一款SSH插件
https://wiki.jenkins.io/display/JENKINS/SSH+plugin 插件地址
- SSH plugin
4. 配置Gitlab Web Hook
登录gitlab的项目目录,在设置中激活Web Hook
并且在选择相应的时间
Jenkins Url地址为:http://JENKINS_URL/generic-webhook-trigger/invoke?token= Token
例子: http://127.0.0.1:8080/generic-webhook-trigger/invoke?token=123456

配置完成后,可以测试一下

5. 结尾
此次构建项目还没有做到完整,只是针对构建进行了操作,后期将会添加邮件通知,以及错误处理。