Gitlab 创建钩子文件

2024/05/05 19:14 下午 posted in  服务器

gitlab社区版本不能在直接后台设置git的一些提交限制,比如限制邮箱的校验等,所以就只能单独仓库设置钩子文件,并批量的放置在所有的仓库下。

按理由,基于钩子文件可以做很多限制。

查看项目库路径

使用控制台获取项目被加密的项目库路径

gitlab-rails console
project = Project.find_by_full_path('techcenter/saas/commonapi')
puts project.disk_path

设置钩子

1. 创建文件pre-receive 钩子文件

#!/bin/bash
RED='\033[0;31m' # 定义红色
NC='\033[0m' # 无色(用于重置颜色)

while read oldrev newrev refname; do
  # 检查是否是删除分支的操作
  if [ "$newrev" = "0000000000000000000000000000000000000000" ]; then
    # 允许删除分支操作
    echo "分支删除操作被允许"
    continue
  fi

  author_email=$(git log -1 --pretty=format:"%ae" $newrev)
  if [[ ! $author_email =~ ^[a-zA-Z0-9._%+-]+@example\.cn$ ]]; then
    echo -e "\n\n${RED}提交被拒绝,因为提交邮箱不符合规定。请使用公司邮箱${NC}"
    echo -e "${RED}git config --global user.name  '你的名字'${NC}"
    echo -e "${RED}git config --global user.email '公司邮箱'${NC}\n\n"
    exit 1
  fi
done

2. 赋予权限+x

chmod +x pre-receive
# 可能得话 还需要分配用户组
chown -R git:git custom_hooks

3.设置批量给项目设置钩子的脚本

#!/bin/bash

# 钩子脚本的通用位置
global_hook_path="/opt/gitlab-global-hooks/pre-receive"

# GitLab仓库的根目录
repo_root="/data/gitdata/repositories/@hashed" # 此目录按实际目录

# 遍历所有.git仓库目录
find "$repo_root" -type d -name "*.git" | while read repo; do
    # 定义custom_hooks目录路径
    custom_hooks_dir="$repo/custom_hooks"

    # 定义将要创建的软连接的目标路径
    hook_symlink_path="$custom_hooks_dir/pre-receive"

    # 检查custom_hooks目录是否存在,不存在则创建
    [ ! -d "$custom_hooks_dir" ] && mkdir -p "$custom_hooks_dir" && chown git:git "$custom_hooks_dir"

    # 检查钩子软连接(或文件)是否已经存在
    if [ ! -e "$hook_symlink_path" ]; then
        # 创建软连接
        ln -s "$global_hook_path" "$hook_symlink_path"
        echo "Created symlink for $hook_symlink_path"
    else
        echo "Hook already exists for $repo, skipping..."
    fi
done