sonar是一款开源的代码质量静态检查工具,可以支持很多种语言。使用sonar可以检查测试覆盖率,代码复杂度,重复代码,以及违反某些规则的不良的编程风格,等等。看一张截图:
通过这样的一张图表,就可以清楚看出来当前项目的健康状况。记录下你的技术债务。除了简单的记录下各个指标的值,还可以自定义一些alert,用以当某项指标低于或者高于某个阈值的时候给出报警。如上图就有一个例子,我设置了测试覆盖率不能小于50%,否则就会显示这样的红色的警告。
不但每次构建会有一次这样的snapshot,而且可以跟过去的指标对比,来发现代码质量是提升了还是下降了。
当然上面看到的只是sonar功能九牛之一毛。等到自己装好了sonar之后可以再慢慢摸索。下面的部分我就讲解一下如何安装sonar,以及如何运行sonar来分析项目。
安装sonar服务器
首先要安装的是sonar的服务器,它提供了主要的代码分析,分析结果存储,分析结果展示的功能。从这里下载sonar服务器,目前最新的版本是3.2.1。解压完成之后就是一个sonar-3.2.1的文件夹。
因为sonar需要使用数据库来存储代码分析的结果。因此我们需要告诉sonar数据存到哪里。打开sonar-3.2.1/conf/sonar.properties。该文件中已经预设了几种数据库的配置了,比如h2,mysql,oracle,postgresql等等。你可以使用任何一种,然后保持其他的配置是注释掉的。除了数据库地址的配置,还需要配置用户名密码,这个是不分数据库的,单独列出。我使用的是mysql,配好之后的样子是这样的:
sonar.jdbc.username: root sonar.jdbc.password:
..... sonar.jdbc.url: jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true
关于其他的配置项,可以自己参考sonar.properties文件。
我使用的数据库名字是sonar,所以需要先在mysql中创建该数据库,然后运行bin目录下适合你机器的那个文件夹里的sh文件即可。我使用的mac,我的启动命令如下:
bin/macosx-universal-64/sonar.sh console
启动之后,可以在命令行中看到它会自动做一些DB migration,把该建的表建好。然后就可以访问http://localhost:9000/了,sonar已经在那里等着你了:)
使用sonar分析你的代码库
好了,现在我们有一个运行着的sonar服务器了,如何用它来检测我的代码呢?
Native Way
一个答案是你还需要下载一个叫做sonar-runner的东西。从这里下载。解压后得到一个sonar-runner的文件夹。然后把bin/sonar-runner这个可执行文件添加到PATH里面,这样就可以在任何一个代码库下面运行sonar分析了。要分析一个代码库,首先需要在你的代码库根目录创建一个sonar-project.properties文件,比如这样:
# required metadata sonar.projectKey=my:project sonar.projectName=My project sonar.projectVersion=1.0 # path to source directories (required) sonar.sources=srcDir1,srcDir2 # path to test source directories (optional) sonar.tests=testDir1,testDir2 # path to project binaries (optional), for example directory of Java bytecode sonar.binaries=binDir # optional comma-separated list of paths to libraries. Only path to JAR file and path to directory of classes are supported. sonar.libraries=path/to/library.jar,path/to/classes/dir # Uncomment this line to analyse a project which is not a java project. # The value of the property must be the key of the language. sonar.language=cobol # Additional parameters sonar.my.property=value
然后在项目的根目录运行sonar-runner即可。运行完之后就可以在http://localhost:9000/上面看到分析的结果了。
与其他构建工具的集成
sonar对代码库的分析可以很好的被集成到例如ant,maven这些常见的构建工具中。具体的用法可以参考该页面进行配置。这里就不在赘述了。
如果你看了上面的链接,你就知道在maven中只要使用mvn sonar:sonar这样的命令就可以对当前工程进行分析了,非常方便。更方便的是,在持续集成服务器中使用该命令同样可以进行代码分析,如果你在sonar中配置了某些alert,而且这些alert被触发了,那么mvn sonar:sonar这条任务就会失败,进而导致构建失败。这样你的CI也就可以很容易的和sonar结合在一起的。
至此我们已经配置好了sonar服务器和sonar-runner,并且可以使用maven的plugin来运行sonar分析,甚至还可以和持续集成服务器很容易的集成在一起。看起来已经很有用了。但是sonar真正有用之处在于其可扩展性。你可以很方便的定制化你的sonar分析过程,加入新的指标,加入自定义的失败条件等等。我会在下一篇文章中做一些讲解。