Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
sonarqube集成到aws codebuild_Sonar,希望能够帮助你!!!。
Jacoco是面向Java的开源代码覆盖率工具,可以按照在线和离线模式统计代码覆盖率以及圈复杂度。
SonarQube是一款开源的自动代码审查平台,可以检测25+的编程语言如Java,C#,JavaScript,TypeScript,C/C++,COBOL等的代码缺陷和安全漏洞,且可以与您现有的工作流程集成,以便在项目分支和拉取请求之间进行连续的代码检查。
SonarQube也支持代码覆盖率分析,但是针对的是针对编写了单元测试的用例来进行统计分析的,如果没有写单元测试的话覆盖率数据就一直为0%,而我司研发没有写单元测试,因此只能采用Jacoco在线模式来统计代码覆盖率,本文介绍如何将Jacoco代码覆盖率的结果集成到SonarQube平台。
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的安装与入门可以参考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平台就可以查看到覆盖率数据了。
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
上一篇
已是最后文章
下一篇
已是最新文章