极狐GitLab 正式推出面向 GitLab 老旧版本(12.x、13.x、14.x、15.x 等)免费用户的专业升级服务,点击查看详情

返回列表 发布新帖

gitlab配置hooks使用

171 0
发表于 2025-12-30 17:27:00 | 显示全部楼层 阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

×
# hooks简介

hooks(钩子)是指在特定事件发生时,来触发一些特定的操作,gitlab支持git hooks,也支持一些其他的hooks

# system hooks

更多信息可参见[官方文档](https://docs.gitlab.com/ee/admin ... s.html#system-hooks)

system hooks是当特定的系统事件发生时,来触发一些其他额外操作,比如组、项目、用户的创建更新操作等,

## system hooks创建

依次进入:管理中心---系统钩子

1、输入url(如:http://192.168.50.25:9999)和token,当特定系统事件发生时,就会向这个url发送通知信息

2、选择触发器,指定触发system hooks的事件

3、可以选择是否启用ssl认证



创建好后,可以在下方看到以及创建的hooks,并且可以使用“测试”按钮,测试hooks是否正常



# server hooks

server hooks必须放在和gitaly同一个服务器的os文件系统上,且存放目录和脚本文件所有者需要是git,且脚本文件可执行。

gitlab server hooks 是 git server hooks,在git客户端将代码推送到gitlab时执行,包括:

pre-receive:在处理来自客户端的推送时,最先被调用,如果脚本非0退出,则整个推送过程将不被接受

post-receive:在整个推送过程完成后运行,相关脚本在运行过程中是不会断开推送客户端的连接的,如果脚本执行较久,可能整个推送过程会很久

update:此类脚本和pre-receive脚本相似,不同的是pre-receive只会执行一次,而update会在引用的每个分支上都执行一次,如果update脚本非0退出,则尽拒绝当前分支操作,其他分支还会继续执行



## 全局server hooks

创建全局钩子脚本存放目录,需要注意存放目录的所有者为git

```
gitaly['custom_hooks_dir'] = "/var/opt/gitlab/gitaly/custom_hooks"
此参数设置全局钩子脚本存放目录,默认为/var/opt/gitlab/gitaly/custom_hooks

mkdir /var/opt/gitlab/gitaly/custom_hooks
chown git.git /var/opt/gitlab/gitaly/custom_hooks

如下创建各类型钩子存放目录:
mkdir /var/opt/gitlab/gitaly/custom_hooks/pre-receive.d
mkdir /var/opt/gitlab/gitaly/custom_hooks/post-receive.d
mkdir /var/opt/gitlab/gitaly/custom_hooks/update.d
chown git.git /var/opt/gitlab/gitaly/custom_hooks/*
```

pre-receive示例:如下会在客户端推送时打印相关信息在客户端

```
#!/bin/bash
echo "push user is $GL_USERNAME,this is test hook"
echo $GIT_PUSH_OPTION_0
```



## 项目server hooks

1、在web界面上,进入到管理中心---概览---项目,找到具体的项目,点击进去,找到gitaly的相对路径,omnibus安装一般默认为:/var/opt/gitlab/git-data/repositories/@hashed/.../<project>.git

2、在上述路径里面创建custom_hooks目录

​       如果是单个脚本,可直接在此目录下创建以脚本类型名称命名的脚本:pre-receive,post-receive,update

​       如果有多个脚本,需先在此目录下创建对应的钩子脚本存储目录:pre-receive.d,post-receive.d,update.d,然后将对应类型的脚本放入对应目录即可

3、要注意custom_hooks目录及其子目录和文件的所有者需要是git

## hooks执行顺序

gitlab按照一下顺序搜索和执行钩子脚本:

1、gitlab服务器内置钩子,用户无法自定义这些钩子

2、<project>.git/custom_hooks/<hook_name>:每个项目的单个钩子脚本

3、<project>.git/custom_hooks/<hook_name>.d/*:每个项目的钩子目录内的脚本

4、<custom_hooks_dir>/<hook_name>.d/*:所有可执行的全局钩子脚本

5、对于目录内的多个脚本,按照字母的顺序执行,如果有非0退出的脚本,则钩子的执行停止

# file hooks

file hooks的触发事件与system hooks触发事件一样,但不同的是,file hooks是在这些事件触发后异步触发的。

对于omnibus安装的,file hooks默认目录为/opt/gitlab/embedded/service/gitlab-rails/file_hooks,脚本必须放在此目录中,子目录将被忽略,在此目录中,有一个example目录,里面存放了一些示例文件。

gile_hooks目录中的钩子脚本,必须可执行,且归git用户所有。

一般file hooks的日志目录为:gitlab-rails/file_hook.log

```
file hooks示例:
#!/bin/bash
return unless ARGS['event_name'] == 'project_create'
echo "project create" >> /tmp/gitlab.txt

检查file hooks是否可执行
gitlab-rake file_hooks:validate
```

# web hooks

webhook和system hook类似,都是在界面上创建,不同的是system hook是针对整个gitlab实例的,而web hook则针对具体的组或项目,并且web hook可以触发的事件类型也多于system hook。

web hook的创建方式与system hook相似,在组或项目的设置---webhooks中配置



## 模拟webhook接收器

system hook也可以用这个进行模拟接收器

```
vim hooks_test.rb

require 'webrick'

server = WEBrick::HTTPServer.new(ort => ARGV.first)
server.mount_proc '/' do |req, res|
  puts req.body
end

trap 'INT' do
  server.shutdown
end
server.start
```

```
/opt/gitlab/embedded/bin/ruby hooks_test.rb 8000

然后在webhook地址中配置http://ip:8000
如果接收器是在本地,需要在全局设置中开启webhook对本地网络的访问

回复

使用道具 举报

意见建议

Email:forum@gitlab.cn
  • 关注公众号
  • 添加专业顾问
Copyright © 2001-2026 极狐GitLab论坛 版权所有 All Rights Reserved. 鄂ICP备2021008419号-1|鄂公网安备42018502006137号
关灯 快速发帖
扫一扫添加专业顾问
返回顶部
快速回复 返回顶部 返回列表