1.前提:我们需要知道 Jenkins、SonarQube、JaCoCo和Junit。

2.至于如何集成它们,可以参考:Jenkins集成SonarQube、JaCoCo、Junit使用问题汇总

3.我这里主要是记录两个问题:Jenkins GC limit exceed 、覆盖率报告jacoco.exec不能同步到sonar

4.为什么Jenkins会内存溢出。原因是运行完所有单元测试后,它会扫描所有类并且生成jacoco.exec,这个时候如果项目中存在一些特别大的比如说几万行的接口类或者工具类,就会导致了内存溢出。

5.那么,为什么覆盖率报告jacoco.exec不能同步到sonar。原因是 pom.xml配置 org.apache.maven.plugins 这个 plugin的时候,如果我们添加了maven运行参数,比如增加内存设置,我们要注意到${argLine}:

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-surefire-plugin</artifactId>
	<version>2.5</version>
	<configuration>
		<argLine>${argLine} -Xms128m -Xmx6114m -XX:PermSize=1024m -XX:MaxPermSize=128m</argLine>
	</configuration>
</plugin>

: 记得写上 ${argLine} ,不然覆盖率没办法进入到sonar。 

6.好了,接下来说说如何解决这两个问题。

1) 内存溢出

上面说到原因就是类文件太大了。而Jenkins扫描代码这一步,我们可以设置sonar的exclusions,比如:

<properties>
	<java.version>1.8</java.version>
	<!--Sonar -->
	<sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
	<sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
	<sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>
	<sonar.language>java</sonar.language>
	<sonar.exclusions>
		**/beans/**/*.java, **/model/*.java
	</sonar.exclusions>
</properties>

过滤的表达式可以参考 :

2) 覆盖率为0

不同网友都有不同的解释,有的说因为没有sonar规则,有的说configuration和executions的放置顺序问题,有的甚至说换plugin。反正我仓试过几十遍都不可以,然后是在org.apache.maven.plugins这个plugin的argLine最前面加上${argLine}才可以,多亏了这篇文章:Jenkins集成SonarQube、JaCoCo、Junit使用问题汇总。因为当时实在找不出原因所以干脆跟着这篇文章重新设置pom.xml后就可以了,虽然覆盖率还是很低。

7.值得一提的是,假设我们一个maven项目有三个module,分别是a,b,c,那么我们需要在子module的pom.xml都增加sonar配置,至于org.jacoco的destFile是不是一致都无所谓,因为jacoco默认是append的,而sonar也会扫描workplace下的所有.exec后缀的文件。

8.覆盖率进去后,就开始无休止地根据checkmarx来修改:bug, code smell, vulneraility 了。

总的来说,里面的规范大致总结如下,下次写代码时注意一下就可以了:

1.indexOf中使用 ''
2.变量名/方法名 使用驼峰命名法
3.处理File.delete返回的结果
4.注释中最好不要出现 {}
5.不要直接抛出Exception
6.涉及到stream/reader/client的,尽量写到try () 中,且不需要手动close了
7.嵌套的子try/catch分离为另一个方法
8.字符串拼接建议使用StringBuffer
9.null == obj 条件后不应该加 || 或者 &&

附:

1.我pom.xml中和Jenkins相关的配置:

<properties>
	<java.version>1.8</java.version>
	<!--Sonar -->
	<sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
	<sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
	<sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>
	<sonar.language>java</sonar.language>
	<sonar.exclusions>
		**/beans/**/*.java, **/model/*.java
	</sonar.exclusions>
</properties>

<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-surefire-plugin</artifactId>
				<version>2.5</version>
			</plugin>
			<plugin>
				<groupId>org.sonarsource.scanner.maven</groupId>
				<artifactId>sonar-maven-plugin</artifactId>
				<version>3.0.1</version>
			</plugin>
			<plugin>
				<groupId>org.jacoco</groupId>
				<artifactId>jacoco-maven-plugin</artifactId>
				<version>0.7.9</version>
				<configuration>
					<destFile>${sonar.jacoco.reportPath}</destFile>
					<append>true</append>
				</configuration>
				<executions>
					<execution>
						<id>agent</id>
						<goals>
							<goal>prepare-agent</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>

 

2.checkmarx report的参数解释文档:https://checkmarx.atlassian.net/wiki/spaces/KC/pages/589988199/CxOSA+Viewer+v8.8.0