05 gitlab自动触发Jenkins

gitlab提交代码后自动触发Jenkins

安装插件:GitHub plugin

共找到了两种常见方式:

  1. Build when a change is pushed to GitLab. GitLab webhook URL: http://20.88.9.101:8080/project/project/one_project
  2. Generic Webhook Trigger

简单了解了一下,尽量细说一下两个的区别.

  1. 第一个的http://20.88.9.101:8080/project/project/one_project字段明显是一个webhook地址.此方式配置触发简单,只需要在gitlab对应的项目里添加上他即可.然后在这个项目提交的代码都会触发.缺点是,每新建一个gitlab项目,都要创建一个对应的webhook.同时好像并不能区分分支,任意分支都可以触发.
  2. Generic Webhook Trigger这种方式配置比较复杂但是更加灵活,可以使用正则匹配分支,匹配项目,甚至可以跨项目匹配,匹配提交人等等…

所以此处采用了Generic Webhook Trigger方式.

配置Jenkins

开启gitlab触发
添加密钥
添加Secret text

Secret内容随意写但是要记好,gitlab添加要用到,此处写为了 qwe

在这里插入图片描述
复制这里的API地址,替换掉JENKINS_URL.

在这里插入图片描述

gitlab打开管理员
在这里插入图片描述
粘贴url地址,输入对应的Secret.滑到下方点击添加.

最后.回到Jenkins,可以先什么都不配置,这样,他会匹配所有请求.
在这里插入图片描述
但是在保存前,勾选这两个print.他们会打印gitlab请求过来的参数.
gitlab提交文件触发Jenkins构建,在最开头,他会输出对应的请求体.
在这里插入图片描述

配置匹配规则

拿到了请求体参数,接下来就可以从中取值,配置对应的触发规则了.
首先将请求体参数转换下格式这样更加易读(百度json在线解析即可)

{
	"object_kind": "push",
	"event_name": "push",
	"before": "e8f29b8ed4fe96e85e86e5efa38aea78e406490c",
	"after": "25aa4a1ca4c1e6fcdf105d67ce274d00c26c46c1",
	"ref": "refs/heads/main",
	"checkout_sha": "25aa4a1ca4c1e6fcdf105d67ce274d00c26c46c1",
	"message": null,
	"user_id": 1,
	"user_name": "Administrator",
	"user_username": "root",
	"user_email": null,
	"user_avatar": "https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon",
	"project_id": 2,
	"project": {
		"id": 2,
		"name": "one_project",
		"description": "",
		"web_url": "http://20.88.9.34/my_group/one_project",
		"avatar_url": null,
		"git_ssh_url": "ssh://git@20.88.9.34:222/my_group/one_project.git",
		"git_http_url": "http://20.88.9.34/my_group/one_project.git",
		"namespace": "my_group",
		"visibility_level": 0,
		"path_with_namespace": "my_group/one_project",
		"default_branch": "main",
		"ci_config_path": null,
		"homepage": "http://20.88.9.34/my_group/one_project",
		"url": "ssh://git@20.88.9.34:222/my_group/one_project.git",
		"ssh_url": "ssh://git@20.88.9.34:222/my_group/one_project.git",
		"http_url": "http://20.88.9.34/my_group/one_project.git"
	},
	"commits": [{
		"id": "25aa4a1ca4c1e6fcdf105d67ce274d00c26c46c1",
		"message": "Update README.md",
		"title": "Update README.md",
		"timestamp": "2022-04-29T12:12:36+00:00",
		"url": "http://20.88.9.34/my_group/one_project/-/commit/25aa4a1ca4c1e6fcdf105d67ce274d00c26c46c1",
		"author": {
			"name": "Administrator",
			"email": "admin@example.com"
		},
		"added": [],
		"modified": ["README.md"],
		"removed": []
	}],
	"total_commits_count": 1,
	"push_options": {},
	"repository": {
		"name": "one_project",
		"url": "ssh://git@20.88.9.34:222/my_group/one_project.git",
		"description": "",
		"homepage": "http://20.88.9.34/my_group/one_project",
		"git_http_url": "http://20.88.9.34/my_group/one_project.git",
		"git_ssh_url": "ssh://git@20.88.9.34:222/my_group/one_project.git",
		"visibility_level": 0
	}
}

接下来,就从这段请求体中取值进行判断了.

这段分为两步,一步为"取值",一步为"匹配"
取值时我们要从上面这段请求体中取出对应的几个值,然后将值重新赋值给一个变量,取值语法为$开头表示是一个变量,.表示根节点,然后后面跟第一级key的名字,如果取出的value还是json那么则以点为分隔符继续写key的名字(就类似于Linux路径/),示例,分别取出"user_name": "Administrator"这一行和project中的"name": "one_project"字段的值的写法:
.user_name.project.one_project
继续使用Linux路径对比,project这种具有子集的就相当于一个文件夹,而user_name这就可以比喻为一个文件,他的内容就是Administrator.刚才的取值如果换做Linux文件的话,那么就是:
/user_name/project/name

至于匹配,则是根据取出的变量重新拼接为一个字符串,然后根据你提供的正则表达式去匹配这个字符串,匹配成功则自动触发任务.

实际配置

在这里插入图片描述
点击新增一个变量
在这里插入图片描述
继续添加一个
在这里插入图片描述
选上之前创建的Secret
在这里插入图片描述
在这里插入图片描述
Expression写匹配规则,支持正则,Text是对应的文本内容,$ref$project_name都是上面新增的两个变量的名字,然后两个变量中间的_没有什么意义只是在这两段中间加了一个符号,最终拼接的文本内容也就是上面匹配文本那段了.

修改完成后保存,gitlab提交代码测试是否可以触发.


版权声明:本文为weixin_44455125原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。