momo's Blog.

Jenkins + Gitlab 触发自动构建

字数统计: 1.3k阅读时长: 5 min
2019/09/10 Share

1. 前言

运维工作中总是会频繁的出现重复的工作,最近因为项目联调,导致构建和部署的频率剧增,这大大的增加的运维的工作量。所以本次采用 Jenkins 来进行项目的自动构建。

本次采用的组件:

1
2
Jenkins 2.176.2
GitLab Community Edition 9.4.3

2. 思路

要使用jenkins,首先要现在本地使用脚本跑一遍部署流程

公司项目使用的是 容器 进行部署,首先列出简单的部署流程

  1. 构建镜像
  2. 更新节点拉取新版本镜像
  3. 启动新容器

大体的实现思路就是这样,其中还需要配置WEB Hook,以及在节点中操作的脚本

3. 部署及配置

3.1 配置Jenkins

3.1.1 Jenkins 使用的插件

1
2
Generic Webhook Trigger  # Webhook 插件
Publish over SSH # 通过SSH发送文件,以及执行命令插件

3.1.2 插件前置配置

  1. 添加git用户
    1
    2
    3
    打开 Jenkins - 凭据 - 系统 - 全局凭据 - 添加凭据 - 选择Username with password

    如下图界面,配置用户名以及密码

  1. 配置 Publish over SSH 节点
1
2
Jenkins - 系统管理 - 系统配置 - Publish over SSH 配置
如下图配置:

  1. 添加跳板机用户
    1
    因为需要部署的节点与镜像构建节点分开,所以需要添加一个跳板机用户.这个是根据项目的情况来添加的,添加步骤与第一步一样, 不过选择的是以私钥的方式添加。

3.1.3 配置代码管理 git

  1. 新建一个工程,选择自由风格的项目
  2. 配置Git 地址,并进行测试

3.1.4 配置触发器

  1. 在触发器中,选择 Generic Webhook Trigger 插件

插件的配置很简单,只需要注意两个方面即可

  • 获取和过滤 Gitlab 发送过来的内容
  • 定义Token

Git web hook 请求body如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
{
"object_kind": "tag_push",
"before": "0000000000000000000000000000000000000000",
"after": "82b3d5ae55f7080f1e6022629cdb57bfae7cccc7",
"ref": "refs/tags/v1.0.0",
"checkout_sha": "82b3d5ae55f7080f1e6022629cdb57bfae7cccc7",
"user_id": 1,
"user_name": "John Smith",
"user_avatar": "https://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=8://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=80",
"project_id": 1,
"project":{
"name":"Example",
"description":"",
"web_url":"http://example.com/jsmith/example",
"avatar_url":null,
"git_ssh_url":"git@example.com:jsmith/example.git",
"git_http_url":"http://example.com/jsmith/example.git",
"namespace":"Jsmith",
"visibility_level":0,
"path_with_namespace":"jsmith/example",
"default_branch":"master",
"homepage":"http://example.com/jsmith/example",
"url":"git@example.com:jsmith/example.git",
"ssh_url":"git@example.com:jsmith/example.git",
"http_url":"http://example.com/jsmith/example.git"
},
"repository":{
"name": "Example",
"url": "ssh://git@example.com/jsmith/example.git",
"description": "",
"homepage": "http://example.com/jsmith/example",
"git_http_url":"http://example.com/jsmith/example.git",
"git_ssh_url":"git@example.com:jsmith/example.git",
"visibility_level":0
},
"commits": [],
"total_commits_count": 0
}
  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号

  1. 定义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. 结尾

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

CATALOG
  1. 1. 1. 前言
  2. 2. 2. 思路
  3. 3. 3. 部署及配置
    1. 3.1. 3.1 配置Jenkins
      1. 3.1.1. 3.1.1 Jenkins 使用的插件
      2. 3.1.2. 3.1.2 插件前置配置
      3. 3.1.3. 3.1.3 配置代码管理 git
      4. 3.1.4. 3.1.4 配置触发器
      5. 3.1.5. 3.1.5 构建环境
      6. 3.1.6. 3.1.6 构建
      7. 3.1.7. 3.1.6 部署
  4. 4. 4. 配置Gitlab Web Hook
  5. 5. 5. 结尾