代码扫描工具的选型和Sonar最佳实践

6,053 阅读4分钟

目标

在编码阶段发现NNE空指针异常、IO流未正确关闭等致命性bug,杜绝此类“零容忍”线上异常的发生。

技术选型

关于代码扫描工具,比较主流的有Sonar、FindBugs、Alibaba Java Coding Guidelines、CheckStyle。

  • Alibaba Java Coding Guidelines最大的优点是全中文的提示,对国内开发人员相当友好,并且有阿里巴巴团队持续维护。但是经我亲测,无法检测出NNE等潜在bug,所以肯定是排除的。等后续提供了这方面的支持,会是不错的选择。

  • FindBugs功能完全够用,可以检查出NNE这样的错误,但是很可惜,idea的FindBugs插件最多支持到2018.1版本,看来新时代的我们也无福消受了。但是FindBugs似乎也有独立运行的版本,但是我大致看了一下,GUI界面比较复古风了,看了一下官网,最后一次更新是2015年3月了,这种已经停止维护的东西也不敢用啊

  • CheckStyle跟Alibaba Java Coding Guidelines有点类似,基本也是规范代码格式的,不能找出潜在bug,因此排除
  • Sonar大致分为idea插件版本的SonarLint和带有非常友好功能强大GUI的SonarQube代码质量平台,完全能满足我们的需求。并且Sonar提供了面向gitlab、jekins、maven的无缝对接支持,是当下最活跃热门的代码质量扫描工具。

综上所述,我们也只能选择Sonar了。

Sonar最佳实践

简单做法

最简单的做法就是,idea的plugins应用市场直接搜索SonarLint然后安装就可以了。然后直接鼠标右键选择Sonar扫描文件就可以看到结果了:

这种简单粗暴的问题有两个

  1. Sonar的规则有一千多条,扫描出的问题严重性有Bugs、Vulnerabilities、Code Smells等几个级别,如果所有的问题都要改过去,效率就太低了,也难以执行,个人认为,除了Bugs级别的必须改掉之外,其他级别的问题不必强制性改掉,有追求的同学可以当作优化自己代码风格的手段。但是不幸的是,SonarLint的错误提示并没有按照错误等级分类过滤的选项,在茫茫问题条目中一个个找Bugs级别的问题,着实蛋疼。当然,也可以右键选择”disable rules“来直接去掉非Bugs等级的扫描规则,但也不够优雅。
  2. 这种方式全靠自觉,假设代码review的时候,需要把解决掉所有Bugs级别的问题,作为前置准备工作之一,那我们还得像第1点里面说的那样看有没有遗留的bugs级别问题。

推荐做法

第一步下载

自己去官网下一个SonarQube的安装包,这里面有个坑,官网上最新的LTS版本的SonarQube(目前是version-7.9.3)最低要求的Java版本是JDK11,我们现在普遍还是用的Java8,所以推荐大家去下载6.7.7版本的。值得一提的是,SonarLint插件也可选择把扫描结果同步到SonarQube平台上,但是两者的版本要对应好,否则无效(这真的很坑)。

我百度网盘准备了sonarqube-6.7.7的zip文件,链接: pan.baidu.com/s/1aFOTfX0j… 密码: 1n2c

第二步启动

下载完毕,解压后,进入到/sonarqube-6.7.7/bin下面,可以看到有所有通用的平台的启动文件

我的Mac,在macosx-universal-64文件位置,执行命令 sh sonar.sh start 就可以了,完全不用做其他任何操作,启动日志在/sonarqube-6.7.7/logs/sonar.log中,然后浏览器前往localhost:9000,成功后页面如下:

第三步初始化配置

点击右上角选择登陆,初始用户名密码都是admin,然后根据步骤配置token信息。

在项目根目录下面(其实可以在任意目录下面),执行命令

mvn clean install sonar:sonar -Dsonar.host.url=http://localhost:9000 -Dsonar.login=d7b53bc44cd108ee40b6691433bf70eb0a507b0b

Dsonar.login后面替换成你自己的token就行了。

执行完后,再回到SonarQube平台,可以看到:

点击项目名字,然后再点击Bugs

如下图,我们的老朋友NNE也在其中了

我们改掉后,再重新执行一回命令,Bugs为0就OK啦。(sonar结合上下文跨方法判断的能力比较弱,如果确定不存在风险可以手动选择“Resolve as won't fix”)

当然,为了方便,也可以讲这条mvn命令配置为idea快捷启动项,如下:

如何实施

  • 将Sonar扫描Bugs问题归零作为代码review前置准备的必要检查之一。
  • 大团队可考虑:申请云服务器来部署Sonar,接入gitlab,每次提交的时候检查有无Bugs问题,如有,则发送钉钉告警信息。接入项目部署平台,将Bugs问题检查作为部署前置检查