SonarQube 和 Lcov 报告无法解析文件路径

Posted

技术标签:

【中文标题】SonarQube 和 Lcov 报告无法解析文件路径【英文标题】:SonarQube and Lcov report Could not resolve file paths 【发布时间】:2019-01-23 12:29:54 【问题描述】:

我们正在尝试为我们的 Angular 应用程序制作 SonarQube 代码覆盖率报告。我们使用 Karma 生成代码覆盖率报告并将其导入 SonarQube 分析器。

SonarQube 已经为我们的项目提供了 C# 覆盖,现在我们还想添加 javascript 代码覆盖。

Teamcity 调用,Karma 并创建代码覆盖率并将 lcov 文件和报告文件放入 src\Planning.Spa\Coverage\report 文件夹。

LCOV 文件

TN:
SF:E:/a03/work/bb52cb33e083fc9/src/Planning.Spa/Offer/app/app.component.js
FN:5,(anonymous_1)
FN:6,AppComponent
FN:8,(anonymous_3)
FN:9,(anonymous_4)

Teamcity 配置了以下 MSBuild 参数以生成 C# 代码覆盖率和 JavaScript 覆盖率。

SonarQube MSBuild 配置

$sonar=%system.MSBUILD_SONARQUBE_RUNNER%\MSBuild.SonarQube.Runner.exe 
begin /k:"com.test:Test" /n:"MyProject" /v:"%build.number%" 
/d:sonar.cs.dotcover.reportsPaths="$coverageReport" 
/d:sonar.cs.nunit.reportsPaths="$testResults" 
/d:sonar.javascript.lcov.reportPaths="coverage\report\lcov.info"

在运行 SonarQube 分析时,我们收到以下错误

[14:35:56][Step 13/13] 14:35:56.243 WARN: Could not resolve 114 file paths in
 [E:\a03\work\bb52cb33e083fc9\src\Planning.Spa\coverage\report\lcov.info], 
first unresolved path: E:/a03/work/bb52cb33e083fc9/src/Planning.Spa/Offer/app/app.component.js

我们没有找到任何使用 MSBuild 运行程序同时运行 C# 和 JavaScript 的示例。也找不到与此Could not resolve file paths相关的任何答案

我们正在努力使其在过去 2 周内正常工作,但找不到任何有用的示例或答案。 here 和 here 类似的问题没有得到解答

更新声纳分析提供更多信息

[14:35:43][Step 13/13] 14:35:43.751 INFO: Base dir: E:\a03\work\bb52cb33e083fc9\src\Planning.Spa
[14:35:43][Step 13/13] 14:35:43.751 INFO: Working dir: E:\a03\work\bb52cb33e083fc9\.sonarqube\out\.sonar\com.Planning_com.Planning_6CC487F0-8283-4351-9B65-F1698B1B804E
[14:35:43][Step 13/13] 14:35:43.755 INFO: Source paths: Offer/App/app.component.js, Offer/App/app.component.js.map, Offer/App/Common/order-by.pipe.js
[14:35:43][Step 13/13] 14:35:43.755 INFO: Source encoding: UTF-8, default locale: en_US
[14:35:43][Step 13/13] 14:35:43.755 INFO: Index files
[14:35:43][Step 13/13] 14:35:43.756 INFO: Excluded sources: 
[14:35:43][Step 13/13] 14:35:43.756 INFO:   Offer/Scripts/**
[14:35:43][Step 13/13] 14:35:43.756 INFO:   Offer/libs/**
[14:35:43][Step 13/13] 14:35:43.757 INFO: Analyzer working directory contains 5 .pb file(s)

[14:35:43][Step 13/13] 14:35:43.898 DEBUG: 'Offer/App/app.component.js' indexed with language 'js'
[14:35:43][Step 13/13] 14:35:43.898 DEBUG: 'Offer/App/app.component.js.map' indexed with language 'null'
[14:35:43][Step 13/13] 14:35:43.953 INFO: 1010 files indexed
[14:35:43][Step 13/13] 14:35:43.953 INFO: 111 files ignored because of inclusion/exclusion patterns
[14:35:43][Step 13/13] 14:35:43.953 INFO: Quality profile for cs: Sonar C# Planning SIM
[14:35:43][Step 13/13] 14:35:43.953 INFO: Quality profile for js: Sonar way


[14:35:43][Step 13/13] 14:35:43.979 DEBUG: 'JavaSquidSensor' skipped because there is no related file in current project
[14:35:43][Step 13/13] 14:35:43.980 DEBUG: Sensors : CSS Analyzer Sensor -> Embedded CSS Analyzer Sensor -> JavaScript Squid Sensor -> C# -> SonarJavaXmlFileSensor -> Web -> XML Sensor
[14:35:43][Step 13/13] 14:35:43.980 INFO: Sensor CSS Analyzer Sensor [css]

[14:35:51][Step 13/13] 14:35:51.314 INFO: Sensor JavaScript Squid Sensor [javascript]
[14:35:51][Step 13/13] 14:35:51.316 INFO: 57/57 source files have been analyzed
[14:35:51][Step 13/13] 14:35:51.344 INFO: 153 source files to be analyzed

[14:35:55][Step 13/13] 14:35:55.145 DEBUG: 'Offer/App/app.component.js' generated metadata  with charset 'UTF-8'

[14:35:56][Step 13/13] 14:35:56.243 WARN: Could not resolve 114 file paths in [E:\a03\work\bb52cb33e083fc9\src\Planning.Spa\coverage\report\lcov.info], first unresolved path: E:/a03/work/bb52cb33e083fc9/src/Planning.Spa/Offer/app/app.component.js
[14:35:56][Step 13/13] 14:35:56.237 INFO: Test Coverage Sensor is started
[14:35:56][Step 13/13] 14:35:56.239 INFO: Analysing [E:\a03\work\bb52cb33e083fc9\src\Planning.Spa\coverage\report\lcov.info]
[14:35:56][Step 13/13] 14:35:56.243 INFO: Sensor JavaScript Squid Sensor [javascript] (done) | time=4929ms
[14:35:56][Step 13/13] 14:35:56.243 INFO: Sensor C# [csharp]

更新SonarJS实际java代码

https://github.com/SonarSource/SonarJS/blob/3.2.0.5506/sonar-javascript-plugin/src/main/java/org/sonar/plugins/javascript/lcov/LCOVParser.java#L146

不知何故,sonarqube 忽略了我从其文件系统中的绝对路径并将 inputFile 设置为 null

InputFile inputFile = context.fileSystem().inputFile(context.fileSystem().predicates().hasPath(filePath));

我尝试使用 Gulp 将绝对值修改为相对值,并将 \ 更改为 /。但没有任何效果。

SonarQube 版本 6.5.0.27846

SonarJs 版本 3.2.0.5506

【问题讨论】:

您使用的是哪个版本的 sonarqube 和 sonarJS 插件? @dubes 它是SonarQube 6.5 SonarJS 是 4.x?还是仍在使用 3? @dubes,对不起,我无法访问 sonarqube 服务器来检查它。 我认为您的 sonarjs 插件是 3.x,因为您使用的是 sonar.javascript.lcov.reportPath 和文档:docs.sonarqube.org/display/PLUG/… 说它已从 4.0 中删除。我已经根据这些假设提供了答案 【参考方案1】:

我的用例有点相似,但用于不同的技术堆栈:Java + React+ Gradle。为了让声纳在 sonarqube 5.6 + SonarJS 3.x 上显示我的 javascript 模块的覆盖信息,我必须这样做:

阅读您的研究和 sn-ps,我认为您引用的伊斯坦布尔问题不适用,因为 lcov 文件包含绝对路径。 我的猜测是您必须提供:sonar.sourcessonar.tests 属性。

为了完整起见,我在下面发布了我的 gradle 配置的整个 sn-p,并将为其下面的每个属性提供解释:

sonarqube 
    properties 
        property "sonar.javascript.file.suffixes", ".js,.jsx"
        property "sonar.sourceEncoding", "UTF-8"
        property 'sonar.sources', 'public, src'
        property 'sonar.tests', 'src'
        property 'sonar.coverage.exclusions', '**/__tests__/**'
        property 'sonar.test.inclusions', '**/__tests__/**'
        property 'sonar.javascript.lcov.reportPath', 'coverage/lcov.info'
        property 'sonar.genericcoverage.unitTestReportPaths', 'testResults/sonar-report.xml'
    

sonar.javascript.file.suffixes : AFAIR 我必须提供它来安抚 gradle sonarqube 插件,因为我在 sonarqube 服务器中看到的默认设置是相同的。

sonar.sourceEncoding :它也导致处理文件时出错,但我认为这是因为我的本地设置。

sonar.sourcessonar.tests :我记得我必须提供这些,因为没有它们,声纳无法找到我的任何资源来处理。我清楚地记得这一点,因为我从来不需要为我的 java 源提供任何此类信息。

sonar.coverage.exclusions :需要获取正确的覆盖信息。

sonar.test.inclusions :sonarjs 插件需要它来识别我的测试文件。

sonar.genericcoverage.unitTestReportPaths:我还想在我的仪表板中看到单元测试的贡献,所以我不得不将我的笑话报告处理成通用的声纳格式。

【讨论】:

我没有指定 sonar.test.inclusions,因为 spec.js 文件位于我们拥有 .js 文件的同一级别/文件夹中。你能告诉我lcov路径在你的情况下是什么样子的吗?我不确定如何从 Karma 创建 .xml 单元测试报告。我也会检查的。 现在一切正常,这似乎是我们服务器的问题。我不知道他们更新了什么。但相同的配置工作正常。你对理解它的工作原理有很大帮助:) 值得为你提供赏金! 谢谢!很高兴能帮上忙! 你用什么插件生成sonar-report.xml文件?我还需要更新仪表板中的计数。我正在使用github.com/karma-runner/karma-coverage,但不幸的是它没有 xml 报告将其发送到 SonarQube 我使用了npmjs.com/package/jest-sonar-reporter,这看起来很有前途npmjs.com/package/karma-sonarqube-reporter

以上是关于SonarQube 和 Lcov 报告无法解析文件路径的主要内容,如果未能解决你的问题,请参考以下文章

SonarQube 没有从 lcov 读取 javascript 测试覆盖率

SonarQube:扫描过程忽略 lcov.info

lcov.info 没有被 sonarqube 扫描

Sonarqube 默认覆盖范围为 0,来自具有绝对路径的 Karma Coverage LCOV 文件

lcov 和 gcovr -r 命令正在为 UT 生成 cpp 文件代码覆盖率报告

声纳覆盖率:lcov 覆盖率报告中的文件路径不正确