gitlab提交代码后自动触发Jenkins
安装插件:GitHub plugin
共找到了两种常见方式:
- Build when a change is pushed to GitLab. GitLab webhook URL: http://20.88.9.101:8080/project/project/one_project
- Generic Webhook Trigger
简单了解了一下,尽量细说一下两个的区别.
- 第一个的
http://20.88.9.101:8080/project/project/one_project字段明显是一个webhook地址.此方式配置触发简单,只需要在gitlab对应的项目里添加上他即可.然后在这个项目提交的代码都会触发.缺点是,每新建一个gitlab项目,都要创建一个对应的webhook.同时好像并不能区分分支,任意分支都可以触发. Generic Webhook Trigger这种方式配置比较复杂但是更加灵活,可以使用正则匹配分支,匹配项目,甚至可以跨项目匹配,匹配提交人等等…
所以此处采用了Generic Webhook Trigger方式.
配置Jenkins



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提交代码测试是否可以触发.
