越来越懒得写总结了 好多都是几句话搞定orz...
sonar负责检测代码质量与查看代码覆盖率。这个工具先搭建起来可以正常使用, 但页面上各个功能都是做什么的还没有研究。
sonarqube需要用到的东西 jdk 、 mysql、 中文插件(放在SONARQUBE_HOME/extensions/plugins http://docs.codehaus.org/display/SONAR/Chinese+Pack)。
The onlyprerequisite for running SonarQube is to have Java (Oracle JRE 8 onwards orOpenJDK 8 onwards) installed on your machine.(需要jdk1.8具体信息看官网https://docs.sonarqube.org/display/SONAR/Requirements)
安装mysql
为sonarqube server创建一个数据库
CREATE DATABASE sonar CHARACTER SET utf8 COLLATEutf8_general_ci;
创建访问数据库的用户:
CREATE USER 'sonar' IDENTIFIED BY 'sonar';
配置sonar用户的权限(tips: 'sonar'@'%'可配置用户远程连接数据库 , 可参考 http://www.cnblogs.com/davidgu/p/3706663.html)
GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY'sonar'; GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';flush privileges;
安装sonarqube
在/conf/sonar.properties里面添加数据库信息:
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance
sonar.jdbc.username: sonar
sonar.jdbc.password: sonar
# Optional properties
sonar.jdbc.driverClassName: com.mysql.jdbc.Driver
配置好后保存 到bin目录下启动StartSonar.bat
SonarQube默认的端口号是9000
网页查看http://192.168.100.194:9000
安装sonarscanner
设置SONAR_RUNNER_HOME环境变量 并在PATH中加入%SONAR_RUNNER_HOME%\bin;
如果只是在Jenkins所在服务器上 使用Jenkins系统管理的默认安装就好
我scanner和qube装在了同一台服务器上,scanner下载后安装位置随意。
在scanner的bin目录下sonar-scanner.properties里加上qube的地址(如果不在同一台服务器 localhost改成qube所在ip地址)
sonar.host.url=http://localhost:9000
配置Jenkins
系统设置中配置sonarqube所在服务器的jdk
下载插件SonarQubeScanner for Jenkins
登录sonarqube页面,在我的账号中找安装项,生成token。
在Jenkins的系统管理中配置sonarqube信息,填入获取的token。
这样以后构建完就可以在Jenkins上链接到qube
Jenkins2中在Global Tool Configuration里配置scanner信息。(经过试验 发现不配置也可以)
构建项目
在maven命令行中写上
clean org.jacoco:jacoco-maven-plugin:prepare-agent install -Dmaven.test.failure.ignore=true
-Dmaven.test.failure.ignore=true作用:当测试失败时maven会自动停止构建此参数可以告诉maven忽略失败的测试继续构建
该参数的作用与在pom文件中maven-surefire-plugin插件的testFailureIgnore 这个配置属性设置为 true是一样的
<plugin><groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<testFailureIgnore>true</testFailureIgnore>
</configuration>
</plugin>
使用sonarqube:
sonar.projectKey=dd_Sonar
sonar.projectName=dd_Sonar
sonar.projectVersion=1.0
sonar.language=java
sonar.sourceEncoding=UTF-8
sonar.sources=./src (被测代码所在目录)
sonar.java.binaries=./target
sonar.java.coveragePlugin=jacoco
sonar.jacoco.reportPaths=./target/coverage-reports/jacoco-unit.exec
sonar.dynamicAnalysis=reuseReports
坑:
1、maven项目父pom有跳过测试的代码 去掉<skipTest>就可以执行测试步骤了
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
2、有的人说jacoco只是分析了单元测试的代码覆盖率 并不能执行测试 需要在pom文件中添加junit插件才可以 但是我实验的结果是 只要加入了jacoco的插件就ok。而且单元测试的结果会直接生成xml 根本不需要此插件。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>compile</scope>
</dependency>
jacoco插件
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.7.201606060606</version>
<configuration>
<!--指定生成.exec文件的存放位置-->
<destFile>target/coverage-reports/jacoco-unit.exec</destFile>
<!--Jacoco是根据.exec文件生成最终的报告,所以需指定.exec的存放路径-->
<dataFile>target/coverage-reports/jacoco-unit.exec</dataFile>
</configuration>
<executions>
<execution>
<id>jacoco-initialize</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>jacoco-site</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
有人会遇到sonar中显示了单元测试数量却没有覆盖率的情况但是我发现只要加了jacoco插件后使用clean install 就会成功的