gitlab pre-receive钩子

概述

当我们需要对git提交的相关内容做校验时,可以使用服务端的pre-receive钩子。相对于客户端的pre-commit钩子来说,它便于统一管理维护。pre-commit需要将处理脚本添加到客户端代码仓库的.git/hooks目录下,当clone后需要重新进行添加,所以通常采用服务端的pre-receive来替代。

pre-receive可以对push的内容做校验,如果校验脚本正常退出(exit 0)即允许push,反之会拒绝客户端进行push操作。

服务端配置

  • 查看hooks脚本路径
sudo vi /etc/gitlab/gitlab.rb
#gitlab_shell['custom_hooks_dir'] = "/opt/gitlab/embedded/service/gitlab-shell/hooks"
$ll
total 12
-rwxr-xr-x 1 root root 686 Jan  3 07:42 post-receive
-rwxr-xr-x 1 root root 296 Jan  7 19:05 pre-receive
-rwxr-xr-x 1 root root 593 Jan  3 07:42 update

pre-receive脚本可以是shell、python、ruby等任何可执行脚本,需要注意它的权限。pre-receive钩子会从标准输入获取三个参数:旧版本号,新版本号,分支。同时还提供了内置的许多环境变量可以使用,详情可以参考官方文档。

  • 编写脚本
    这里以校验提交内容为例给出示例脚本,仅供参考,更多的示例请查看官方示例。
#!/bin/bash

while read oldVersion newVersion branch; do
    echo ${oldVersion}
    echo ${newVersion}
    echo ${branch}

    diff=`git diff --name-status $oldVersion $newVersion`
    echo $diff

    for file in $diff
    do
        if [ "${#file}" -lt "2" ];then
            continue
        fi
        echo $file

        diffContent=`git show $newVersion:test.txt`
        echo $diffContent
        #对diff文件内容做校验,如果不符合条件则exit -1
    done
done

exit 0

你可能感兴趣的:(gitlab pre-receive钩子)