马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
×
# 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对本地网络的访问
|