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還有很重要的一部分:客戶端 ??蛻舳耸褂镁唧w的程序工具進行分析 , 不同的語言 , 不同的項目構建類型可以使用不同的客戶端程序 。
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腳本實現)
可以看到沒有辦法提交 , 符合設計 。
再看正常代碼的情況
把錯誤代碼注釋掉 , 再次提交
報告為正常 , 可以正常提交 。