git钩子函数拦截提交

Git+Maven+Sonar实现提交代码前进行代码的质量检查
一、前言
为了规范代码质量 , 使开发人员写出更高质量的代码 , 实践了一下git-hooks中的pre-commit钩子 , 可以在提交代码时强制校验本地代码质量 , 若不符合指定规则不给予代码的提交 。
二、git的钩子hook 介绍
和其它版本控制系统一样 , Git 能在特定的重要动作发生时触发自定义脚本 。有两组这样的钩子:客户端的和服务器端的 。客户端钩子由诸如提交和合并这样的操作所调用 , 而服务器端钩子作用于诸如接收被推送的提交这样的联网操作 。你可以随心所欲地运用这些钩子 。
钩子都被存储在 Git 目录下的 hooks 子目录中 。也即绝大部分项目中的 .git/hooks , 默认存在的都是示例 , 其名字都是以 .sample 结尾 , 如果你想启用它们 , 得先移除这个后缀 。把一个正确命名且可执行的文件放入 Git 目录下的 hooks 子目录中 , 即可激活该钩子脚本 。这样一来 , 它就能被 Git 调用 。
本次方案实现效果就是通过pre-commit钩子实现 。
【git钩子函数拦截提交】三、sonar的介绍
Sonar是一个用于代码质量管理的开源平台 , 用于管理源代码的质量 , 可以从七个维度检测代码质量 。
通过插件形式 , 可以支持包括java,C#,C/C++,PL/SQL,Cobol,JavaScrip,Groovy等等二十几种编程语言的代码质量管理与检测 。
3.1、sonar支持的客户端
除了数据库和web服务器之外 , Sonar还有很重要的一部分:客户端 。客户端使用具体的程序工具进行分析 , 不同的语言 , 不同的项目构建类型可以使用不同的客户端程序 。
Sonar提供很多类型的客户端:

客户端说明Sonar Runner推荐默认客户端Maven如果项目使用Maven构建推荐使用此种方式Ant如果项目使用ant构建则推荐CI Engine持续集成 , 比如Hudson , Jenkins
本次正是通过Maven插件方式实现sonar扫描 。
四、正文
4.1、在Java项目配置pom.xml
4.1.1、pom.xml中增加如下插件
4.1.2、该插件可以使得在install以后在git本地仓库的.githooks目录下生成一份自定义的pre-commit文件 , 该文件是git进行提交代码执行的钩子函数 , 函数内容在插件pre-commit中可以编写 , 如下图:
4.1.2、在pom文件继续添加sonar相关的插件
该插件能够使项目通过sonar:sonar命令实现项目的sonar扫描 , 其中sonar.login为登陆的token , sonar.host.url为sonar服务的URL , sonar.projectKey为自定义的项目Key(可选)
获取token的办法 , 首先通过登录sonar服务器 , 再如下图操作:
五、结果验证
如图所示 , 通过maven sonar:sonar命令可以对项目执行代码质量扫描 , 如果出现如下结果证明这个sonar插件有效 。
再打开sonar WBE端查看 , 可以看到项目的报告已经生成 。
四、尝试git提交代码执行sonar
4.1、首先要通过mvn install 命令把钩子脚本生成 。
假设install项目成功了 , 打开项目所在的.githooks 目录查看 , 将看到pre-commit 文件 , 打开文件查看会发现所编写的脚本内容正是在githook-maven-plugin插件编写的shell脚本内容 , 此时证明该插件已经生效 。
可以看到上图的脚本内容一致 。
4.2、尝试提交有异常的代码:
在方法里面提交有问题的代码进行测试 。
把有问题的代码进行提交 , 因为替换了pre-commit文件, 所以在代码提交前会执行pre-commit里面的脚本 , 脚本首先通过对代码进行 mvn sonar:sonar 命令操作 , 然后再调用shell命令curl获取sonar的扫描报告 , 根据报告判断是否可以提交代码(详细查看具体的shell脚本实现)
可以看到没有办法提交 , 符合设计 。
再看正常代码的情况
把错误代码注释掉 , 再次提交
报告为正常 , 可以正常提交 。