一般公司项目都有固定的日志格式,一来方便回溯问题,二来美观,便于后续的一些任务触发等。鉴于公司的特殊的日志格式,利用gitlab默认的git hooks进行日志校验,日志格式不正确直接被拒绝提交。
Hooks脚本
在xxx/git-data/repo…/@hash/xxx.git/目录下创建custom_hooks文件夹,在文件夹里创建pre-receive文件,不要后缀名(此目录为docker按照gitlab项目的映射目录)
#!/bin/bash
validate_ref()
{
# --- Arguments
oldrev=$(git rev-parse $1)
newrev=$(git rev-parse $2)
refname="$3"
commitList=`git rev-list $oldrev..$newrev`
echo '****************'
echo $commitList
echo '****************'
split=($commitList)
rm -rf target.txt
for s in ${split[@]}
do
#echo $s
echo $s >>./target.txt
msg=`git cat-file commit $s | sed '1,/^$/d'`
echo $msg
python3 pre-receive.py "$msg"
if [ $? -eq 1 ]; then
exit 1
fi
done
#python3 scp.py
#cp target.txt /home/gitlab/target.txt
exit 0
}
if [ -n "$1" -a -n "$2" -a -n "$3" ]; then
PAGER= validate_ref $2 $3 $1
else
while read oldrev newrev refname
do
validate_ref $oldrev $newrev $refname
done
fi
上述脚本用于拦截日志,然后交给python脚本去处理
日志校验脚本
# !/usr/bin/env python3
# _*_ coding:utf-8 _*_
"""
@createTime : 2021/11/1 10:23
@Author : waldeincheng
"""
import os
import re
import sys
# TODO
# 第一步,截取出message信息,判断message符不符合规范,整体跟svn差不多
# 截取提交message信息
class PushCodeReview:
def __init__(self):
pass
def log_verify(self):
# print('********************argv*****************')
#print(sys.argv[1])
log = sys.argv[1]
#print('*****************************************')
#log = ['【问题描述】:test\n【提交类型】:BUG\n【对应版本】:ALL\n【问题单号】:Fix Bug #222\n【问题原因】:test\n【修改方案】:test\n【自测过程】:自测ok\n【是否必现】:否\n【发布说明】:否'][0]
if re.search('【问题描述】:.+\n【提交类型】:.+\n【对应版本】:.*\n【问题单号】:.+\n【问题原因】:.+\n【修改方案】:.+\n【自测过程】:.+\n【是否必现】:.+\n【发布说明】:.+',log):
result = log.split('\n')
desc,submitType,platform,pro_id,reason,solved,test,isSeed,isPublish = result
# 日志的详细信息处理
# 提交类型
if not re.fullmatch('BUG|LDOC|任务|需求修改|版本升级|代码整理|解决编译不过|阶段性提交|追加提交',submitType[7:]):
print('提交类型错误\n')
self.error_report()
sys.exit(1)
# 对应版本
if not re.fullmatch('AT|Lua|ALL|CSDK',platform[7:]):
print('对应版本错误\n')
self.error_report()
sys.exit(1)
# 问题单号
if not re.search('Finish|Start|Effort|Fix',pro_id[7:]):
print('问题单号错误\n')
self.error_report()
sys.exit(1)
# 是否必现
if not re.fullmatch('是|否',isSeed[7:]):
print('自测过程错误\n')
self.error_report()
sys.exit(1)
# 发布说明
if not re.fullmatch('是|否',isPublish[7:]):
print('发布说明错误\n')
self.error_report()
sys.exit(1)
else:
print('提交格式错误,请检查格式')
self.error_report()
sys.exit(1)
sys.exit(0)
def error_report(self):
print('正确格式为:')
print("""
【问题描述】:问题描述,对外发布说明,非研发人员能看懂的内容
【提交类型】:BUG/任务/LDOC/需求修改/版本升级/代码整理/解决编译不过/阶段性提交/追加提交
【对应版本】:ALL/AT/Lua/CSDK
【问题单号】:Fix Bug #1 / Finish Task #1 Cost:10h
【问题原因】:问题出现的原因,如果是BUG 必须填写
【修改方案】:问题修改的方案,如果是BUG 必须填写
【自测过程】:自测的过程
【是否必现】:是/否
【发布说明】:是/否(是,会添加到发布说明)""")
if __name__ == '__main__':
demo = PushCodeReview()
demo.log_verify()
后记
此脚本具有针对性,可借鉴参考,具体要根据自己项目的格式来修改