【DevOps】SVN集成Checkstyle實現代碼自動靜態檢查

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
  1. Python下載地址 中下載相應的Python2.x版本(注意這裏不要下載Python3.x)。另外如果覺得上述鏈接下載比較慢,可以使用下面這個國內鏈接Python2.7.6。注意下載對應位數的Python版本。
  2. 在SVN所在服務器上安裝第一步下載的Python,並配置相應的環境變量。筆者本次直接選擇了默認安裝目錄"C:\Python27"。
    安裝Python
2.1.2 安裝svnchecker-0.3
  1. svnchecker-0.3下載地址中下載 “svnchecker-0.3.zip”,注意直接下載此壓縮包即可,免去你安裝exe時候可能出現的"no python installation found in the registry"問題。
  2. 下載之後直接解壓即可。
2.1.3 安裝CheckStyle
  1. CheckStyle下載地址 中挑選你想要的版本,這裏注意下載 checkstyle-x.xx-all.jar版本的,一勞永逸。
  2. 下載之後放到任意目錄下備用。

2.2 配置

2.2.1 配置svnchecker
  1. 修改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%')
    
  2. 修改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)
    
  3. 增加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目錄之下。
    快速打開SVN倉庫所在目錄
    文件位置

    注意:
    a. svncheckerconfig.ini既可以放在svnchecker的安裝目錄之下(F:/_svnChecker/svnchecker-0.3/),也可以放在hooks目錄之下。(F:/Repositories/common\hooks/hooks/);前者起全局作用,後者則只對該版本庫起作用。
    b. svncheckerconfig.ini文件的具體格式是Python的ConfigParser類定義的標準配置文件格式,非常容易出錯,因此要小心書寫。

  4. 編寫代碼檢查腳本,例如 F:/_svnChecker/checkstyle.xml
    這裏直接引用一篇文章 : 符合阿里巴巴代碼規範的checkstyle檢測文件

2.2.2 配置SVN Server

配置pre-commit腳本
配置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 中文提示亂碼的問題

中文亂碼

  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)
  1. 刪除 checkstyle-8.17-all.jar 中的 messages_zh.properties 文件。
    該文件位於 com/puppycrawl/tools/checkstyle package 下。
3.2 報錯指示行數與實際不符

這種情況是在規範執行過程中被發現的,我們經過研究最終也是發現了問題的原因和解決辦法(報錯行數除以2即爲實際行數)。但這裏建議讀者可以暫緩告知解決方案,這樣可以督促研發人員在本地安裝相應的CheckStyle IDE插件。

原因: 主要是因爲Windows和Unix換行符不一致導致的。
解決方案:Eclipse下,選中需要提交的文件,執行如下操作即可:
在這裏插入圖片描述

4. 最終效果

效果如下:
校驗未通過

5. 最後

以下引用着下方第二個參考鏈接:

  1. 不要一次把所有規則都加入,循序漸進,分多批次添加。否則開發人員的修改量會很大,爲制度的推行造成過大的阻力。
  2. Svnchecker項目已不維護,改爲RepoGuard(http://repoguard.tigris.org/),有興趣的同學可以進一步研究此框架。
  3. 既然決定用此技術來規範起代碼,那麼就應該堅持的走下去,即使開發人員提出是否可以放寬要求,也要堅持自己的原則

6. Links

  1. SVN集成Checkstyle實現代碼自動檢查 本文就是參考了這篇鏈接,修復了其中的一些小問題。
  2. 用checkstyle實現svn的代碼規範性檢查
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章