Git每次提交代码都需要写commit message,否则就不允许提交。一般来说,commit message应该清晰明了,说明本次提交的目的,具体做了什么操作……但是在日常开发中,大家的commit message千奇百怪,中英文混合使用、fix bug等各种笼统的message司空见怪,这就导致后续代码维护成本特别大,有时自己都不知道自己的fix bug修改的是什么问题。基于以上这些问题,我们希望通过某种方式来监控用户的git commit message,让规范更好的服务于质量,提高大家的研发效率。
初期我们在互联网上搜索了大量有关git commit规范的资料,但只有Angular规范是目前使用最广的写法,比较合理和系统化,并且有配套的工具(IDEA就有插件支持这种写法)。最后综合阿里巴巴高德地图相关部门已有的规范总结出了一套git commit规范。
commit message格式
<type>(<scope>): <subject>
type(必须)
用于说明git commit的类别,只允许使用下面的标识。
feat:新功能(feature)。
fix/to:修复bug,可以是QA发现的BUG,也可以是研发自己发现的BUG。
docs:文档(documentation)。
style:格式(不影响代码运行的变动)。
refactor:重构(即不是新增功能,也不是修改bug的代码变动)。
perf:优化相关,比如提升性能、体验。
test:增加测试。
chore:构建过程或辅助工具的变动。
revert:回滚到上一个版本。
merge:代码合并。
sync:同步主线或分支的Bug。
scope(可选)
scope用于说明 commit 影响的范围,比如数据层、控制层、视图层等等,视项目不同而不同。
例如在Angular,可以是location,browser,compile,compile,rootScope, ngHref,ngClick,ngView等。如果你的修改影响了不止一个scope,你可以使用*代替。
subject(必须)
subject是commit目的的简短描述,不超过50个字符。
建议使用中文(感觉中国人用中文描述问题能更清楚一些)。
fix(DAO):用户查询缺少username属性
feat(Controller):用户查询接口开发
以上就是我们梳理的git commit规范,那么我们这样规范git commit到底有哪些好处呢?
通常提出一个规范之后,为了大家更好的执行规范,就需要进行一系列的拉通,比如分享给大家这种规范的优点、能带来什么收益等,在大家都认同的情况下最好有一些强制性的措施。当然git commit规范也一样,前期我们分享完规范之后考虑从源头进行强制拦截,只要大家提交代码的commit message不符合规范,直接不能提交。但由于代码仓库操作权限的问题,我们最终选择了使用webhook通过发送警告的形式进行监控,督促大家按照规范执行代码提交。除了监控git commit message的规范外,我们还加入了大代码量提交监控和删除文件监控,减少研发的代码误操作。
整体流程
webhook是作用于代码库上的,用户提交git commit,push到仓库的时候就会触发webhook,webhook从用户的commit信息里面获取到commit message,校验其是否满足git commit规范,如果不满足就发送告警消息;如果满足规范,调用gitlab API获取提交的diff信息,验证提交代码量,验证是否有重命名文件和删除文件操作,如果存在以上操作还会发送告警消息,最后把所有记录都入库保存。
以上就是我们整个监控服务的相关内容,告警信息通过如下形式发送到对应的钉钉群里:
我们也有整体git commit的统计,统计个人的提交次数、不规范次数、不规范率等如下图:
git hooks分为客户端hook和服务端hook。客户端hook又分为pre-commit、prepare-commit-msg、commit-msg、post-commit等,主要用于控制客户端git的提交工作流。用户可以在项目根目录的.git目录下面配置使用,也可以配置全局git template用于个人pc上的所有git项目使用。服务端hook又分为pre-receive、post-receive、update,主要在服务端接受提交对象时进行调用。
以上这种采用webhook的形式对git commit进行监控就是一种server端的hook,相当于post-receive。这种方式并不能阻止代码的提交,它只是通过告警的形式来约束用户的行为,但最终不规范的commit message还是被提交到了服务器,不利于后面change log的生成。由于公司代码库权限问题,我们目前只能添加这种post-receive类型的webhook。如大家有更高的代码库权限,可以采用server端pre-receive类型的webhook,直接拒绝不规范的git commit message。只要git commit规范了,我们甚至可以考虑把代码和bug、需求关联等等。
本文系作者在时代Java发表,未经许可,不得转载。
如有侵权,请联系nowjava@qq.com删除。