Travis CI未向SonarCloud发送Jacoco报告问题排查求助
解决SonarCloud不显示Jacoco覆盖率报告的问题
我仔细梳理了你的配置和Travis日志,发现几个关键问题导致SonarCloud无法获取Jacoco的覆盖率数据,下面是针对性的修复方案:
1. 修正Travis CI脚本的命令顺序与Sonar集成逻辑
你的.travis.yml存在两个问题:一是mvn install -P test先执行了打包,后续的clean会清空之前的构建数据,导致Jacoco的测试执行记录丢失;二是同时使用Travis的sonarcloud addon和mvn sonar:sonar命令,容易引发参数冲突。
修改后的.travis.yml配置:
script: - mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent package -P test - mvn org.jacoco:jacoco-maven-plugin:report sonar:sonar addons: sonarcloud: organization: "my_organization_name_on_SonarCloud" token: secure: "${SONAR_TOKEN}"
- 先执行
clean清空历史数据,接着用prepare-agent初始化Jacoco代理,再执行package(包含测试用例运行),确保Jacoco能完整记录测试覆盖率数据 - 单独执行
jacoco:report生成标准格式的覆盖率报告,最后执行sonar:sonar把数据上传到SonarCloud - 明确配置sonarcloud的token参数,避免认证环节出现隐性问题
2. 优化sonar-project.properties的路径配置
你当前设置sonar.sources=.会把项目根目录下所有文件(包括测试代码、配置文件)都当作业务源码,这会干扰SonarCloud的覆盖率计算逻辑。需要精准指定源码和报告路径:
sonar.projectKey=my_project_key_on_SonarCloud sonar.projectName=my_project_name sonar.projectVersion=0.0.1 sonar.sources=src/main/java sonar.java.binaries=target/classes sonar.jacoco.reportPaths=target/site/jacoco/jacoco.xml
sonar.sources指定为src/main/java,只扫描业务代码sonar.java.binaries告诉SonarCloud编译后的字节码位置,帮助它关联源码和覆盖率数据sonar.jacoco.reportPaths明确指定Jacoco生成的XML报告路径,确保SonarCloud能精准读取覆盖率信息
3. 调整Jacoco插件的报告生成阶段
你的Jacoco插件把report阶段设为prepare-package,这会在打包过程中生成报告,但后续操作可能覆盖或损坏报告文件。建议把报告生成调整到测试完成后:
<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.3</version> <executions> <execution> <id>default-prepare-agent</id> <goals> <goal>prepare-agent</goal> </goals> </execution> <execution> <id>default-report</id> <phase>test</phase> <goals> <goal>report</goal> </goals> </execution> </executions> </plugin>
- 将
report的执行阶段改为test,确保测试用例执行完成后立即生成覆盖率报告,避免数据丢失
4. 验证Travis日志中的Sonar执行状态
从你的日志看到$ The command "" exited with 0.,说明Sonar扫描命令没有正确触发。修改配置后,重新触发Travis构建,应该能看到SonarScanner的完整执行日志,其中会包含覆盖率数据上传的相关记录。
完成以上修改后,SonarCloud应该就能正常展示Jacoco的覆盖率报告了。
内容的提问来源于stack exchange,提问作者Meena Chaudhary
相关产品推荐
相关产品推荐

