运维篇(二):git hooks之pre-receive脚本校验日志格式

一般公司项目都有固定的日志格式,一来方便回溯问题,二来美观,便于后续的一些任务触发等。鉴于公司的特殊的日志格式,利用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()

后记

此脚本具有针对性,可借鉴参考,具体要根据自己项目的格式来修改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值