SonarQube:扫描过程忽略 lcov.info

Posted

技术标签:

【中文标题】SonarQube:扫描过程忽略 lcov.info【英文标题】:SonarQube: Scanning process ignores lcov.info 【发布时间】:2018-07-01 04:14:28 【问题描述】:

我正在扫描一个ui 项目。

源代码在typescript

gulp test-coverage 生成.js 文件(然后扫描覆盖范围)。 (每个.ts 文件在它旁边都有一个.js 文件,位于同一位置)

我将扫描仪指向lcov.info 文件,如下所示:

sonar.javascript.lcov.reportPaths=test-coverage/lcov.info

问题

lcov.info,提供.js 文件的覆盖率信息

出于某种原因,SonarQube 还提供了*.ts 文件的覆盖信息(尽管没有合并 在测试覆盖率报告中)。

这是为什么呢?

如果我明确使用

sonar.inclusions=**/*.ts

sonar.language=ts

覆盖率报告中将忽略.js 文件

如果我使用

sonar.coverage.exclusions=**/*.ts

并且没有具体的包含,这将导致 .ts.js 文件被扫描以查找错误,这将导致重复错误(毕竟,.js 文件是由他们的.ts 同行生成。

有什么建议吗?

如果 sonarqube 直接使用 lcov.info 并且不主动扫描其他文件,那么整个问题当然会消失。)

【问题讨论】:

【参考方案1】:

Dsonar.ts.coverage.lcovReportPath=lcov.info

是最终为我工作的命令,用于在 Sonarqube 中为打字稿文件添加覆盖范围。

【讨论】:

【参考方案2】:

以下所有配置一起工作,我还需要jest-sonar-reporter来生成声纳需要的XML文件。

声纳特性

npm run sonar-scanner -- \
  -Dsonar.sources=./src \
  -Dsonar.exclusions=**/node_modules/**/*,**/coverage-reports/** \
  -Dsonar.typescript.exclusions=**/node_modules/** \
  -Dsonar.typescript.lcov.reportPaths=coverage-reports/lcov.info \
  # be sure to include your test files
  -Dsonar.test.inclusions=**/__test__/*.spec.ts,**/__test__/*.test.ts \
  # generate by jest sonar reporter at <rootDir>
  -Dsonar.testExecutionReportPaths=test-report.xml \ 
  -Dsonar.coverage.exclusions=src/**/*.tsx

jest.config.json

"testResultsProcessor": "jest-sonar-reporter",

【讨论】:

【参考方案3】:

我的 Typescript 项目也遇到过同样的问题,

为了实现 Typescript 的静态代码分析和编译 Javascript 的代码覆盖率报告。像下面的 sn-p 一样配置你的声纳属性。

文件夹信息,app 文件夹包含 typescript 源文件 & build 文件夹包含已编译的 Javascript 文件

sonar.sources=app/src/,build/src
sonar.exclusions=**/node_modules/**

#Excluding app folder in code coverage analysis
sonar.coverage.exclusions=app/src/**.ts    
sonar.ts.tslint.configPath=tslint.json
sonar.javascript.lcov.reportPaths=reports/lcov.dat

由于 Javascript 用于代码覆盖,Sonar 项目具有 2 质量配置文件(Javascript 和 Typescript)。

两个质量配置文件都会分析包含的来源,最终会出现重复错误。

为了只对 Typescript 源码进行静态代码分析。需要禁用 Javascript 的所有 Linting 规则。

默认 Javascript Sonarway 质量配置文件规则不能 被定制。

要禁用所有 Javascript 规则,请创建您自己的 Javascript 质量配置文件禁用所有规则。

为您的项目配置新创建的 JavaScript 质量配置文件。

这里附上我的项目仪表板的屏幕截图 Sonarqube project dashboard with quality profile list

这个解决方案对我很有效,希望它也能帮助你!!!

【讨论】:

【参考方案4】:

如果您的源代码是用 TypeScript 编写的,则覆盖率报告 (lcov.info) 必须包含有关 TypeScript 文件的信息,而不是已编译的 JavaScript。在这种情况下,您必须使用的属性是 sonar.typescript.lcov.reportPaths

您可以查看此示例 (https://github.com/SonarSource/SonarTS-example) 以获取更多详细信息。

【讨论】:

我理解,但这并不能证明SonarQube 试图为我的lcov.info中的文件提供覆盖范围 如果我正确理解您的意思,SonarQube 会自动将报告中未包含的所有文件的覆盖率设置为 0。您可以通过忽略某些文件(报告中未包含的文件)的代码覆盖率来选择退出此行为。查看更多:docs.sonarqube.org/display/SONAR/… 我真的试过了,它奏效了。然而问题现在变成了:如何在静态代码分析(不是覆盖率报告)中包含生成的.js,正如我在问题正文中所说,使用sonar.coverage.exclusions=**/*.ts 部分解决了问题鉴于对 *.ts*.js 都进行了代码分析,而我只想要 *.ts sonar.typescript.lcov.reportPaths 现已弃用,请使用 sonar.javascript.lcov.reportPaths。参考:docs.sonarqube.org/latest/analysis/coverage

以上是关于SonarQube:扫描过程忽略 lcov.info的主要内容,如果未能解决你的问题,请参考以下文章

如何在构建docker镜像时执行SonarQube扫描.NET Core应用

Jenkins 使用 SonarQube 扫描 Coding

如何去除sonarqube自动扫描

Analyzing .net core application with SonarQube Scanner for MSBuild

我们如何忽略 Java 中的一些 SonarQube 规则?

sonarqube怎么自定义Java代码规则