后台代码覆盖率(jacoco)数据为空的问题排查过程

今天有测试的同事反馈新接入的一个项目,覆盖率数据都是空的情况。所以专门花了点时间去排查

问题

首先接入到我们覆盖率的页面,看到的情况就是如下:


20201218104148202.png

覆盖率为0%。 因为出现这种情况的话,还并不能说明覆盖率后台存在有问题。因为有的时候代码的改动很多都是数据库操作的一些语句或者注释等等,针对这些修改 jacoco是不会将其判定为修改的文件。所以还要先确认下改动的文件是否有内容。

所以还是直接查询下数据库最方便了, 下面这张表是我们计算的代码diff的表。

在这里插入图片描述

改动的文件还是很多的,到这里就能够判断出来不是代码diff判断逻辑的问题了。

这个时候还想到另外一个可能性,因为我们的后台覆盖率的数据是通过tcp的连接到容器的实例,然后拉取的jacoco.exec的覆盖率文件的。所以还要确认覆盖率拉取是否ok. 看了下日志拉取的逻辑都是正常的。所以又排除了这个原因。

最后我们再进入到覆盖率的报告目录页面发现不管是全量还是增量的报告数据都是空的了,这些就有点麻烦了,因为涉及定位到这里的话,基本就已经能够怀疑问题肯定在jacoco的源码上了。

源码分析

断点调试了以后发现问题竟然出现在这里。因为jacoco的覆盖率分析需要3个内容,源码目录,服务的jar或者war包, jacoco的覆盖率数据。发现jacoco在解析jar的时候发现这个并不是一个标准的jar包文件 然后直接返回跳过了jar的解析了。我们来看下断点的情况。

在这里插入图片描述

断点在读取这个jar包头的时候,并没有进入到正常的GZIP或者zip的判断逻辑,而是直接返回了UNKONW的情况。这个就有点不太符合逻辑了

这个jar有啥问题吗?尝试去解压这个jar。我们通过命令jar -xvf xxx.jar 发现并没有任何的输出打印的信息。这个跟之前平时的jar包解压还是真有区别的。

[图片上传失败...(image-1f1e77-1609501614883)]

解决方案

这个时候实在没有太多的思路了,只能够尝试google下来解决了,发现还真的找到了一些答案

springboot打成jar包后无法解压

why cannot extract spring boot executable jar

在这里插入图片描述
在这里插入图片描述

上述的两个截图就已经给了很好的解释了,就是由于开发打包的时候使用了spring-boot-maven-plugin 这个插件 同时启用了executable 为true导致了这个问题。

你可能感兴趣的:(后台代码覆盖率(jacoco)数据为空的问题排查过程)