SonarQube无法读取Python应用coverage XML覆盖率报告问题求助
问题说明
基于pipenv管理依赖的Python项目在Jenkins流水线中执行代码质量扫描时,命令行执行coverage report可正常输出覆盖率统计结果,但SonarQube页面始终无法展示对应覆盖率数据,当前使用的Jenkinsfile配置片段如下:
stage('Install dependencies') { steps { echo('....Install dependencies & Create VirtualEnvironment ..') sh 'pip3 install --user pipenv' sh 'pipenv --rm || exit 0' sh 'pipenv install --pre --dev' } }
stage('Unit & Integration tests') { steps { echo('.... Unit & Integration tests') sh "pipenv run coverage run --source=application/src/jobs -m pytest -v --junit-xml=reports/report.xml ." sh "pipenv run coverage report" stash includes: '*', name: 'workspace' stash includes: 'reports/*' , name: 'reports' } }
stage('Build & SonarQube analyses') { agent { label 'node14' } steps { echo('Build & SonarQube analyses') unstash 'reports' sh '/opt/sonar-scanner/bin/sonar-scanner \ -Dsonar.projectKey=$sonarProjectKey \ -Dsonar.sources=./application/src/ \ -Dsonar.host.url=$sonarHost \ -Dsonar.login=$sonarApiKey \ -Dsonar.python.coverage.reportPaths=./reports/report.xml \ -X ' } }
排查修复方案
- 核心配置错误:传入SonarQube的覆盖率文件类型错误
现有配置中-Dsonar.python.coverage.reportPaths指向的./reports/report.xml是pytest通过--junit-xml生成的单元测试执行结果文件,仅记录用例运行的通过/失败/报错状态,不包含任何代码覆盖率统计数据,SonarQube无法从该文件解析出覆盖率信息。
修复操作:- 在测试阶段新增命令,生成SonarQube支持的Cobertura格式XML覆盖率报告,在
pipenv run coverage report行后追加如下步骤:sh "pipenv run coverage xml -o reports/coverage.xml" - 修改sonar-scanner启动参数中的覆盖率路径配置,指向正确生成的覆盖率报告,替换原有错误的路径配置:
-Dsonar.python.coverage.reportPaths=./reports/coverage.xml
- 在测试阶段新增命令,生成SonarQube支持的Cobertura格式XML覆盖率报告,在
- 跨节点文件传输校验
Sonar扫描阶段使用了label 'node14'的独立执行节点,与测试运行节点不共享本地工作空间,完全依赖stash/unstash逻辑同步报告文件。现有stash配置includes: 'reports/*'仅匹配reports目录下的一级文件,不会递归抓取子目录内容,建议修改为递归匹配规则避免文件遗漏:
可在unstash步骤后增加stash includes: 'reports/**' , name: 'reports'sh 'ls -l reports/'命令,打印扫描节点上reports目录的文件列表,确认coverage.xml文件存在、大小正常,排除文件传输失败、文件为空的问题。 - 覆盖率统计范围匹配校验
当前coverage采集代码范围为--source=application/src/jobs,但Sonar配置的源码扫描范围是./application/src/,两者统计范围不一致会导致覆盖率数据和Sonar侧的源码文件无法映射,最终不展示覆盖率。如果需要统计全路径源码的覆盖率,将coverage的source参数调整为--source=application/src,与sonar.sources配置保持一致即可。 - 日志排查方式
现有sonar-scanner命令已加-X参数开启debug级日志,执行扫描时可在控制台日志搜索Python Coverage Sensor关键字,日志会明确打印报告查找结果、成功解析的覆盖率条数、源码文件匹配情况,根据日志提示的报错(如找不到报告、文件路径不匹配)针对性调整配置即可。
内容的提问来源于stack exchange,提问作者Smaillns
相关产品推荐
相关产品推荐

