1.项目环境:
系统:Ubuntu 16.04
JDK: openjdk8
Java开发工具: Intellij IDEA 2017.2.6, Maven 3.4+ , 代码管理GitKraken, 数据库Mysql , 数据库ORM MyBatis
部署工具: Docker, Jenkins
项目技术: SpringBoot 微服务模式, SpringCloud : Eureka 服务注册&发现, Robin 客户端负载均衡, Zuul API Gateway, Hystrix 服务熔断管理, Fegin 服务调用请求封装 Redis缓存
Sonar相关:
1. 官方网址: https://www.sonarqube.org/
2. sonarqube与Docker使用的参考文档: https://hub.docker.com/_/sonarqube/
3. sonarqube的Git 链接。https://github.com/SonarSource/docker-sonarqube/blob/master/recipes.md
4. sonarqube说明
Coverage
红色:表示没有被覆盖
橙色:表示部分被覆盖
绿色:表示完全覆盖
Issues
每个issue有五个等级:
- BLOCKER:会影响应用程序的缺陷:内存泄漏,未关闭的JDBC连接…必须立刻修复的代码;
- CRITICAL :可能会影响应用程序的缺陷或者是安全性缺陷:空的catch块,sql注入,…必须立刻查看代码;
- MAJOR:可能会影响开发者效率的质量缺陷:未覆盖的代码,重复块,未使用的参数….
- MINOR:可能会影响开发者效率的质量缺陷:每行不能太长,“switch”语句应该至少有三个条件,….
- INFO:既不是缺陷也不是质量问题,只是一个发现。
Sonar结合项目使用:
1. 拉取Docker镜像:
docker pull bys-cd.chinacloudapp.cn/library/sonarqube:7.1
docker images 查看是否成功拉取。
2. 启动镜像:
docker run -d --name sonarqube
-p 9000:9000 -p 9092:9092
-e SONARQUBE_JDBC_USERNAME=$username
-e SONARQUBE_JDBC_PASSWORD=$pwd
-e SONARQUBE_JDBC_URL=‘jdbc:mysql://192.168.7.228/sonar?useUnicode=true&characterEncoding=utf8’
-v /home/beyondsoft/sonarqube/data:/opt/sonarqube/data
-v /home/beyondsoft/sonarqube/extensions:/opt/sonarqube/extensions
-v /home/beyondsoft/sonarqube/lib/bundled-plugins:/opt/sonarqube/lib/bundled-plugins
bys-cd.chinacloudapp.cn/library/sonarqube:7.1
docker ps 查看
3. Maven相关:
在工程的根节点Pom.xml中添加配置:
<properties>
<!-- Sonar & Jacoco related -->
<jacoco.version>0.8.1</jacoco.version>
<sonar.jacoco.reportPaths>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPaths>
<sonar.jacoco.itReportPath>${project.basedir}/../target/jacoco-it.exec</sonar.jacoco.itReportPath>
<sonar.language>java</sonar.language>
<sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
<sonar.inclusions>
**/fnb/service/**/*
</sonar.inclusions>
<!--<sonar.coverage.exclusions>
**/controller/**/*,
**/model/**/*,
**/utils/**/*,
**/mapper/**/*,
**/aop/**/*,
**/config/**/*,
**/exception/**/*,
</sonar.coverage.exclusions>-->
</properties>
<!-- Sonar & Jacoco related build plugin 项目插件引用-->
<build>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>${jacoco.version}</version>
<executions>
<execution>
<id>agent-for-ut</id>
<goals>
<goal>prepare-agent</goal>
</goals>
<configuration>
<append>true</append>
<destFile>${sonar.jacoco.reportPaths}</destFile>
</configuration>
</execution>
<execution>
<id>agent-for-it</id>
<phase>package</phase>
<goals>
<goal>prepare-agent-integration</goal>
</goals>
<configuration>
<append>true</append>
<destFile>${sonar.jacoco.itReportPath}</destFile>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<!-- 以上是项目插件引用-->
4. 运行命令集成:
注意:如果sonar服务运行在其他主机,需要在mvn命令中指定主机的ip地址等信息
mvn clean test sonar:sonar -Dspring.profiles.active=junit
5. 登录查看结果: http://localhost:9000
5.1 点击项目分析: 如下图示
5.2 点击需要查看的项目: 比如 msa
5.3 进入项目后会看到如下图示:
5.4 点击看到的选项: 比如bug 或者 Duplications
6. 期间遇见的问题
6.1 链接自己的mysql数据库(数据库自己都要先创建sonar模式)
官方参考链接如下。
自己最后成功的启动配置命令如下:
docker run -d --name sonarqube
-p 9000:9000 -p 9092:9092
-e SONARQUBE_JDBC_USERNAME=$username
-e SONARQUBE_JDBC_PASSWORD=$pwd
-e SONARQUBE_JDBC_URL=‘jdbc:mysql://192.168.7.228/sonar?useUnicode=true&characterEncoding=utf8’
bys-cd.chinacloudapp.cn/library/sonarqube:7.1
注意: 1. JDBC传参数要单引号起来。否则后台日志出现错:参数不是多参的格式。
2. 参数必须带useUnicode=true&characterEncoding=utf8,否则也会报错提示你。这个都是要自己启动后去主动看后台启动日志的。
6.2 链接自己的mysql数据库启动报错
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.sonarsource.scanner.maven:sonar-maven-plugin:3.4.1.1168:sonar (default-cli) on project msa: No quality profiles have been found, you probably don't have any language plugin installed. -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
这是数据库数据不对,启动镜像必须前后一致,比如使用默认latest版本链接测试的本地mysql,成功之后使用自己目前的7.1镜像,必须清除mysql数据库数据。再删除以前docker里面的容器,重新启动镜像。数据会重新导入数据库。再次启动mvn test sonar:sonar等。
6.3 挂载sonar数据文件出现问题。
[ERROR] Failed to execute goal org.sonarsource.scanner.maven:sonar-maven-plugin:3.4.1.1168:sonar (default-cli) on project msa: Unable to load component class org.sonar.scanner.bootstrap.ScannerPluginInstaller: Unable to load component class org.sonar.home.cache.FileCache: Unable to load component class org.sonar.scanner.bootstrap.GlobalConfiguration: Error 500 on http://localhost:9000/api/settings/values.protobuf : {"errors":[{"msg":"An error has occurred. Please contact your administrator"}]} -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
这是外部映射的挂载文件是空,需要把没有挂载之前容器里面的启动成功的数据先copy一份。