【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目录之下。
    【DevOps】SVN集成Checkstyle实现代码自动静态检查_第1张图片
    【DevOps】SVN集成Checkstyle实现代码自动静态检查_第2张图片

    注意:
    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脚本
【DevOps】SVN集成Checkstyle实现代码自动静态检查_第3张图片
脚本内容如下:

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 中文提示乱码的问题

【DevOps】SVN集成Checkstyle实现代码自动静态检查_第4张图片

  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下,选中需要提交的文件,执行如下操作即可:
【DevOps】SVN集成Checkstyle实现代码自动静态检查_第5张图片

4. 最终效果

效果如下:
【DevOps】SVN集成Checkstyle实现代码自动静态检查_第6张图片

5. 最后

以下引用着下方第二个参考链接:

  1. 不要一次把所有规则都加入,循序渐进,分多批次添加。否则开发人员的修改量会很大,为制度的推行造成过大的阻力。
  2. Svnchecker项目已不维护,改为RepoGuard(http://repoguard.tigris.org/),有兴趣的同学可以进一步研究此框架。
  3. 既然决定用此技术来规范起代码,那么就应该坚持的走下去,即使开发人员提出是否可以放宽要求,也要坚持自己的原则

6. Links

  1. SVN集成Checkstyle实现代码自动检查 本文就是参考了这篇链接,修复了其中的一些小问题。
  2. 用checkstyle实现svn的代码规范性检查

你可能感兴趣的:(DevOps,DevOps,CheckStyle,SVN)