谈谈为公司研发设计的git钩子定制规范

本文分享了在公司内部实施Git分支和标签命名规范的过程,包括需求背景、分析步骤、设计思路、Git钩子选择及脚本分析。通过定制化的Git钩子,实现了对分支和标签的自动校验,确保代码管理和版本控制的一致性和规范性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、需求背景
就目前公司,拆分四条业务线,每条业务线涉及服务达到十多个,开发版本迭代迅速,但是开发使用git的规范确是有点惨不忍睹,所以根据git框架提供的钩子定制了一套规范研发整体成员的约束规则。下面讲解下如何将需求进行拆分的

二、分析步骤

  1. 了解,调研研发成员使用git进行代码管理的习惯,根据习惯择其优势,去其糟粕
  2. 深入了解git提供的钩子的原理,选择符合自己公司发展的钩子进行使用
  3. 定制方案,整理自己的规范流程,脚本设计思路,进行评估
  4. 待方案最终落地,进行开发设计,实现这一套规范

三、讲解自己的设计思路

  1. 根据内部研发成员使用习惯,发现开发进行提测使用的是tag,分支仅作为开发设计代码的基线,而分支来源是从master上建立的
  2. 目前开发成员对tag、branch命名实在有点难看,不方便业务经理及各个成员进行良好的代码管理
  3. 所以针对tag、branch的名称都是自己要进行脚本校验的
  4. branch命名:分支前缀 - 业务线名称 - 服务名 - 部署环境 -日期号
  5. tag命名:分支前缀 - 业务线名称 - 服务名 - 部署环境 - 日期号 - 版本号

分支前缀:以feature、bugfix、hotfix、restructure、release命名顾名思义
业务线名称:实现CI通知业务经理进行代码review 服务名:实现CI通知业务经理进行提交服务的代码review
部署环境:由于公司版本迭代迅速,测试环境有多套,通知CI具体部署哪一套环境
日期号:确定创建分支,tag时间,避免多人开发同一个服务重名问题 版本号:branch,tag区分;开发进行版本迭代的标签

四、git钩子选择解析

  1. 由于git钩子框架提供比较多,分为本地git钩子、git服务端钩子
  2. 根据公司业务场景及需求,在本地Git钩子选取,commit-msg进行提交内容校验;在服务端选取pre-receive进行分支、tag命名校验,post-receive实现CI
  3. commit-msg文件存在本地git项目隐藏目录下:.git/hooks
  4. 服务端pre-receive、post-receive存在,git仓库中的,项目名.git目录下有个hooks文件
    在这里插入图片描述
    5.hooks文件是个软连接,指向gitlab下的hooks目录(由于本公司源码是通过gitlab进行管理的)
    6.hooks目录就是存放pre-receive、post-receive
    7.关于本地钩子校验、服务端钩子校验实现原理可参考以下链接

https://www.git-scm.com/book/zh/v2/自定义-Git-Git-钩子
https://www.jianshu.com/p/527e34f53b51?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

五、脚本分析

1.pre-revceive脚本校验内容

  • 校验:分支前缀 - 业务线名称 - 服务名 - 部署环境 - 日期号 分支前缀:
  • 获悉当前分支开发的功能方向
  • 业务线名称:获悉归属哪条业务线,触发邮件通知业务经理review代码
  • 服务名:获悉服务进行CI部署测试环境
  • 部署环境:根据编号部署具体哪套测试环境
  • 日期:了解分支创建时间
#!/bin/bash

function init(){
    echo -e  "\033[31;47m 分支校验异常,详细内容请参考:URL \033[0m"
}

#分支名头部校验
function headCheck(){
    if [ $headName == "feature" -o $headName == "hotfix" ];then
        echo "分支头校验正常"
    else
	init
        exit 1
    fi
}
#业务线名称校验
function businessCheck(){
    if [ $businessName == "sdk" -o $businessName == "eusdk" -o $businessName == "gamecat" -o $businessName == "wogame" ];then
        echo "业务线名称校验正常"
    else
        init
        exit 1
    fi
}
#服务名称校验
function serverCheck(){
    if [ $businessName == "sdk" -o $businessName == "gamecat" ];then
	value=`echo "${arrayGamecat[@]}"|grep -wq $serverName && echo true || echo false`
	if [ $value == true ];then
	    echo "$serverName服务名校验正常"
	else
	    init
	    exit 1
	fi
    elif [ $businessName == "eusdk" ];then
	value=`echo "${arrayEusdk[@]}"|grep -wq $serverName && echo true || echo false`
        if [ $value == true ];then
            echo "$serverName服务名校验正常"
        else
            init
            exit 1
        fi

    elif [ $businessName == "wogame" ];then
	value=`echo "${arrayWogame[@]}"|grep -wq $serverName && echo true || echo false`
        if [ $value == true ];then
            echo "$serverName服务名校验正常"
        else
            init
            exit 1
        fi
    fi
}

#环境校验
function environmentCheck(){
    value=`echo "${arrayEnv[@]}"|grep -wq $testNumber && echo true || echo false`
    if [ $value == true ];then
        echo "环境校验正常"
    else
        init
        exit 1
    fi
}

#日期校验
function dataCheck(){
    if [ ${#length} -ne 12 ];then
	init
	exit 1
    fi
    echo "日期校验正常"
}

#tag版本号校验
function tagVersionCheck(){
    value=`echo "${arrayTag[@]}"|grep -wq $1 && echo true || echo false`
    if [ $value == true ];then
        echo "tag版本号校验正常"
    else
        init
        exit 1
    fi
}

#初始化游戏猫服务数组
arrayGamecat=(base baseservice gamecatoms catapp gamecatmeng report androidsmsmonitor cat gamecatsdk util trade dashboard wechat uc statis tradetimer pack meng operation sensitiveword framework rocketmq gamecates gamecatmonitor packandroid bizdata cpsplatform commonlib)
#初始化EU服务数组
arrayEusdk=(HDSdkWeb HDSdkManage HDSdkRely framework manage-server apiserver pack capital channel tools registercenter task oms manage base statis utrade util demogateway omsstatis demobase)
#初始化Wogame服务数组
arrayWogame=(uc woapp register-center tools account biz trade statis oms timer womeng wosdk es common)
arrayEnv=(1 2 3)
#初始化tag版本
arrayTag=(v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15)

#获取输入流数据
read oldVersion newVersion branch;

echo ${oldVersion}
echo ${newVersion}
echo ${branch}

#获取tags或heads
tagOrHead=`echo $branch|awk -F"/" '{print $2}'`
#获取分支名
branchName=`echo $branch |awk -F"/" '{print $3}'`
#根据分支名获取分支头名
headName=`echo $branchName|awk -F"-" '{print $1}'`
#根据分支名获取服务名
serverName=`echo $branchName|awk -F"-" '{print $3}'`
#根据分支名获取业务线名
businessName=`echo $branchName|awk -F"-" '{print $2}'`
#根据分支名获取部署的测试环境
testNumber=`echo $branchName|awk -F"-" '{print $4}'`
#获取分支日期
length=`echo $branchName|awk -F"-" '{print $5}'`
#调用方法
if [ $tagOrHead == "heads" ];then
    headCheck
    businessCheck
    serverCheck
    environmentCheck
    dataCheck
else
    tagVersion=`echo $branchName|awk -F"-" '{print $6}'`
    headCheck
    businessCheck
    serverCheck
    environmentCheck
    dataCheck
    tagVersionCheck $tagVersion
fi

post-recevice脚本实现CI

  • 实时通知业务线经理review代码
  • 部署测试环境
#!/bin/env bash

#初始化邮箱变量
sdkMail=通知邮件人
gamecatMail=通知邮件人
wogameMail=通知邮件人

#初始化基础方法
function sendMail(){
    sendEmail 命令发送邮件通知收件人
}

function excuteJenkins(){
    curl -XG -s -u 用户名:密码"Jenkins远程构建URL"
}


#初始化方法
function sdk(){
    if [ $businessName == "sdk" ];then
	#推送邮件至SDK
	sendMail $sdkMail server
	#远程构建Jenkins部署测试环境
        if [ $testNumber -eq 1 ];then
	    echo "测试一套环境构建中"
	    excuteJenkins
            exit 0
	elif [ $testNumber -eq 2 ];then
	    echo "测试二套环境构建中"
	    excuteJenkins
            exit 0
	else
	    echo "测试三套环境构建中"
	    excuteJenkins
            exit 0
        fi

    elif [ $businessName == "eusdk" ];then
	#推送邮件至SDK
	sendMail $sdkMail eusdk
	#远程构建Jenkins部署测试环境
        if [ $testNumber -eq 1 ];then
            echo "融合一套环境构建中"
	    excuteJenkins
	    exit 0
	else
	    echo "融合二套环境构建中"
	    excuteJenkins
            exit 0
        fi
    fi
}

function Wogame(){
    if [ $businessName == "wogame" ];then
        #推送邮件至wogame
        sendMail $wogameMail wogame
        #远程构建Jenkins部署测试环境
        if [ $testNumber -eq 1 ];then
            echo "wogame环境构建中"
            excuteJenkins
 	    exit 0 
        else
            echo "testNumbe错误环境未构建"
        fi
    fi
}

function Gamecat(){
    if [ $businessName == "gamecat" ];then
	#推送邮件至游戏猫
	sendMail $sdkMail server
	#远程构建Jenkins部署测试环境
        if [ $testNumber -eq 1 ];then
            echo "测试一套环境构建中"
	    excuteJenkins
            exit 0
        elif [ $testNumber -eq 2 ];then
            echo "测试二套环境构建中"
	    excuteJenkins
            exit 0
        else
            echo "测试三套环境构建中"
	    excuteJenkins
            exit 0
        fi
    fi
}

read oldVersion newVersion branch

#获取tags或heads
tagOrHead=`echo $branch|awk -F"/" '{print $2}'`
#获取分支名
branchName=`echo $branch |awk -F"/" '{print $3}'`
#根据分支名获取服务名
serverName=`echo $branchName|awk -F"-" '{print $3}'`
#根据分支名获取业务线名
businessName=`echo $branchName|awk -F"-" '{print $2}'`
#根据分支名获取部署的测试环境
testNumber=`echo $branchName|awk -F"-" '{print $4}'`
#调用方法
if [ $tagOrHead == "tags" ];then
    sdk
    Gamecat
    Wogame
fi

六、流程
在这里插入图片描述

以上内容不喜勿喷,共勉!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值