web-hook
一.系统级的
二.项目级的
创建 hook 文件
自定义脚本目录要符合
<custom_hooks_dir>/<hook_name.d>/*
的规范。具体来说就是:
- 在自定的
custom_hooks_dir
目录下可创建三个文件夹对应三类server hook name
:
- pre-receive.d
- update.d
- post-receive.d
- 在每个文件夹下可创建任意文件,在对应的 hook 时期,gitlab 就会主动调用
- 文件名以
~
结尾的文件会被忽略- 如果想看这部分的实现细节可以看
<gitlab-shell>/lib/gitlab_custom_hook.rb
文件目录结构示意:
[root@localhost custom_hooks]# tree . ├── post-receive.d │ ├── 01.sh │ └── 02.sh~ ├── pre-receive.d │ ├── 01.sh │ ├── 02.py │ └── 03.rb └── update.d ├── 01.sh └── 02.sh
4. 编写 hook 脚本
Hook 脚本就是 git 自身的规范,写 shell、python、ruby 都可以。
留意脚本最后的退出值:0 正常退出,用户可以 push;非 0 异常退出,中断提交(pre-receive 和 update) 。
作者:zvving
链接:http://www.jianshu.com/p/5531a21afa68
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
服务器端的hook
直接修改项目.git/hooks下对应的钩子文件或/opt/gitlab/embedded/service/gitlab-shell/hooks/pre-receive.d/1.py中
比如限制以b-或r-开头的分支禁止提交到远端仓库
增加1.py,内容如下: ----------------------注意原来默认的/opt/gitlab/embedded/service/gitlab-shell/hooks/pre-receive不能动,不然分支保护和TAG保护功能将失效
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import fileinput
# 读取用户试图更新的所有引用
for line in fileinput.input():
if line.split()[2].split('/')[1]=='heads':
branch_name=line.split()[2].split('/')[2]
# print branch_name[0:2]
if branch_name[0:2]=='b-' or branch_name[0:2]=='r-':
print "禁止以b-或r-开头命名分支"
sys.exit(1)
参考:https://github.com/geeeeeeeeek/git-recipes/wiki/5.4-Git-%E9%92%A9%E5%AD%90%EF%BC%9A%E8%87%AA%E5%AE%9A%E4%B9%89%E4%BD%A0%E7%9A%84%E5%B7%A5%E4%BD%9C%E6%B5%81
注意:不能直接对项目.git/hooks下或/opt/gitlab/embedded/service/gitlab-shell/hooks中的钩子进行修改,会影响现有功能,比如修改pre-receive会导致分支保护和tag保护功能失效。还有就是管理员角色不受分支保护的限制:)