[分享]极狐GitLab如何使用git server hook

1. GitLab hooks 简介

  • Git 等版本控制系统能在特定事件发生时触发自定义动作,这样的功能叫 hooks(钩子);
  • GitLab 不仅支持 Git hooks,也支持其它 hooks;

2. Server hooks

  • GitLab server hooks 是 Git server hooks,包括:
    • pre-receive:处理客户端的推送时,最先被调用;
    • update:与 pre-receive 类似,但如果同时向多个分支推送,pre-receive 只运行一次,update 则会在每个分支上运行;
    • post-receive:在整个过程完结以后运行;
  • Server hooks 可以配置给单个项目,也可以配置给全局服务器,执行顺序是:
    • GitLab 内置的 server hooks
    • <project>.git/custom_hooks/<hook_name>:项目钩子
    • <project>.git/custom_hooks/<hook_name>.d/*:项目钩子
    • <custom_hooks_dir>/<hook_name>.d/*: 全局钩子
      • Omnibus 安装的默认是 /opt/gitlab/embedded/service/gitlab-shell/hooks/<hook_name>.d/*
      • 源代码安装的默认是 /home/git/gitlab-shell/hooks/<hook_name>.d/*
  • Server hooks 必须在服务器文件系统上配置;
  • Server hooks 支持部分环境变量
    • 其中,GIT_PUSH_OPTION_<i> 变量可以接受 git 客户端通过 push options 传递的值;

一个简单的 pre-receive 钩子:

#!/bin/bash
echo "Hi $GL_USERNAME, this is a test pre-receive hook!"
echo $GIT_PUSH_OPTION_0

而全局hooks可以在gitlab.rb中定义

gitaly['custom_hooks_dir'] = "/var/opt/gitlab/gitaly/custom_hooks"

你好,我配置 * <project>.git/custom_hooks/<hook_name>:目录配置了pre-receive,并且将文件设置为git用户组和用户,但是它并没有生效,我使用的是Version v16.0.5-jh你能给我一些思路或者建议排查问题吗