SonarQube
一,简介
Sonar 是一个很优秀的代码分析工具,可以帮助程序员们发现很多潜在的问题和BUG。
Sonar可以从以下七个维度检测代码质量。
1. 不遵循代码标准
sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具规范代码编写。
2. 潜在的缺陷
sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具检测出潜在的缺陷。
3. 糟糕的复杂度分布
文件、类、方法等,如果复杂度过高将难以改变,这会使得开发人员 难以理解它们, 且如果没有自动化的单元测试,对于程序中的任何组件的改变都将可能导致需要全面的回归测试。
4. 重复
显然程序中包含大量复制粘贴的代码是质量低下的,sonar可以展示 源码中重复严重的地方。
5. 注释不足或者过多
没有注释将使代码可读性变差,特别是当不可避免地出现人员变动 时,程序的可读性将大幅下降 而过多的注释又会使得开发人员将精力过多地花费在阅读注释上,亦违背初衷。
6. 缺乏单元测试
sonar可以很方便地统计并展示单元测试覆盖率。
7. 糟糕的设计
通过sonar可以找出循环,展示包与包、类与类之间的相互依赖关系,可以检测自定义的架构规则 通过sonar可以管理第三方的jar包
需要用到的软件有:SonarQube,Sonar-scanner。
SonarQube为代码检查的server,并提供可视化界面;
Sonar-scanner为client。用于收集检查数据并且发送到server中。也就是传统的C/S关系:
二,架构介绍
SonarQube平台主要由4个组件组成:
(1). SonarQube服务器:
主要包括web服务器,基于ElasticSearch的搜索服务器,计算引擎服务器。
其中,web服务器,是供开发人员浏览查看代码分析结果,进行相应的配置等。
计算引擎服务器主要是处理代码分析报表并将其存储在数据库。
(2). SonarQube 数据库:
存储配置信息和代码分析报表。
(3). 多个Soanr插件:包括分析各种语言的插件。
(4). 多个Sonar Scanner,主要运行在开发人员的代码端,可以单独部署,也可以集成在Maven,Gradle等。
http://1.2.2.7:9009 用户:admin 密码:admin |
三,安装
版本分析:
最新版本是8.3.1(202004发布) 已整合CI / CD
但是环境依赖比较高:要求 Java 11 且不支持mysql 管理配置元数据
综合考量,功能最大化,依赖Java 8,且支持mysql管理元数据的最后版本
故选择版本 7.8 (20190619日发布)
安装过程
<1>https://www.sonarqube.org/downloads/下载文件 解压安装文件
(1)unzip sonarqube-7.8.zip
(2)在mysql中创建相关用户和密码
create database sonar_db ;
create user 'sonar_ntd'@'%' identified by 'ntd123';
grant all privileges on sonar_db.* to "sonar_ntd"@'%';
grant all privileges on sonar_db.* to 'sonar_ntd'@'localhost' identified by 'ntd123';
grant all privileges on sonar_db.* to 'sonar_ntd'@'master01' identified by 'ntd123';
<2>,修改配置文件 sonarqube-7.8/conf/sonar.properties
#web端口号 默认9000
sonar.web.port=9009
#元数据保存到mysql
sonar.jdbc.url=jdbc:mysql://1.2.2.7:3306/sonar_db?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
sonar.jdbc.username=sonar_ntd
sonar.jdbc.password=ntd123
sonar.sorceEncoding=UTF-8
sonar.login=admin
sonar.password=admin
#
sonar.search.javaAdditionalOpts=-Dbootstrap.system_call_filter=false
<3>安装中文插件https://github.com/SonarQubeCommunity/sonar-l10n-zh/releases下载 7.8 对应版本中文插件 sonar-l10n-zh-plugin-1.28.jar
放入 sonarqube-7.8/extensions/plugins 目录
<4>启动服务
/sonarqube-7.8/bin/linux-x86-64/sonar.sh start
<5>安装扫描器(用于除Java,c++外的,比如 python php 等等其他语言)
https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/下载
解压 sonar-scanner-cli-4.2.0.1873-linux.zip
修改配置文件sonar-scanner-4.2.0.1873-linux/conf
sonar.host.url=http://1.2.2.7:9009
并加入环境变量
export SONAR_SCANNER_HOME=/home/software/sonar-scanner-4.2.0.1873-linux
export PATH=$PATH:$SONAR_SCANNER_HOME/bin
source ~/.bashrc
四,整合maven的两种使用方式
创建一个项目
窗体顶端
Analyze "sonarQubeTest": 323220150f0f09643e87ae705fa249c24f8db01f |
窗体底端
此令牌用于执行分析时认证时使用,如果这个令牌存在问题,可以随时在你的用户账号下取消这个令牌。
选择语言: Java
选择构建框架:maven
会自动生成一下命令
mvn sonar:sonar \ -Dsonar.projectKey=sonarQubeTest \ -Dsonar.host.url=http://master01:9009 \ -Dsonar.login=323220150f0f09643e87ae705fa249c24f8db01f
|
其中-Dsonar.projectKey表示的是项目的标识,-Dsonar.host.url表示的是sonar的 地址,-Dsonar.login=323220150f0f09643e87ae705fa249c24f8db01f设置的sonar的令牌信息
Cd 项目目录,执行以下命令
mvn sonar:sonar \ -Dsonar.projectKey=sonarQubeTest \ -Dsonar.host.url=http://master01:9009 \ -Dsonar.login=323220150f0f09643e87ae705fa249c24f8db01f \ -Dsonar.java.binaries=target/sonar
|
注意:以上命令增加一行 -Dsonar.java.binaries=target/sonar 是指定sonar.java.binaries 项目的文件夹。否则会报错Please provide compiled classes of your project with sonar.java.binaries property
<1>. 在Maven的全局配置文件: $MAVEN_PATH/conf/settings.xml (也可能是.m2/settings.xml )中添加如下内容:
<
http://1.2.2.7:9009
|
<2> .到Maven项目的根目录执行如下命令,即可使用SonarQube分析项目:
mvn sonar:sonar -Dsonar.java.binaries=target/sonar |
五,其他语言scala ,python,php 或者一个项目使用多种语言时通过以下方式使用sonar-scanner
<1>在项目目录增加sonar-project.properties配置文件
sonar.projectKey=my:project sonar.projectName=My project sonar.projectVersion=1.0 sonar.projectDescription=test_project_description sonar.sources=. sonar.sourceEncoding=UTF-8 sonar.java.binaries=./target/sonar |
sonar.projectKey在给定的SonarQube实例中必须是唯一的
sonar.projectName和sonar.projectVersion这是SonarQube用户界面中显示的名称和版本。在SonarQube 6.1之前是强制性的。
sonar.projectDescription 项目描述
sonar.sources 是源代码目录
sonar.sourceEncoding源代码的编码。默认为默认系统编码
sonar.java.binaries分析的classes文件路径
<2>在项目目录执行一下命令
sonar-scanner |
sonar-project.properties 各项参数说明
强制参数 服务器
项目配置
可选参数 项目身份
认证方式 如果“任何人”伪组没有执行分析的权限,则需要向用户提供具有“执行分析”权限的凭据才能在其下运行分析。
网页服务
项目配置
重复项
分析记录
|
idea结合sonar的话,可以下载sonarLint插件,操作步骤如下:
总体思路:使用mvn生成测试报告,使用 sonar-scanner 将测试报告传到 SonarQube服务
<1> Java maven 项目
1,maven Java项目,pom文件增加以下依赖
|
采用junit测试
|
举例
略
3,执行以下maven命令
mvn test org.jacoco:jacoco-maven-plugin:prepare-agent sonar:sonar |
<2> scala maven 项目
|
采用junit测试
|
举例
略
Mvn test |
sonar.projectKey=scalatest:scalatest01 sonar.projectName=scalatest01 sonar.projectVersion=1.0 sonar.sources=. sonar.sourceEncoding=UTF-8 sonar.projectDescription=123456789beizhu sonar.links.homepage=www.baidu.com sonar.scala.coverage.reportPaths=./target/site/jacoco/jacoco.xml |
备注:主要增加配置项sonar.scala.coverage.reportPaths=./target/site/jacoco/jacoco.xml
指定测试xml报告所在目录
sonar-scanner |
备注:本次扫描会把 mvn test命令在项目目录下target目录生成的 css,html,xml等代码全部当成项目代码参与扫描。