Fork me on GitHub

Jenkins集成Sonar进行持续审查

  由于最近客户要求在devops持续集成平台上增加代码审计功能,经过一番对比,决定选用sonar来实现,通过网上的文档艰难的完成了安装,写篇博客记录下。

SonarQube 简介

  Sonar是一个用于代码质量管理的开源平台,用于管理Java源代码的质量。通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具,比如pmd-cpd、checkstyle、findbugs、Jenkins。通过不同的插件对这些结果进行再加工处理,通过量化的方式度量代码质量的变化,从而可以方便地对不同规模和种类的工程进行代码质量管理。同时 Sonar 还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用 Sonar。 此外,Sonar 的插件还可以对 Java 以外的其他编程语言提供支持,对国际化以及报告文档化也有良好的支持。
Sonar可以从以下七个维度检测代码质量,而作为开发人员至少需要处理前5种代码质量问题
  1.不遵循代码标准
  sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具规范代码编写
  2.潜在的缺陷
  sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具检测出潜在的缺陷
  3.糟糕的复杂度分布
  文件、类、方法等,如果复杂度过高将难以改变,这会使得开发人员难以理解它们且如果没有自动化的单元测试,对于程序中的任何组件的改变都将可能导致需要全面的回归测试
  4.重复
  显然程序中包含大量复制粘贴的代码是质量低下的,sonar可以展示源码中重复严重的地方
  5.注释不足或者过多
  没有注释将使代码可读性变差,特别是当不可避免地出现人员变动时,程序的可读性将大幅下降而过多的注释又会使得开发人员将精力过多地花费在阅读注释上,亦违背初衷
  6.缺乏单元测试
  sonar可以很方便地统计并展示单元测试覆盖率
  7.糟糕的设计
  通过sonar可以找出循环,展示包与包、类与类之间的相互依赖关系,可以检测自定义的架构规则通过sonar可以管理第三方的jar包,可以利用LCOM4检测单个任务规则的应用情况, 检测耦合。

SonarQube与Sonar-Scanner的安装与配置

下载sonarQube安装包

  SonarQube可以在官网(https://www.sonarqube.org/downloads/)下载,在Linux服务器上安装始终加载不到静态文件,所以最后决定直接在Windows服务器上安装sonar,将从官网下载的安装包解压到任意目录。

创建sonar数据库

  SonarQube自带了一个H2数据库,但是为了获得更好的性能还是选择MySQL数据库。首先在mysql中新建一个sonar数据库,用于存放分析的数据,并且新建一个数据库用户,实测直接用root账户会报错。

1
2
3
4
> CREATE USER 'sonar'@'%' IDENTIFIED BY 'password';
> GRANT all privileges ON sonarqube.* TO sonar'@''%' IDENTIFIED BY 'password';
> flush privileges;
> create database sonar;

注意:MySQL数据库一定要在5.6以上(sonar要求数据库支持事务,mysql5.6+才是InnerDB)

配置sonar应用mysql

  修改配置文件sonar.properties

1
2
3
4
5
6
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:mysql://172.17.20.140:3307/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
sonar.web.host=0.0.0.0
sonar.web.context=/sonar
sonar.web.port=9000

保存配置文件后,进入\bin\windows-x86-64目录下,双击startup.bat启动。如果启动过程没有报错,打开浏览器输入http://172.17.20.125:9000/sonar/,出现如下画面说明安装成功

配置Sonar-Scanner 进行项目代码审查

  下载sonar-scanner,解压到任意目录,同样的修改sonar.properties 配置文件

1
2
# --------指定系统中sonar访问路径
sonar.host.url=http://localhost:9000/sonar

如果安装的不是同一台机器,将localhost修改为对应地址即可
sonar-scanner在项目中使用需要在项目根目录下添加sonar-project.properties文件

1
2
3
4
5
6
7
8
#sonar-project.properties内容如下
sonar.projectKey=project_key
sonar.projectName=project_name
sonar.projectVersion=1.0
sonar.sources=./
sonar.language=py //需要扫描哪种语言的代码,如python:py,java:java
sonar.sourceEncoding=UTF-8
sonar.host.url=http://your_host:your_port/[your_prefix]

进入项目根目录,启动cmd命令行,输入sonar-scanner,sonar-scanner会自动对项目进行检查,检查的结果发送到sonar服务器进行解析,然后反馈的用户。

将sonar集成到jenkins中

  将sonar配置到jenkins中,当使用jenkins自动化部署项目时,就能够自动的对代码进行检查
1.手动下载jenkins插件SonarQube Scanner for Jenkins。也可以直接在jenkins中下载,在[Manage Jenkins]-[Global Tool Configuration]中配置JDK和Maven后,再在Jenkins上安装SonarQube插件。在[Manage Jenkins]-[Global Tool Configuration]中选择SonarQube Scanner for Jenkins插件,点击下载,下载完成后重启jenkins服务器。

2.jenkins重启成功后,打开[Manage Jenkins]-[Configure System]和[Manage Jenkins]-[Global Tool Configuration],可以看到新增了Sonar Qube的选项。在[Manage Jenkins]-[Configure System]中配置SonarQube Server。

[Server authentication token]行对应的token请输入第一次启动sonar server时生成的token

在jenkins中配置sonar进行代码审查

  完成好以上步骤后,在进行项目编译打包时,点击[增加构建步骤],会发现多了Execute SonarQube Scanner选项

在Execute SonarQube Scanner中进行如下配置:

Task to run 可以随便写,JDK一定要选择jenkins 中配置的jdk(版本不能太低,sonar要求jdk版本为1.8),Path to project properties: 相当于sonar-scanner中的sonar-project.properties,如果在项目的根目录下有sonar-scanner配置文件配置即可。Additional arguments中可写可不写,个人习惯加上“-X”,表示以Debug的形式启动,能够显示更多的信息。
Analysis properties示例如下图所示:

1
2
3
4
5
6
sonar.projectKey=$proName
sonar.projectName=$proName
sonar.projectVersion=1.0
sonar.sources=${proName}/src
sonar.language=java
sonar.sourceEncoding=UTF-8

在sonar-java插件4.10版本之后,还需要添加sonar.java.binaries=target/classes。但是因为打包时可能没有编译后的文件,所以我在sonarqube中替换了sonar-java-plugin文件,将版本改为4.10。

保存好Execute SonarQube Scanner配置,开始编译打包,查看日志

然后打开sonarqube server,即可查看分析结果

关于启动与关闭的问题&

  sonar 如果安装在Linux服务器下,启动和关闭都不是问题,进入sonar安装目录的bin文件夹的Linux-x86-64目录下,直接使用命令启动

1
2
3
4
# 启动sonar
$ ./sonar.sh start
# 关闭sonar
$ ./sonar.sh stop

哎!公司服务器抽风,Linux安装一直出现静态资源没法加载,估计是环境的问题,但是没法改,只能在Windows服务器上安装。
在Windows中启动比在Linux中更简单,直接进入安装目录下的[E:\sonarqube-6.7.3\bin\windows-x86-64]目录下,双击startSonar.bat启动。(选择Windows-x86-64还是32,根据系统中安装的jdk版本而定,必须跟jdk版本对应,Linux中同理)。
Windows中启动简单,但是关闭却比较复杂,各种关联文件,一个个的都必须释放才能彻底关闭。

-------------本文结束感谢您的阅读-------------
你的支持是我最大的动力