DevOps的Build階段,以Java作爲主力開發語言的公司基本都會選擇使用Jenkins來做CI,雖然Jenkins提供了CheckStyle,以及新一代的替代品Warnings Next Generation插件來做代碼質量靜態檢查,但正如軟件開發領域的一句流傳甚廣的格言 —— “離錯誤越近,修復成本越低”,如果能夠將靜態檢查的時機進一步提前,那麼不論對於統一公司代碼規範,維繫代碼庫中代碼質量,以及提升員工素養等都是相當具有裨益的。
1. 概述
“代碼的規範性與軟件缺陷是有緊密聯繫的,質量高的代碼將直接提高軟件的質量”。相信每一個軟件企業的研發部門都有類似於《XX語言開發規範》的文檔,但究竟有多少人會去認真閱讀、喫透其中的每一條款,並把其做爲代碼書寫的“聖經”來對待(稍有違反規範的代碼將及時重寫)?我們需要“用技術手段去解決技術問題”。讓我們在最關鍵的環節—代碼倉庫SVN—“做手腳”。讓不符合團隊代碼規範的代碼不會出現在代碼倉庫中,這將使程序員無法迴避“自己所犯的錯誤”。
本文將藉助 SVNChecker + CheckStyle來完成以上設想,把好代碼質量保證的第一關。
筆者的測試環境爲Windows Server 2008 64位。
2. 步驟
2.1 安裝
2.1.1 安裝Python
- 從 Python下載地址 中下載相應的Python2.x版本(注意這裏不要下載Python3.x)。另外如果覺得上述鏈接下載比較慢,可以使用下面這個國內鏈接Python2.7.6。注意下載對應位數的Python版本。
- 在SVN所在服務器上安裝第一步下載的Python,並配置相應的環境變量。筆者本次直接選擇了默認安裝目錄"C:\Python27"。
2.1.2 安裝svnchecker-0.3
- 從svnchecker-0.3下載地址中下載 “svnchecker-0.3.zip”,注意直接下載此壓縮包即可,免去你安裝exe時候可能出現的"no python installation found in the registry"問題。
- 下載之後直接解壓即可。
2.1.3 安裝CheckStyle
- 從CheckStyle下載地址 中挑選你想要的版本,這裏注意下載 checkstyle-x.xx-all.jar版本的,一勞永逸。
- 下載之後放到任意目錄下備用。
2.2 配置
2.2.1 配置svnchecker
-
修改
svnchecker-0.3\modules\Transaction.py
文件。增加如下代碼:def __executeSVN(self, command, arg = "", split=False): command = "svnlook --%s %s %s %s %s" % (self.type, self.txnName, command, self.reposPath, arg) # 增加下面這一行, 注意python對於格式的嚴格要求 # command前面的空格不能使用 Tab 來填充. command = command.replace('svnlook','%svnlook%')
-
修改
svnchecker-0.3\checks\Checkstyle.py
文件,增加如下代碼:files = [transaction.getFile(oneFile[0]) for oneFile in files.iteritems() if oneFile[1] in ["A", "U", "UU"]] # 增加下面這兩行代碼, 依然要注意空格以及對齊的問題 if len(files) == 0: return ("",0)
-
增加svnchecker配置文件
svncheckerconfig.ini
以下是一份經過檢驗的,可以成功運行的配置。[Default] #This property tells Subversionchecker about all checks #(UnitTests, AccessRights, XMLValidator etc) it should execute. #Separated with comma (",") Main.PreCommitChecks=Checkstyle #Path of java executable to run Checkstyle command Checkstyle.Java=java #Classpath for executing Checkstyle rules Checkstyle.Classpath=F:/_svnChecker/checkstyle-8.17-all.jar #Configuration file for Checkstyle to run its rules. Checkstyle.ConfigFile=F:/_svnChecker/checkstyle.xml #In case of failures, where should Subversionchecker redirect the errors Checkstyle.FailureHandlers=Console #Checkstyle.IgnoreFiles=showlpController.java,YwjyServiceImpl.java
將以上配置複製保存爲
svncheckerconfig.ini
文件,放到目標SVN倉庫的hooks目錄之下。
注意:
a. svncheckerconfig.ini既可以放在svnchecker的安裝目錄之下(F:/_svnChecker/svnchecker-0.3/
),也可以放在hooks目錄之下。(F:/Repositories/common\hooks/hooks/
);前者起全局作用,後者則只對該版本庫起作用。
b. svncheckerconfig.ini文件的具體格式是Python的ConfigParser類定義的標準配置文件格式,非常容易出錯,因此要小心書寫。 -
編寫代碼檢查腳本,例如
F:/_svnChecker/checkstyle.xml
。
這裏直接引用一篇文章 : 符合阿里巴巴代碼規範的checkstyle檢測文件。
2.2.2 配置SVN Server
配置pre-commit腳本
腳本內容如下:
set python="C:\Python27\python.exe"
set svnchecker="F:\_svnChecker\svnchecker-0.3"
set svnlook="D:\VisualSVN Server\bin\svnlook.exe"
setlocal
set REPOS=%1
set TXN=%2
rem checkstyle hooks
%python% %svnchecker%\Main.py PreCommit %REPOS% %TXN% || exit 1
rem Make sure that the log message containssome text.
%svnlook% log -t "%TXN%" "%REPOS%" | findstr "....." > null
if %errorlevel% gtr 0 goto err
exit 0
:err
echo 字符串長度不能小於5,不允許提交 1>&2
echo "%REPOS%" -t "%TXN%" 1>&2
echo %errorlevel%
exit 2
3. 疑難問題
3.1 中文提示亂碼的問題
- 修改
Checkstyle.py
文件
try:
Process.execute(command + " ".join(files))
except Process.ProcessException, e:
msg = "Coding style errors found:\n\n"
# 爲 e.output 附加上字符編碼轉換 > decode("utf-8").encode("gbk")
msg += e.output.decode("utf-8").encode("gbk") + "\n"
msg += "See Checkstyle documentation for a detailed description: http://checkstyle.sourceforge.net/"
return (msg, 1)
- 刪除 checkstyle-8.17-all.jar 中的 messages_zh.properties 文件。
該文件位於com/puppycrawl/tools/checkstyle
package 下。
3.2 報錯指示行數與實際不符
這種情況是在規範執行過程中被發現的,我們經過研究最終也是發現了問題的原因和解決辦法(報錯行數除以2即爲實際行數)。但這裏建議讀者可以暫緩告知解決方案,這樣可以督促研發人員在本地安裝相應的CheckStyle IDE插件。
原因: 主要是因爲Windows和Unix換行符不一致導致的。
解決方案:Eclipse下,選中需要提交的文件,執行如下操作即可:
4. 最終效果
效果如下:
5. 最後
以下引用着下方第二個參考鏈接:
- 不要一次把所有規則都加入,循序漸進,分多批次添加。否則開發人員的修改量會很大,爲制度的推行造成過大的阻力。
- Svnchecker項目已不維護,改爲RepoGuard(http://repoguard.tigris.org/),有興趣的同學可以進一步研究此框架。
- 既然決定用此技術來規範起代碼,那麼就應該堅持的走下去,即使開發人員提出是否可以放寬要求,也要堅持自己的原則。
6. Links
- SVN集成Checkstyle實現代碼自動檢查 本文就是參考了這篇鏈接,修復了其中的一些小問題。
- 用checkstyle實現svn的代碼規範性檢查