sonarqube集成到aws codebuild_Sonar

(3) 2024-09-20 21:23

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
sonarqube集成到aws codebuild_Sonar,希望能够帮助你!!!。

Jacoco是面向Java的开源代码覆盖率工具,可以按照在线和离线模式统计代码覆盖率以及圈复杂度。

SonarQube是一款开源的自动代码审查平台,可以检测25+的编程语言如Java,C#,JavaScript,TypeScript,C/C++,COBOL等的代码缺陷和安全漏洞,且可以与您现有的工作流程集成,以便在项目分支和拉取请求之间进行连续的代码检查。

SonarQube也支持代码覆盖率分析,但是针对的是针对编写了单元测试的用例来进行统计分析的,如果没有写单元测试的话覆盖率数据就一直为0%,而我司研发没有写单元测试,因此只能采用Jacoco在线模式来统计代码覆盖率,本文介绍如何将Jacoco代码覆盖率的结果集成到SonarQube平台。

Jacoco生成覆盖率报告

SonarQube新版本(本文使用的是9.0.0.45539版本)集成Jacoco覆盖率需要用到Jacoco xml覆盖率报告文件,因此第一步首先是生成xml覆盖率报告,本文使用ant进行构建。

1 下载jacoco、apache-ant并解压到指定路径,将jacoco下载文件中的lib/jacocoant.jar复制到apache-ant中的lib目录下。

2 Java项目启动已增加javaagent参数,开启插桩服务(可以参考之前写的一篇文章Java代码覆盖率工具Jacoco上手指引)。

java -javaagent:/home/zx/jacoco/lib/jacocoagent.jar=includes=*,output=tcpserver,port=6300,address=*,append=true -jar demo-0.0.1-SNAPSHOT.jar --server.port=8081

3 在任意指定目录下创建build.xml文件,build.xml文件示例内容如下,关键的内容已在其中做了注释,其中增加了排除指定class文件不进行覆盖率分析的配置。

<?xml version="1.0" ?>
<project name="coverage"
         xmlns:jacoco="antlib:org.jacoco.ant"
         default="report">
	<!--Jacoco的安装路径-->
	<property name="jacocoantPath"
	          value="/home/zx/apache-ant-1.10.11/lib/jacocoant.jar"/>
	<!--最终生成.exec文件的路径,Jacoco就是根据这个文件生成最终的报告的-->
	<property name="jacocoexecPath"
	          value="./"/>
	<!--生成覆盖率报告的路径-->
	<property name="reportfolderPath"
	          value="/var/lib/jenkins/workspace/devops_demo/target/jacoco"/>
	<!--远程服务的ip地址,如有多个,可设置多个,name需修改-->
	<property name="server_ip"
	          value="192.168.2.15"/>
	<!--前面配置的远程服务打开的端口,要跟上面配置的一样-->
	<property name="server_port"
	          value="6300"/>
	<!--源代码路径-->
	<property name="demo-src"
	          value="/var/lib/jenkins/workspace/devops_demo/src/main/java"/>
	<!--.class文件路径-->
	<property name="demo-classpath"
	          value="/var/lib/jenkins/workspace/devops_demo/target/classes"/>
	<!--让ant知道去哪儿找Jacoco-->
	<taskdef uri="antlib:org.jacoco.ant"
	         resource="org/jacoco/ant/antlib.xml">
		<classpath path="${jacocoantPath}"/>
	</taskdef>
	<!--merge task,当有多个待测程序时,生成报告前需将所有.exec文件merge成一个-->
	<target name="merge"
	        depends="dump">
		<jacoco:merge destfile="jacoco.exec">
			<fileset dir="./"
			         includes="*.exec"/>
		</jacoco:merge>
	</target>
	<!--dump任务:
			根据前面配置的ip地址,和端口号,
			访问目标tomcat服务,并生成.exec文件。-->
	<target name="dump">
		<!-- reset="true"是指在dump完成之后,重置jvm中的覆盖率数据为空。append="true"是指dump出来的exec文件为增量方式 -->
		<jacoco:dump address="${server_ip}"
		             reset="false"
		             destfile="${jacocoexecPath}/jacoco.exec"
		             port="${server_port}"
		             append="true"/>
	</target>
	<!--jacoco任务:
			根据前面配置的源代码路径和.class文件路径,
			根据dump后,生成的.exec文件,生成最终的html覆盖率报告。-->
	<target name="report"
	        depends="dump">
		<delete dir="${reportfolderPath}"/>
		<mkdir dir="${reportfolderPath}"/>
		<jacoco:report>
			<executiondata>
				<file file="${jacocoexecPath}/jacoco.exec"/>
			</executiondata>
			<structure name="JaCoCo Report">
				<group name="demo">
					<classfiles>
						<fileset dir="${demo-classpath}">
              <!--exclude表示将name指定的class文件排除在覆盖率统计之外-->
							<exclude name="**/example/demo/DemoApplication.class"/>
						</fileset>
					</classfiles>
					<sourcefiles encoding="UTF-8">
						<fileset dir="${demo-src}"/>
					</sourcefiles>
				</group>
			</structure>
			<html destdir="${reportfolderPath}/report"
			      encoding="utf-8"/>
			<csv destfile="${reportfolderPath}/report.csv"/>
			<xml destfile="${reportfolderPath}/report.xml"/>
		</jacoco:report>
	</target>
</project>

4 cd到build.xml文件所在的目录执行ant命令,执行成功后最终就会在${reportfolderPath}目录下生成覆盖率报告,包括xml、csv、html格式,其中xml是SonarQube所需要的。

# 01-采集jacoco代码覆盖率报告 echo "采集Jacoco代码覆盖率" cd /home/jacoco_report ant echo "成功生成Jacoco代码覆盖率xml报告" 

5. 可以把以上命令配置到jenkins实现与其他任务集成。

SonarQube集成Jacoco覆盖率报告

SonarQube的安装与入门可以参考SonarQube源码静态安全扫描工具使用入门。

下面的命令就是sonar扫描器执行命令,扫描的结果会上报到SonarQube平台进行展现。其中需要说明两点:

1 -Dsonar.coverage.jacoco.xmlReportPaths=./target/jacoco/*.xml 这个配置项的作用就是指定jacoco生成的xml报告路径,配置的就是上面Jacoco生成的路径。

2 -Dsonar.exclusions=src/**/DemoApplication.java 这个配置是排除的扫描代码,注意这里一定要和上面Jacoco配置的排除项一致,就是说Jacoco覆盖率分析配置排除了那些class文件,也需要在sonar扫描配置中把对应的源码也排除在外,只有这样才能保证SonarQube平台展现的覆盖率和Jacoco本身的覆盖率一致。

# 02-执行sonarqube源码扫描(会分析jacco生成的xml报告并上传到sonar服务器) echo "开始执行sonar扫描..." cd /var/lib/jenkins/workspace/devops_demo mvn sonar:sonar \ -Dsonar.projectKey=devops_demo \ -Dsonar.host.url=http://192.168.2.15:9001 \ -Dsonar.login=fde14012bfb00421eaa1a \ -Dsonar.exclusions=src/**/DemoApplication.java \ -Dsonar.core.codeCoveragePlugin=jacoco \ -Dsonar.coverage.jacoco.xmlReportPaths=./target/jacoco/*.xml echo "完成sonar扫描任务"

3 同样的也可以把上面的命令加入到jenkins,命令执行成功后,SonarQube平台就可以查看到覆盖率数据了。

sonarqube集成到aws codebuild_Sonar_https://bianchenghao6.com/blog__第1张

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复