Windows+Sonar+Jenkins+Git+SonarPython配置持续集成的代码质量平台
本文以Python项目为例,构建了一个基于Windows+Sonar+Jenkins+Git的持续集成且支持代码自动分析的平台
1.1 Java中主流代码分析工具对比
@ | PMD | Findbugs | CheckStyle | Sonar |
---|---|---|---|---|
运行方式 | IDE插件,独立运行 | IDE插件,独立运行,Findbugs+Jenkins CI集成运行 | IDE插件 | 独立运行,需要单独的MySQL源 |
运行原理 | 基于源代码分析,主要面向安全编码规则,如“避免声明同名变量”,包括风格类、类型使用等等,具备一定的数据流分析和路径分析能力。 | 基于字节码分析,大量使用数据流分析技术,侧重运行时错误检测,如空指针引用等,分析深度大于PMD及Checkstyle。 | 基于源代码,与pmd类似,但更侧重编码的语法风格,分析深度不及PMD。 | 定位是代码质量平台,本身不进行代码分析,但可以集成各个静态分析工具以及其他软件开发测试工具,并基于集成工具的结果数据按照一定的质量模型,如iso-9126,对软件的质量进行评估。 |
目的 | 检查Java源文件中的潜在问题 | 基于Bug Patterns概念,查找javabytecode(.class文件)中的潜在bug | 检查Java源文件是否与代码规范相符 | 作为代码质量平台,通过集成工具对软件质量进行评估 |
检查项 | 空try/catch/finally/switch语句块,未使用的局部变量、参数和private方法,空if/while语句,过于复杂的表达式,不必要的if语句等,复杂类 | 主要检查bytecode中的bug patterns,如NullPoint空指针检查、没有合理关闭资源、字符串相同判断错(==,而不是equals)等 | Javadoc注释命名规范多余没用的ImportsSize度量,如过长的方法缺少必要的空格Whitespace重复代码 | 在其他代码质量工具的基础上,sonar不仅关注了常规静态bug,还关注到了如代码质量、包与包,类与类之间的依赖情况、代码耦合情况、类,方法。文件的复杂度、代码中是否包含大量复制粘贴的代码是质量低下的,关注到了项目代码整体的健康情况。 |
优点 | 插件可以配置规则,有独立显示问题的视图 规则严格,但可以通过修改规则集定义需要的规则 | FindBugs 大多数提示是有用且值得更改的 提供图形界面的独立程序,对jar进行检测,有报告生成,非常方便 | 规则严格,但可以通过修改规则集定义需要的规则 | High级别的bug都是较为实用的bug,且能覆盖到一些性能方面的问题 |
缺点 | 配置无查找功能,但可以通过缩写快速找到某个规则 很多功能插件没有实现,可独立使用,但无法同时修改源码 | 只能做检查,不能修改代码,可配合Jalopy使用修改代码 插件自定义规则没有查找功能,查找规则麻烦 | 其本身规则的实用程度不如Findbugs |
1.2 SonarQube介绍
与持续集成工具(例如 Hudson/Jenkins 等)不同,Sonar 并不是简单地把不同的代码检查工具结果(例如 FindBugs,PMD 等)直接显示在 Web 页面上,而是通过不同的插件对这些结果进行再加工处理,通过量化的方式度量代码质量的变化,从而可以方便地对不同规模和种类的工程进行代码质量管理。
在对其他工具的支持方面,Sonar 不仅提供了对 IDE 的支持,可以在 Eclipse 和 IntelliJ IDEA 这些工具里联机查看结果;同时 Sonar 还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用 Sonar。此外,Sonar 的插件还可以对 Java 以外的其他编程语言提供支持,对国际化以及报告文档化也有良好的支持。
Sonar 为代码的质量管理提供了一个平台,对传统的代码静态检测如 PMD、FindBugs 等工具进行整合,可以说是目前最强大的代码质量管理工具之一。
Sonar 目前支持的语言:C/C++/JavaScript/C#/Java/COBOL/PL/SQL/PL/I/PHP/ABAP/VB.NET/VB6/Python/RPG/Flex/Objective-C/Swift/Web/XML
1.3 SonarQube整体架构:
2.1 部署SonarQube
- 下载SonarQube
- 将SonarQube压缩包解压缩,执行/bin/windows-x86-64/StartSonar.bat 即完成了Sonar的启动
- 打开浏览器,登入http://localhost:9000
- 安装SonarPython插件
- [可选安装]安装Chinese Pack差价可以获得中文支持
插件的安装方法:
- 点击右上角的Login
- 键入默认管理员用户名及密码 admin ,登陆
- 点击Administration,找到System->Update Center
- 搜索插件名字,点击install,然后点击Restart重启Sonar,完成安装。卸载同理
2.2 部署SonarQube Scanner
- 将 SonarQube Scanner 压缩包解压到位置(如C:\sonar-scanner),将bin目录添加到环境变量中(C:\sonar-scanner\bin)
- (测试)打开CMD,cd到项目根目录,键入
sonar-scanner -Dsonar.projectKey=自定义projectkey -Dsonar.sources=. -Dsonar.projectName=自定义projectname -sonar.projectVersion=1.0
官方文档有一个坑,就是并没有定义projectName及projectVersion,实际测试中是必须定义的
其中-D 用来定义变量,加入-X 可以加入更多debug信息
若没有出错,说明部署成功,打开浏览器进入Dashboard,可以看到刚新建的项目代码分析结果。
2.3 部署Jenkins
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
- 下载Jenkins,选择Windows
- 运行Jenkins安装文件,安装完成后会跳出部署设置(默认地址:http://127.0.0.1:8080)
- 第一次会要求键入一个admin密码,这个密码存在Jenkins\secrets\initialAdminPassword 这个文件中,用记事本打开,复制密码粘贴到浏览器中即可,同样的,日后如果忘记管理员密码,也可以找到这个文件使用这个密码登录管理员账户。
- 安装 SonarQube Scanner for Jenkins 插件
- 进入 系统管理->Global Tool Configuration ,新增SonarQube Scannner,不勾选自动安装
Name键入SonarQube Scanner
SONAR_RUNNER_HOME键入SonarQube的绝对目录(如C:\sonar-scanner) - 点击Save保存
Jenkins插件安装方法
进入 系统管理->插件管理->可选插件,在搜索框中搜索需要安装的插件,点击直接安装,然后重启Jenkins
2.4 本文省略但必须做的步骤:
- 安装Git
2.5 将Git项目添加到Jenkins并自动完成代码检测
- 打开Jenkins控制台->新建项目->选择 构建一个自由风格的软件项目 ->输入项目名,下一步
- 源码管理选择Git
Repository URL键入项目Git地址 如 https://github.com/HiddenStrawberry/JDPackage.git
Credentials 为认证方式,点击Add添加认证, 这里可以选择多种认证方式,本文选择Github用户名/密码登录,所以选择Username with Password,填入Github的Username及Password,点击Add,然后选择刚添加的账户。 - 点击下方构建->新建构建步骤-> Execute SonarQube Scanner
- SonarQube Scanner选择SonarQube Scanner
Analysis properties键入如下内容:
sonar.projectKey=myjdp
sonar.projectName=myjdp
sonar.projectVersion=1.0
sonar.sources=.
注意中间没有逗号,key,name,version为自定义,其他选项留空(本例),点击保存
5. 在控制台中找到项目,点击立即构建,若构建后状态灯为蓝色,即为构建成功,若为红色,进入Build History构建失败的#次数,找到左边的Console Output,即可查看控制台中输出的错误原因。
6. 在控制台中找到项目,点击SonarQube,即可查看代码分析内容。
3.1 性能分析:
在2G/双核E5 V3 2.4GHz 新配置环境主机 上运行上述64位服务,物理内存占用约为80%,在运行构建时,CPU占用峰值可达80%,内存占用峰值达90%,由此可见SonarQube在代码分析时占用资源较大。
4.1 引用:
如何静态测试 Java 代码?
Findbugs使用
PMD使用
Eclipse静态分析插件使用
PMD、FindBug、checkstyle、sonar这些代码检查工具的区别?各自的侧重点是什么?
FindBugs、PMD和CheckStyle对比
构建基于Jenkins + Github的持续集成环境
SonarPython - Plugins - Doc SonarQube