此文记录使用sonar中遇到的坑以及解决方法。先介绍一下我的环境

SonarQube 版本:6.5

SonarQube OS:Centos 7

MySQL 版本:5.7

SonarScaner 版本:3.0.3

SonarScanner OS:Win 10

SonarQube 配置

配置文件在conf目录下,以下是最简单的配置。需要注意的是jdbc url上的一堆参数。

sonar.jdbc.username=   # 数据库用户名
sonar.jdbc.password= # 数据库密码
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
sonar.web.port= #访问端口 默认是9000
sonar.path.logs= #日志路径

启用token

SonarScanner的配置文件中需要配置SonarQube的用户名和密码。但这种配置方式具有安全隐患,可以开启使用token。在SonarQube的Web上:右上角[我的账户]-[Tokens]中。开启后可以通过在SonarScanner中的sonar.login=中配置该token即可。此时不需要配置sonar.password=。下面是一个典型的SonarScanner配置文件。

sonar.host.url=https://sonar.lefer.cn
sonar.sourceEncoding=UTF-8
sonar.login=58212312286f49bb2f03000ad9c20fb0d2e #此处是token,如果配置的是用户名,则还要继续配置sonar.password
#sonar.password=

扫描Java项目

在java项目的根目录中添加一个sonar-project.properties文件。

# 项目的唯一标识
sonar.projectKey=cdss:cdss
# 项目的名称
sonar.projectName=cdss
# 项目的版本号
sonar.projectVersion=1.0.0
# 项目的源码路径 .代表是当前路径
sonar.sources=.
# 项目的编码格式,java项目基本都是UTF-8
sonar.sourceEncoding=UTF-8
# 项目的编译后的二进制文件所在目录。maven项目通常是在target下
sonar.java.binaries=./target

扫描多模块的Java项目

区别主要是在sonar-project.properties文件的配置中。

sonar.projectKey=cdrapp:cdrapp
sonar.projectName=winnig-cdr
sonar.projectVersion=1.0.0
sonar.sources=.
# 配置模块,用逗号隔开
sonar.modules=winning-cdr-admin,winning-cdr-core,winning-cdr-core-api,winning-cdr-dao,winning-cdr-entity,winning-cdr-utils,winning-cdr-website
# 配置各个模块的名字
winning-cdr-admin.sonar.projectName=winning-cdr-admin
winning-cdr-admin.sonar.projectName=winning-cdr-core
winning-cdr-admin.sonar.projectName=winning-cdr-core-api
winning-cdr-admin.sonar.projectName=winning-cdr-dao
winning-cdr-admin.sonar.projectName=winning-cdr-entity
winning-cdr-admin.sonar.projectName=winning-cdr-utils
winning-cdr-admin.sonar.projectName=winning-cdr-website
sonar.sourceEncoding=UTF-8
# 配置各个模块的target目录
sonar.java.binaries=./winning-cdr-admin/target,./winning-cdr-core/target,./winning-cdr-core-api/target,./winning-cdr-dao/target,./winning-cdr-entity/target,./winning-cdr-utils/target,./winning-cdr-website/target

扫描C#项目

C#项目的扫描比Java项目还要简单点。sonar推荐使用MSBuild 14以上,即C#项目编译水平选择.net framework 4.5以上。C#项目的.cs文件,不能是中文名称,否则会出现意料不到的错误。C#的编码通常是windows-1252。

sonar.projectKey=bi:ui-engine
sonar.projectName=ui-engine
sonar.projectVersion=1.0
sonar.sources=.
sonar.sourceEncoding=windows-1252

nginx额外配置

SonarScanner扫描完成后会将结果发往SonarCube。如果SonarCube前通过nginx转发,需要额外在nginx的配置文件里增加client_max_body_size配置项。这是因为扫描结果传输时会大于nginx的默认值1MB,使用默认值会报413 Request Entity Too Large

{
client_max_body_size 20M;
}

MySql额外配置

如果项目规模比较大,SonarScanner扫描完成后的结果也会比较大,这时往MySql数据库中插入的时候也会报错。从SonarScanner的能看到的错误信息是500 内部错误。这是因为MySql的max_allowed_packet的默认大小是4Mb。需要进入Mysql命令行做以下操作:

set global max_allowed_packet = 2*1024*1024*10
show VARIABLES like '%max_allowed_packet%';

修改完成后需要重新启动SonarCube。

END