一、需求背景
就目前公司,拆分四条业务线,每条业务线涉及服务达到十多个,开发版本迭代迅速,但是开发使用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/bashfunction init(){echo -e  "\033[31;47m 分支校验异常,详细内容请参考:URL \033[0m"
}#分支名头部校验
function headCheck(){if [ $headName == "feature" -o $headName == "hotfix" ];thenecho "分支头校验正常"elseinitexit 1fi
}
#业务线名称校验
function businessCheck(){if [ $businessName == "sdk" -o $businessName == "eusdk" -o $businessName == "gamecat" -o $businessName == "wogame" ];thenecho "业务线名称校验正常"elseinitexit 1fi
}
#服务名称校验
function serverCheck(){if [ $businessName == "sdk" -o $businessName == "gamecat" ];thenvalue=`echo "${arrayGamecat[@]}"|grep -wq $serverName && echo true || echo false`if [ $value == true ];thenecho "$serverName服务名校验正常"elseinitexit 1fielif [ $businessName == "eusdk" ];thenvalue=`echo "${arrayEusdk[@]}"|grep -wq $serverName && echo true || echo false`if [ $value == true ];thenecho "$serverName服务名校验正常"elseinitexit 1fielif [ $businessName == "wogame" ];thenvalue=`echo "${arrayWogame[@]}"|grep -wq $serverName && echo true || echo false`if [ $value == true ];thenecho "$serverName服务名校验正常"elseinitexit 1fifi
}#环境校验
function environmentCheck(){value=`echo "${arrayEnv[@]}"|grep -wq $testNumber && echo true || echo false`if [ $value == true ];thenecho "环境校验正常"elseinitexit 1fi
}#日期校验
function dataCheck(){if [ ${#length} -ne 12 ];theninitexit 1fiecho "日期校验正常"
}#tag版本号校验
function tagVersionCheck(){value=`echo "${arrayTag[@]}"|grep -wq $1 && echo true || echo false`if [ $value == true ];thenecho "tag版本号校验正常"elseinitexit 1fi
}#初始化游戏猫服务数组
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" ];thenheadCheckbusinessCheckserverCheckenvironmentCheckdataCheck
elsetagVersion=`echo $branchName|awk -F"-" '{print $6}'`headCheckbusinessCheckserverCheckenvironmentCheckdataChecktagVersionCheck $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#推送邮件至SDKsendMail $sdkMail server#远程构建Jenkins部署测试环境if [ $testNumber -eq 1 ];thenecho "测试一套环境构建中"excuteJenkinsexit 0elif [ $testNumber -eq 2 ];thenecho "测试二套环境构建中"excuteJenkinsexit 0elseecho "测试三套环境构建中"excuteJenkinsexit 0fielif [ $businessName == "eusdk" ];then#推送邮件至SDKsendMail $sdkMail eusdk#远程构建Jenkins部署测试环境if [ $testNumber -eq 1 ];thenecho "融合一套环境构建中"excuteJenkinsexit 0elseecho "融合二套环境构建中"excuteJenkinsexit 0fifi
}function Wogame(){if [ $businessName == "wogame" ];then#推送邮件至wogamesendMail $wogameMail wogame#远程构建Jenkins部署测试环境if [ $testNumber -eq 1 ];thenecho "wogame环境构建中"excuteJenkinsexit 0 elseecho "testNumbe错误环境未构建"fifi
}function Gamecat(){if [ $businessName == "gamecat" ];then#推送邮件至游戏猫sendMail $sdkMail server#远程构建Jenkins部署测试环境if [ $testNumber -eq 1 ];thenecho "测试一套环境构建中"excuteJenkinsexit 0elif [ $testNumber -eq 2 ];thenecho "测试二套环境构建中"excuteJenkinsexit 0elseecho "测试三套环境构建中"excuteJenkinsexit 0fifi
}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" ];thensdkGamecatWogame
fi

六、流程

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

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

  1. 使用PHPCS+GIT钩子保障团队开发中代码风格一致性实践

    版权声明:作者:汤青松 https://blog.csdn.net/u013431141/article/details/81589312 一.背景 笔者在6月份加入新团队,新团队这边刚组建起来,基础 ...

  2. git-cz git commit 定制提交规范

    git commit规范定制 步骤1: 安装 commitizen cz-emoji(表情符) npm i commitizen cz-emoji --save 步骤2:打开package.json ...

  3. 自定义 Git - Git 钩子 (自动部署)

    Git 钩子 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 和其它版本控制系统一样,Git 能在特定的重要动作发生时触发自定义脚本. 有两组这样的 ...

  4. 405 宝塔钩子_宝塔面板webhook配合gitlab完成git钩子的搭建

    宝塔面板webhook配合gitlab完成git钩子的搭建 我们假设你了解了gitlab的webhook的设置.熟悉宝塔面板并会安装宝塔webhook. 如果还没掌握,请自行去了解. 一.在宝塔面板中 ...

  5. git钩子放服务器_如何使用Git 钩子来自动化开发和部署任务

    介绍 版本控制已成为现代软件开发的中心要求. 它允许项目安全地跟踪更改,启用撤销,完整性检查和协作等好处. 在git的版本控制系统,特别是,已由于其分散式架构,并在它可以使和转让方之间变化的速度看到广 ...

  6. Git钩子脚本可以和存储库一起管理吗?

    本文翻译自:Can Git hook scripts be managed along with the repository? We'd like to make a few basic hook ...

  7. 谈谈IT公司员工猝死和IT公司的加班文化

    谈谈IT公司员工猝死和IT公司的加班文化 网上最近流行调侃996ICU的段子,其实这个段子也算是IT行业的真实写照吧 我个人觉得,想要赚更多的钱这是人之常情,无可厚非,但是高收入自然意味着要付出更多的 ...

  8. [衣裳饰品]谈谈西装、手工西装和西装定制_时尚资讯_天涯论坛

    [衣裳饰品]谈谈西装.手工西装和西装定制_时尚资讯_天涯论坛 [衣裳饰品]谈谈西装.手工西装和西装定制_时尚资讯_天涯论坛 [衣裳饰品]谈谈西装.手工西装和西装定制 [已扎口] posted on 2 ...

  9. Hello Git(六)——Git钩子

    一.Git钩子简介 与其它版本控制系统相同,Git也可以在特定的重要动作发生时触发自定义脚本.Git有两种类型的钩子:客户端钩子和服务器端钩子.客户端钩子由诸如提交和合并等操作所调用,而服务器端钩子作 ...

最新文章

  1. 我是如何有效的避免测试漏测?
  2. 随机密码生成python_每日一课 | Python 中生成 0 到 9 之间的随机整数
  3. [转]C#综合揭秘——细说多线程(上)
  4. 最小生成树计数(HYSBZ-1016)(加强版实现)
  5. 互联网服务应用协议设计
  6. 包教会一对一跟着CNS学单细胞测序(含空间转录组、chipseq、RNAseq、Atacseq 和外显子等)3月13日开始...
  7. 为什么 战舰stm32f103开发板32.768k晶振没有接电容
  8. vue 父循环怎么拿子循环中的值_Vue 父组件循环使用refs调用子组件方法出现undefined的问题...
  9. python新手常犯的17个错误
  10. J2EE开发系列教程-J2EE视频教程 实例
  11. 千元喜提“随身影院”荣耀8x Max,告诉你移动刷剧是种什么体验?
  12. Netty权威指南电子版(不要积分点个赞就好)
  13. python股票量化如何选股?
  14. win11家庭版 安卓虚拟机
  15. JavaScript — 浏览器事件、冒泡和捕获、事件委托
  16. 【Git】回退 commit 版本详解
  17. Yii Framework 开发教程(29) Zii组件-Menu 示例
  18. 硬件工程师成长之路(11)——职业规划
  19. Android ExpandableListView 展开列表控件(手机QQ好友列表)
  20. android模拟打印机服务,Android下的POS打印机调用的简单实现

热门文章

  1. 树莓派53/100 - Pico小车v4版本,蓝牙、陀螺仪之后,再加上OLED显示屏
  2. Python PyMuPDF 提取PDF文件中的图片到指定目录保存,PDF将每一页都保存为图片
  3. Markdown中图片转PDF之后图片不能显示的问题(已解决)
  4. Spring IOC中的Bean对象
  5. Spring-Bean的作用域-Singleton
  6. 任正非鸿蒙不是手机系统,任正非称华为鸿蒙暂无计划用于手机 2019华为开发者大会什么时间召开?有何看点?...
  7. python程序设计教程杨年华_Python程序设计教程(21世纪高等学校计算机应用技术规划教材)...
  8. 除了交叉验证之外的lgm代码
  9. python代码提示expected_Expected conditions模块使用方法汇总代码解析
  10. PHP Monolog 日志的使用