【DEVOPS】借助GitLab全局Hook规范化提交日志

在GitLab中实现提交日志规范的检查。

1. 前言

因为自身的业务特点,以及Git流行程度的不断增长,领导层终于下定决心进行相关试点。于是过去数年我们在SVN上的一些沉淀(例如 【DEVOPS】借助SvnChecker实现SVN提交日志规范的落地)相应地也需要复制到Git上来。这其中有关提交日志规范的检查首当其中。

借助GitLab提供的Server端 pre-commit Hook,我们希望实现:

  1. 日志格式必须满足约定的格式,否则提交失败。
  2. 提交日志中涉及到的Zentao Id必须真实存在,否则提交失败。

本文意在介绍解决方案,因此介绍性内容到此为止,直接进入正题。

2. pre-commit Hook实现

相关Python实现代码如下:

import re
from urllib import urlopen
import json
import os
import sys
import subprocess

def _formatErrorInfo(errorInfo):
    return ("日志格式存在问题: " + errorInfo) #.decode("utf-8").encode("gbk")



# 遵循"小步快跑"的原则,我们决定小范围试点
#	非试点项目不进行检验
# GitLab回调Hook前,会向环境变量中插入一些Git相关信息,python下我们可以使用如下方式进行读取, 以辅助我们的一些需求
if not "joint3.0" in os.getenv("GL_PROJECT_PATH"):
  exit(0)

#Format: "oldref newref branch"
line = sys.stdin.read()
(base, commit, ref) = line.strip().split()
# 全新分支将以00000为commit Id, 但笔者遇到的情况并不完全是这样, 因此这里取消这条判断
new_branch_push = False # re.match(r'[^1-9]+', base)
# 被删除的分支 commit Id 也为 00000, 这里也去掉
branch_deleted = False # re.match(r'[^1-9]+', commit)

contains_commit_msg = False
MSG_TIP = ""

if not new_branch_push:
    revs = base + "..." + commit
    proc = subprocess.Popen(['git', 'rev-list','--oneline','--first-parent', revs], stdout=subprocess.PIPE)
    lines = proc.stdout.readlines()

    if lines:
        #for line in lines:
        (msg, flag) = _analysisCommitMsg(lines)
        if flag == 0 :
          contains_commit_msg = True
        else:
          MSG_TIP = msg

if contains_commit_msg or new_branch_push or branch_deleted:
    exit(0)
else:
    print MSG_TIP
    exit(1)

关于Zentao ID存在性的验证,还请参考笔者之前写过的【DEVOPS】借助SvnChecker实现SVN提交日志规范的落地 。

安装以上pre-commit Hook

笔者所使用的GitLab版本为 CE 12.9.4 。读者请先确认版本的差异。

  1. 修改 /etc/gitlab/gitlab.rb 配置文件中的配置项:gitlab_shell[‘custom_hooks_dir’] = “/opt/gitlab/embedded/service/gitlab-shell/hooks” 。 这一步最简单的操作就是启用这一行配置。去掉这一行配置前面的 # 。

  2. 执行以下命令重新编译GitLab以让配置生效。

    # 注意以下两步耗时还是比较长的,切勿急躁。
    sudo gitlab-ctl reconfigure
    sudo gitlab-ctl restart
    
  3. 在自定的 custom_hooks_dir 目录(即我们的custom_hooks目录)下可创建文件夹pre-receive.d,涉及到的规则如下:
    a. 文件夹下可创建任意文件,在对应的 hook 时期,gitlab 就会主动调用
    b. 文件名以 ~ 结尾的文件会被忽略

  4. 将第二步编写的 pre-commit 文件拷贝到文件夹pre-receive.d中,并赋权(这一步很重要,如果你发现脚本没有正确被调用,那千万记得检查一下权限)。

4. LInks

  1. GitLab - Server hooks
  2. How do I require specific text in a git commit message?
  3. python脚本实现git commit hooks钩子
  4. Gitlab基于git-hooks做checkstyle代码检测
  5. 【DEVOPS】借助SvnChecker实现SVN提交日志规范的落地

你可能感兴趣的:(DevOps,git,svn,python,DEVOPS,代码规范)