如何合并多项目lcov.info文件生成统一覆盖率报告并上传至SonarQube?
问题
仓库包含两个项目:
- 主项目server(位于根目录)
- 辅助项目aux/sidecar(位于aux/sidecar文件夹)
通过jest --coverage命令分别生成覆盖率文件:
- 根目录:
coverage/lcov.info - 辅助项目:
aux/sidecar/coverage/lcov.info
需要将这两个文件合并为单个覆盖率报告,上传至SonarQube查看仓库整体的统一覆盖率。尝试使用lcov-result-merger工具,编写的两个脚本均未达到预期:
- 第一个脚本:
"merge-coverage": "lcov-result-merger 'coverage/lcov.info' 'aux/sidecar/coverage/lcov.info' coverage/lcov.info"
试图将合并结果写入根项目的lcov.info,但第三个参数被忽略。
- 第二个脚本:
"merge-coverage": "lcov-result-merger './**/**/coverage/lcov.info' 'coverage/lcov.info'"
使用通配符匹配文件后,SonarQube仍显示0%覆盖率。
寻求脚本修复方案或其他可行工具。
解决方案
修复lcov-result-merger脚本问题
针对第一个脚本的修复:参数传递错误
lcov-result-merger的输出文件需要通过重定向指定,而非作为位置参数传入。修改脚本如下:
"merge-coverage": "lcov-result-merger coverage/lcov.info aux/sidecar/coverage/lcov.info > coverage/combined-lcov.info"
- 移除文件名的单引号,避免shell解析异常
- 用
>将合并结果重定向到新文件coverage/combined-lcov.info,不直接覆盖原文件,防止测试与合并流程冲突
针对第二个脚本的修复:路径匹配与SonarQube兼容
通配符./**/**/coverage/lcov.info可能匹配冗余文件,或导致合并后的文件路径与SonarQube扫描路径不匹配。调整为明确路径并生成独立合并文件:
"merge-coverage": "lcov-result-merger ./coverage/lcov.info ./aux/sidecar/coverage/lcov.info > coverage/combined-lcov.info"
之后在SonarQube配置中指定coverage/combined-lcov.info为覆盖率报告文件,确保工具能正确关联项目文件路径。
替代工具方案
如果lcov-result-merger仍存在问题,可尝试以下工具:
1. nyc(推荐)
nyc原生支持覆盖率报告合并,步骤如下:
- 在两个项目的jest配置中,将覆盖率报告格式设为
json - 运行测试生成json格式的覆盖率报告
- 使用
nyc merge命令合并并生成lcov报告:
"merge-coverage": "nyc merge ./coverage/coverage-final.json ./aux/sidecar/coverage/coverage-final.json ./coverage/combined-coverage.json && nyc report --reporter=lcov --report-dir=coverage --temp-directory=./coverage"
该命令先合并json报告,再生成标准lcov格式的合并报告。
2. lcov-tools
使用lcov-tools的merge命令,参数格式更直观:
"merge-coverage": "lcov-tools merge -o coverage/combined-lcov.info coverage/lcov.info aux/sidecar/coverage/lcov.info"
通过-o指定输出文件路径,后续传入需要合并的文件列表即可。
内容的提问来源于stack exchange,提问作者Leonardo Alves Machado
相关产品推荐
相关产品推荐

