GitLab 钩子 + Jenkins 自动化构建项目

Jenkins + Maven + Git 自动化部署的基础上,我们今天通过 GitLab 钩子 的方式,当开发提交代码,或者合并分支请求的时候,自动地触发自动化构建。

一、Jenkins 配置

1、远程构建触发器

在 Jenkins 构建配置 Dashboard > first > Configuration > Triggers 有一个构建触发器

它可以让远程的服务器,或者客户端通过 HTTP 请求的方式,来触发某一个构建任务的构建。

2、测试远程构建触发器

  • 配置上 token,然后保存
  • 在打开 Jenkins 的同一个浏览器,访问
bash 复制代码
http://192.168.40.98:8080/job/first/build?token=123456
  • 可以看到 Jenkins 的构建列表里,触发了一个新的构建任务。

3、跨浏览器测试

打开另外一个浏览器,就比如我 Jenkins 是在 Edge 打开的,我现在在 夸克 浏览器访问刚才的URL。

会发现被重定向到登录页了。这是因为跨浏览器访问,夸克浏览器没有 Jenkins 的登录会话(session),请求被拦截并重定向到登录页了。那怎么解决这个问题呢?

4、安装 Build Authorization Token Root 插件

在 Dashboard > Manage Jenkins > 插件管理 > Available plugins 搜索 Build Authorization Token Root 插件 并安装

  • 安装完点击返回首页

可以让我们以匿名的访问来访问 Jenkins,并通过访问另外一个 URL 来触发 Jenkins 的构建任务。

5、测试匿名触发

在夸克浏览器访问

bash 复制代码
http://192.168.40.98:8080/buildByToken/build?job=first&token=123456

此时,Edge 的 Jenkins 自动触发了一次新的构建

接下来,我们就可以把这个地址配置到 GitLab Webhook 上,当 GitLab 发生 提交、合并 事件的时候,去回调这个 URL。

二、GitLab 配置

1、GitLab 项目配置

在 GitLab 项目配置里,找到 Settings > Webhooks

  • 配置 Jenkins URL
  • 勾选 Push 事件,默认所有分支
  • 取消 SSL 认证

因为我们 Jenkins URL 并不是 HTTPS 的,所以取消认证,Add webhook

  • 点击完 Add webhook 会报一个错,Invalid url given

这是因为 GitLab 做了一个限制,不允许本地网络访问。

2、GitLab 全局配置

在 Admin area > Settings > Network > Outbound requests(出站请求)勾选

Allow requests to the local network from webhooks and integrations

然后 Save changes。

3、测试 GitLab Hook

重新再配置一遍 GitLab 项目配置后,会发现 Webhooks 多出来一条记录。

点击 Test,选择 Push events 进行测试。

在点击 Push events 的同时,Jenkins 构建列表中,又触发了一次新的构建。证明我们 Webhooks 配置没问题。

4、本地提交代码测试

在 IDEA 修改一下 Jenkins-study 代码并提交

  • 可以看到,Jenkins 又触发了一次新的构建
  • 浏览器访问
bash 复制代码
http://192.168.40.97:8088/

思考?

  • Push events 触发的的构建有什么问题吗?

首先的问题就是构建太频繁了,开发每提交一次代码,都会触发一次新的构建,这样是很耗费系统资源的。正常我们项目针对每个环境都会有一个分支,比如 开发环境 有一个 dev 分支,测试环境有一个 test 分支,生产环境有一个 prod 分支。

当开发人员将 dev 分支合并到 test 分支的时候,或者 部署人员 将 test 分支合并到 prod 分支的时候,我们才希望 Jenkins 帮我们触发构建。

5、Merge 事件触发

  • 修改 Webhooks 配置
  • 新建分支

我们现在 Jenkins 拉取的分支是 master,我们从 master 拉取一个新的分支 test,修改一下代码,然后合并回 master,看看会发生什么。

  • GitLab 上处理合并请求
  • 选择将 test 合并到 master
  • 创建合并请求
  • 可以看到此时我们的代码还未合并,只是创建了合并请求,Jenkins 就触发了一次构建

原因写在 GitLab Webhook 说明里

  • 合并代码
  • Jenkins 又触发了两次构建

一次是我本地 test 合并到 远程 GitLab test,触发一次;

一次是远程 test 合并到 远程 master 触发一次;

  • 查看浏览器,代码已是最新

三、总结

通过实际测试,GitLab 的 合并请求事件,是不管 哪个分支合并到哪个分支,它都会触发通知,需要由你的服务端来决定是否需要处理。这样就会造成即使不是我们当前 Jenkins 构建任务分支的合并,也会触发 Jenkins 的构建。

相关推荐
shan~~6 小时前
ubuntu系统安装elasticsearch
ubuntu·elasticsearch·jenkins
锦年JNian6 小时前
docker常用命令
运维·docker·容器
知白守黑2677 小时前
jenkins
运维·jenkins
河南博为智能科技有限公司7 小时前
十六串口服务器-解决多设备联网难题
大数据·运维·服务器·人工智能·物联网·边缘计算
运维有小邓@7 小时前
如何生成随机密码保护新创建的用户帐户安全?
运维·安全·自动化
Jack电子实验室8 小时前
Linux系统调用lseek详解:文件指针的灵活控制
linux·运维·服务器
TracelessLe8 小时前
/usr/bin/ld: cannot find -lcuda报错分析
linux·运维·服务器
R0ot9 小时前
面向安全增强的SSH版本升级实战指南
运维·安全·ssh
huangyuchi.9 小时前
【Linux网络】Socket编程实战,基于UDP协议的Echo Server
linux·运维·服务器·udp·socket·客户端·网络通信