一、背景及目的
1、公司的后台项目基本上都是Java开发的,但是缺少代码code review流程,有些bug(比如:空指针)能在代码层面就能发现,就可以有效地缩短功能测试时间,提高交付效率。
2、重构工厂后端项目(企业云saas平台),在代码层面扫描测试 ,可以尽可能减少或杜绝一些基本、低级的bug流转到功能测试阶段,而且有些可能是功能测试发现不了的bug。
二、项目链接
待部署到阿里云服务器
三、命令行创建mysql容器
1、创建mysql_sonar的目录,cd mysql_sonar,执行docker命令:
docker run -p 33846:3306 --name mysql -v $PWD/conf/my.cnf:/etc/mysql/my.cnf -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=asdf -d mysql:5.7
$PWD 就是mysql_sonar目录的路径;
conf目录下面创建my.cnf文件,配置 文件写入mysql数据太大报错的问题。
写入MySQL报错超出 max_allowed_packet 的问题(扫描订单系统的报告超过了10Mb,报错):
配置可写入mysql最大数据为100Mb
show variables like '%max_allowed_pack%';
(100 * 1024 * 1024 = 104857600,手动修改后,需要重启mysql容器)
2、docker exec -it mysql bash
3、mysql -u root -p
4、create database sonar;
#添加远程登录用户
5、CREATE USER 'sonar'@'%' IDENTIFIED WITH mysql_native_password BY 'sonar';
6、GRANT ALL PRIVILEGES ON *.* TO 'sonar'@'%';
如果报错:ERROR 1396 (HY000): Operation CREATE USER failed for 'sonar'@'%'
delete from mysql.user where user='sonar'; 删除用户
flush privileges;
再创建远程登录用户
四、创建本地已经安装好插件(包括中文、p3c插件)的sonarqube(优先安装)
1、docker run --name sonarqube --link=mysql:mysql \
-v /opt/sonarqube/logs:/opt/sonarqube/logs \
-v /opt/sonarqube/conf:/opt/sonarqube/conf \
-v /opt/sonarqube/data:/opt/sonarqube/data \
-v /opt/sonarqube/extensions:/opt/sonarqube/extensions \
-v /opt/sonarqube/lib/bundled-plugins:/opt/sonarqube/lib/bundled-plugins \
-v /opt/sonarqube/extensions/plugins:/opt/sonarqube/extensions/plugins \
-v /opt/sonarqube/lib/common:/opt/sonarqube/common \
-e SONARQUBE_JDBC_URL="jdbc:mysql://mysql:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false" -e SONARQUBE_JDBC_USERNAME=sonar -e SONARQUBE_JDBC_PASSWORD=sonar \
-p 33848:9000 \
-d sonarqube:7.4-community
2、创建好本地对应的目录,/opt/sonarqube/extensions/plugins 放相关必要的插件;
3、jdbc:mysql://mysql 的端口不用宿主机的端口33846,还是需要用端口3306(容器之间通讯没有通过宿主机,所以这样是对的,猜想)
注:直接创建sonarqube(如果没有本地插件,安装这个)
docker run -d --name sonarqube -p 9001:9000 -p 9092:9092 --link=mysql:mysql -e SONARQUBE_JDBC_USERNAME=sonar -e SONARQUBE_JDBC_PASSWORD=sonar -e SONARQUBE_JDBC_URL="jdbc:mysql://mysql:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false" sonarqube:7.1
启动ok,查看控制台进行访问IP:9001
,默认账号密码:admin/admin
。
五、mvn命令分析maven框架的Java项目
/projects/create 创建新项目,选择 Java → maven , 最钟会出现如下提示:
把操作命令复制保存下来,在项目目录(pom.xml的当前目录)运行sonar命令:
mvn sonar:sonar \
-Dsonar.host.url=http://10.3.254.158:33848 \
-Dsonar.login=a2dafbbf138ef6688ac24c0b6455e87d2a146a90
(login的token是sonar初始化的时候生成的,需要记录下来,容器删除重新建,会重新生成token)
如果报错:
解决方案:mvn install (执行 install 将 maven 打成 jar 包) ,再运行sonar命令即可
六、Jenkins 集成 SonarQube Scanner 分析maven框架的Java项目
1、安装SonarQube Scanner插件
2、Jenkins中配置连接sonarqube服务器的地址,这里用到的token就是刚才在sonarqube中创建的那个token
3、配置全局工具配置,选自动安装即可
4、创建任务
5、构建选择:Execute SonarQube Scanner
这里我们只需要在Analysis properties
中配置sonar扫描的参数即可
参数说明:
参数项 | 说明 |
---|---|
sonar.projectKey | 项目Key,需要唯一,建议使用GroupId+ArtifactId |
sonar.projectName | 项目名称,跟ArtifactId保持一致即可 |
sonar.projectVersion | 项目版本,跟pom.xml保持一致即可 |
sonar.java.source | jdk的版本号 |
sonar.sources | 源码目录,Java项目默认就是src,如果项目有多个module,那就需要配置为{moduleDirectory}/src |
sonar.java.binaries | 编译产出的classes目录,如果项目有多个module,那就需要配置为{moduleDirectory}/target/classes |
如果发现构建log有报错:
Caused by: net.sourceforge.pmd.lang.java.ast.ParseException: Line 34, Column 73: Cannot use lambda expressions when running in JDK inferior to 1.8 mode!
解决方案:加上sonar.java.source这个参数即可
6、构建&扫描
完成以上SonarQube Scanner配置,就可以进行项目构建,构建成功后,访问SonarQube,将在项目列表看到扫描的结果:
七、附上相关中文、p3c插件,注意,公司的定制maven的settings配置需要
1、sonar的相关插件
2、maven安装路径的settings.xml需要替换成公司的配置,不然下载不了
3、公司的settings.xml的配置的本地respository需要修改成本机的路径