sonarqube扫描平台搭建
一、 sonarqube-7.5平台搭建
SonarQube为静态代码检查工具,是管理代码质量一个开放平台,可以快速的定位代码中潜在的或者明显的错误。采用B/S架构,帮助检查代码缺陷,改善代码质量,提高开发速度,通过插件形式,可以支持Java、C、C++、JavaScripe等等二十几种编程语言的代码质量管理与检测。
通过客户端插件分析源代码,sonar客户端可以采用IDE插件、Sonar-Scanner插件、Ant插件和Maven插件方式,并通过各种不同的分析机制对项目源代码进行分析和扫描,并把分析扫描后的结果上传到sonar的数据库,通过sonar web界面对分析结果进行管理
架构图

可以从七个维度检测代码质量:
(1)复杂度分布(complexity):代码复杂度过高将难以理解
(2) 重复代码(duplications):程序中包含大量复制、粘贴的代码而导致代码臃肿,sonar可以展示源码中重复严重的地方
(3) 单元测试统计(unit tests):统计并展示单元测试覆盖率,开发或测试可以清楚测试代码的覆盖情况
(4) 代码规则检查(coding rules):通过Findbugs,PMD,CheckStyle等检查代码是否符合规范
(5) 注释率(comments):若代码注释过少,特别是人员变动后,其他人接手比较难接手;若过多,又不利于阅读
(6) 潜在的Bug(potential bugs):通过Findbugs,PMD,CheckStyle等检测潜在的bug
(7) 结构与设计(architecture & design):找出循环,展示包与包、类与类之间的依赖、检查程序之间耦合度
个人使用之后认为 : sonarQube的优势如下(相比于阿里编码规约这种市面上常见类似软件):
- 更加优秀的图形化界面
基本上通过界面就可以对自己项目的代码状况一目了然 - 可以查询出其它软件难以定位到的问题
比如 : 可能导致空指针异常的问题 (对象在进行使用前没有加空的判断)
可能导致内存泄漏的问题, 在try catch 块里面,直接使用e.printStackTrace()将堆栈信息打印到内存的
可能导致的漏洞 : 成员变量使用public定义的
还有诸如 : 流等未关闭或者是非正常关闭都能够检测出来!
功能非常强大!!
下面将会介绍一下这个工具的安装、配置以及使用
环境部署:sonar7.5+mysql5.7+ jdk1.8+ sonar-scanner-3.3
准备工作;
1、jdk(不再介绍),sonarqube-7.5使用jdk1.8
2、sonarqube:http://www.sonarqube.org/downloads/
3、SonarQube+Scanner:https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-2.5.zip
4、mysql数据库(不再介绍)
sonarqube-7.5对应 MySQL >=5.6 && <8.0
二、 安装篇
1.下载好sonarqube后,解压打开bin目录,启动相应OS目录下的StartSonar。如本文演示使用的是win的64位系统,则打开D:\sonar\sonarqube-5.3\sonarqube-5.3\bin\windows-x86-64\StartSonar.bat
Linux启动命令,sonar的所有者登录执行:
$ sh sonar.sh start
其他:Usage: sonar.sh { console | start | stop | restart | status | dump }
2.启动浏览器,访问http://localhost:9000,如出现启动页面表示安装成功。
三、 配置篇
-
打开mysql,新建一个数据库sonardb。
-
打开sonarqube安装目录下的D:\sonar\sonarqube-7.5\conf\sonar.properties文件,修改文件:
在mysql5.X节点下输入以下信息
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonardb?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
sonar.jdbc.username=root
sonar.jdbc.password=111111
sonar.sorceEncoding=UTF-8
sonar.login=admin
sonar.password=admin
###这里不配置用户命名在扫描时无法登陆,或者scanner中配置
(注意数据库版本与sonar的兼容关系,或连接信息不对也连接不上,会强制关闭连接)
url是数据库连接地址,username是数据库用户名,jdbc.password是数据库密码,login是sonarqube的登录名,sonar.password是sonarqube的密码
-
重启sonarqube服务,再次访问http://localhost:9000,会稍微有点慢,因为要初始化数据库信息
-
数据库初始化成功后,登录
-
进入配置-应用市场,进入插件安装页面


sonar-project.properties内容如下:
sonar.projectKey=testaml
sonar.projectName=testaml
sonar.projectVersion= testaml_v1.0
sonar.sources=src/testaml #存放待扫描代码
sonar.java.binaries=bin
sonar.language=java
sonar.sourceEncoding=UTF-8
Linux需修改:
vim /home/sonar/sonar-scanner-3.3.0.1492-linux/bin/sonar-scanner
前面添加下面这行,即test目录位置,否则可能出现扫描失败(配置文件读取不到):
#go into code directory
cd /home/sonar/test
配置成功后可以查看到下面信息

每次将代码放入src目录之下后,更新sonar-project.properties配置文件,执行命令行进入运行:
D:\test> sonar-scanner
执行完成后,出现EXECUTION SUCCESS即扫描成功。

为使扫描命令执行更方便,可以配置如下环境变量vim .bash_profile:
PATH=
P
A
T
H
:
PATH:
PATH:HOME/bin
export PATH
export SONAR_HOME=/home/sonar/sonarqube-7.5
#export SONAR_CLIENT=/home/sonar/sonarqube-7.5/sonar-scanner-3.3.0.1492-linux
export JAVA_HOME=/usr/java/jdk1.8.0_92
export CLASSPATH=.:
J
A
V
A
H
O
M
E
/
l
i
b
:
JAVA_HOME/lib:
JAVAHOME/lib:JAVA_HOME/jre/lib
export PATH=
J
A
V
A
H
O
M
E
/
b
i
n
:
JAVA_HOME/bin:
JAVAHOME/bin:JAVA_HOME/jre/bin:
S
O
N
A
R
H
O
M
E
/
b
i
n
:
SONAR_HOME/bin:
SONARHOME/bin:SONAR_HOME/sonar-scanner-3.3.0.1492-linux/bin:$PATH
五、 插件-配置pdf报告
- 前往https://gitee.com/zzulj/sonar-pdf-plugin开源社区下载pdf导出插件
- 将插件sonar-pdfreport-plugin-3.0.1.jar,放入/home/sonar/sonarqube-7.5/extensions/plugins目录中,重启sonar。
- 进入配置可以看到配置页如下,PDF report为添加插件后新增页签,填入username和password(填管理员的用户密码,否则生成出错)并保存,将原分析项目删除并重新分析项目:

4.点击已生成PDF报告的项目,下载如图:


六、 添加sonar-p3c-pmd插件
p3c-pmd是阿里巴巴Java代码规约插件
6. 在https://github.com/mrprince/sonar-p3c-pmd中下载插件源代码

- 解压后,打开命令提示符窗口,进入到源码所在目录,执行命令mvn package(要先装好maven),成功后显示
从上面的jar路径找到生成的插件包,放入/home/sonar/sonarqube-7.5/extensions/plugins中,重启sonar - 在前台代码规则中搜索p3c就可以搜到新添规则
- 扫描规则说明
参照https://www.cnblogs.com/gcgc/p/11451125.html
七、 sonarqube-9.0平台搭建
环境部署:sonar9.0+ postgresql-13.3+jdk11+ sonar-scanner-4.6
与前面7.5搭建步骤大致相同:
注意:安装postgresql-15.1-1-windows-x64不要勾选pgadmin4,这个单独安装pgadmin4-6.19-x64
6.1 Linux安装postgresql
window上方法相同
用root执行./postgresql-10.17-1-linux-x64.run
界面安装直接下一步即可完成。
用连接工具超级用户postgres登录,在sql窗口执行下列语句
create database sonardb;
create user sonar;
alter user sonar with password ‘sonar’; ##设置sonar用户密码(否则会导致连不上数据库)
alter role sonar createdb;
alter role sonar superuser;
alter role sonar createrole; ##给sonar授权
alter database sonardb owner to sonar; ##更改sonar数据库拥有者(这一步是必须的,否则会sonarqube会连接失败)

6.2 sonarqube 指定jdk
本步骤视情况必要而修改,如有需要指定jdk版本则修改文件:
C:\sonar9.0\conf\wrapper.conf文件最前面添加jdk路径
wrapper.java.command= C:\Program Files\Java\jdk-11.0.12\bin\java.exe
6.3 修改/home/sonar/sonarqube-9.0/conf
为方便配置环境变量先将sonar9.0和sonar-scanner-4.6传入服务器sonar用户下,将客户端放在sonarqube-9.0中。
在/home/sonar/sonarqube-9.0/bin建如下连接
ln -s linux-x86-64/sonar.sh sonar.sh
$vim sonar.properties
Use the following connection string if you want to use SQL Auth while connecting to MS Sql Server.
Set the sonar.jdbc.username and sonar.jdbc.password appropriately.
#sonar.jdbc.url=jdbc:sqlserver://localhost;databaseName=sonar
sonar.jdbc.url=jdbc:postgresql://10.6.9.38:5432/postgres?databaseName=sonardb
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.sorceEncoding=UTF-8
sonar.login=admin
sonar.password=235711
By default, ports will be used on all IP addresses associated with the server.
#sonar.web.host=0.0.0.0
sonar.web.host=10.6.9.38
TCP port for incoming HTTP connections. Default value is 9000.
#sonar.web.port=9000
sonar.web.port=9090
6.4 修改sonar-scanner
/home/sonar/sonarqube-9.0/sonar-scanner/conf/
$vim sonar-scanner.properties
#----- Default SonarQube server
sonar.host.url=http://10.6.9.38:9090
#----- Default source code encoding
sonar.sourceEncoding=UTF-8
#----- login user and password
sonar.login=admin
sonar.password=235711
配置D:\Sonar\sonar-scanner4.7\bin\sonar-scanner.bat
在最前面添加,以使其找到扫描文件:
cd D:\Sonar\test
6.5 修改sonar用户环境变量
$ vim .bash_profile
export SONAR_HOME=/home/sonar/sonarqube-9.0
export JAVA_HOME=/usr/java/jdk-11.0.12
export CLASSPATH=.:
J
A
V
A
H
O
M
E
/
l
i
b
:
JAVA_HOME/lib:
JAVAHOME/lib:JAVA_HOME/jre/lib
export PATH=
J
A
V
A
H
O
M
E
/
b
i
n
:
JAVA_HOME/bin:
JAVAHOME/bin:JAVA_HOME/jre/bin:
S
O
N
A
R
H
O
M
E
/
b
i
n
:
SONAR_HOME/bin:
SONARHOME/bin:SONAR_HOME/sonar-scanner/bin:$PATH
6.6 修改postgresql 配置文件使能够远程连接数据库
1.C:\Program Files\PostgreSQL\13\data\ pg_hba.conf
IPv4 local connections:
host all all 127.0.0.1/32 scram-sha-256
host all all 0.0.0.0/0 scram-sha-256
host all all 192.168.1.0/24 md5
host all all 0.0.0.0/0 md5
第一条表示允许网段192.168.1.0所有主机使用所有合法的数据库用户名访问数据库,并提供加密的密码验证。
第二条表示允许所有主机使用所有合法的数据库用户名访问数据库,并提供加密的密码验证。
2.C:\Program Files\PostgreSQL\13\data\postgresql.conf
编辑配置文件postgresql.conf,去掉前面的#,修改为listen_addresses = ‘*’

最后如果出现兼容性问题,如es7与rehl6.2兼容问题,采取sonar服务与数据库分别部署在不同操作系统(如sonar9放在windows上)的进行方法解决,只需更改前台IP地址即可。
6.7 插件配置
插件配置见前面第四节,注意配置pdf报告时要在前台配置管理员用户密码:
pdf服务器存放位置:Sonar\sonarqube\pdf-files


6.8 遇到的一些问题
虽然在Linux上应为兼容性问题sonar9没能启动成功,但发现的坑同样记录下:
-
failed to obtain node locks, tried [[D:\sonarqube-9.0.0.45539\data\es7]] with lock id [0];
解决:删除D:\sonarqube-9.0.0.45539\data的node文件【安装目录下的data下的node文件】
原因:可能node是原先es被占用,导致启动异常 -
Failed to create table schema_migrations
连接问题
sonar的数据库sonardb使用postgres用户 -
前台无法远程访问,配置实际IP
sonar.web.host=192.168.23.7 -
Linux:启动es报错
java.lang.UnsupportedOperationException: seccomp unavailable: CONFIG_SECCOMP not compiled into kernel,
CONFIG_SECCOMP and CONFIG_SECCOMP_FILTER are needed
错误描述:
ElasticSearch集群启动错误,错误的原因是:因为Centos6不支持SecComp,而ES默认bootstrap.system_call_filter为true进行检测,
所以导致检测失败,失败后直接导致ES不能启动解决:修改elasticsearch.yml
问题解决:
在所有节点的elasticsearch.yml配置文件中加入:
bootstrap.memory_lock: false
bootstrap.system_call_filter: false -
system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk
解决:
Centos6不支持SecComp,而ES5.2.0默认bootstrap.system_call_filter为true
禁用:在elasticsearch.yml中配置bootstrap.system_call_filter为false,注意要在Memory下面:
bootstrap.memory_lock: false
bootstrap.system_call_filter: false -
max number of threads [1024] for user [sonar] is too low, increase to at least [4096]
解决办法:
1.切换至root用户
su root
- 修改limits.d目录下的配置文件:
vi /etc/security/limits.d/90-nproc.conf