SonarQube MSBuild Scanner 不会从分析中排除文件

Posted

技术标签:

【中文标题】SonarQube MSBuild Scanner 不会从分析中排除文件【英文标题】:SonarQube MSBuild Scanner doesn't exclude files from analysis 【发布时间】:2018-09-23 18:58:44 【问题描述】:

我们目前正在为 VSTS/TFS 4.1.1 使用 SonarQube Scanner(它正在使用 SonarQube Scanner 4.1.1)。

我们想做的事:

对于我们解决方案中的某些项目(模块),我们希望从分析和代码覆盖率统计中排除文件。这应该通过使用文件模式而不是修改 TFS 构建任务以可维护的方式完成。

项目结构:

    |- Source
      |- ProjectA
        |- Scripts (should be excluded)
        |- OwnCode
      |- ProjectB
        |- Views (only code coverage should be excluded)
        |- Presenters
        |- ...
      |- ProjectC
        |- Scripts (should be scanned)
        |- ...
      |- ...
      |- Solution.sln

我们尝试了什么:

    在 TFS 构建任务中排除 绝对路径(带反斜杠或斜杠):sonar.exclusions="$(Build.SourcesDirectory)\Source\ProjectA\Scripts\**\*.js"(与覆盖范围类似) 相对路径:**/ProjectsA/Scripts/**/*.js 在 SonarQube 前端中排除 分析排除:**/ProjectA/Scripts/**/*.js 覆盖排除:**/ProjectB/Views/**/*.cs 不包括 sonar-project.properties: 不支持并导致以下错误:sonar-project.properties files are not understood by the SonarScanner for MSBuild

我们所看到的:

SonarQube 网页界面中 Scanner Context 的日志为:

  Settings for module: Solution:Solution:6FA7B5C2-667D-4387-98B9-445617F2AC0B
  - sonar.coverage.exclusions=**/ProjectA/Views/**/*.cs
  - sonar.cs.analyzer.projectOutPath=D:\agent1\_work\5\.sonarqube\out\9
  - sonar.cs.analyzer.projectOutPaths="D:\agent1\_work\5\.sonarqube\out\9"
  - sonar.cs.roslyn.reportFilePath=D:\agent1\_work\5\s\Source\Solution\Source\ProjectA\bin\Release\ProjectA.dll.RoslynCA.json
  - sonar.cs.roslyn.reportFilePaths="D:\agent1\_work\5\s\Source\Solution\Source\ProjectA\bin\Release\ProjectA.dll.RoslynCA.json"
  - sonar.exclusions=**/ProjectA/Scripts/**/*.js
  - sonar.moduleKey=Solution:Solution:6FA7B5C2-667D-4387-98B9-445617F2AC0B
  - sonar.projectBaseDir=D:\agent1\_work\5\s\Source\Solution\Source\ProjectA
  - sonar.projectKey=Solution:Solution:6FA7B5C2-667D-4387-98B9-445617F2AC0B
  - sonar.projectName=ProjectA
  - sonar.sourceEncoding=utf-8
  - sonar.sources="D:\agent1\_work\5\s\Source\Solution\Source\ProjectA\Scripts\abc.js","..."

TFS 构建中 MSBuild Scanner 的日志为:

Base dir: D:\agent1\_work\5\s\Source\Solution\Source\ProjectA
Working dir: D:\agent1\_work\5\.sonarqube\out\.sonar\Solution_Solution_6FA7B5C2-667D-4387-98B9-445617F2AC0B
Source paths: Scripts/abc.cs, ...
Source encoding: UTF-8, default locale: en_US
Index files
Excluded sources: 
  **/ProjectA/Scripts/**/*.js
172 files indexed
0 files ignored because of inclusion/exclusion patterns
Quality profile for cs: Sonar way
Quality profile for js: Sonar way
Excluded sources for coverage: 
  **/ProjectB/Views/**/*.cs
Sensor C# Properties [csharp]
Sensor C# Properties [csharp] (done) | time=15ms
Sensor SonarJavaXmlFileSensor [java]
Sensor SonarJavaXmlFileSensor [java] (done) | time=0ms
Sensor SonarJS [javascript]

我们没有尝试的:

通过更改项目文件排除单个文件

我们不想这样做,因为它不可维护。

排除整个项目

我们只想从解决方案中的单个项目中排除一些文件夹/模式。

【问题讨论】:

此扫描仪的主要问题在于基本路径。正如您在此处看到的:Base dir: D:\agent1\_work\5\s\Source\Solution\Source\ProjectA 它包含 ProjectA,因此您的过滤器 **/ProjectA/Scripts/**/*.js 将不起作用。它应该类似于**/Scripts/**/*.js。但是,此过滤器将从所有项目中删除所有 Scripts,这不是您想要的。 Ants 通配符也不接受..,因此您无法向上移动目录。我有一个类似的问题,我最终删除了我在分析中不想要的文件。我会投赞成票,因为我也对答案感兴趣。 这不适用于 CS 文件,因为构建会中断。我想知道为什么没有简单的解决方案。有些人通过创建 hackish 解决方案来解决这个问题,例如:***.com/a/48705850/2560519 我不会破坏构建,如果你这样运行它: 1. SonarQube.Scanner.MSBuild.exe begin 2. MSBuild.exe 3. 删除文件 4. SonarQube.Scanner.MSBuild.exe end.它会给你关于 SonarQube 中丢失文件的警告,但除此之外,一切都会好起来的。但就像我说的,这是一个奇怪的解决方法。我也对永久解决方案感兴趣。 【参考方案1】:

使用项目的管理员页面排除项目 http://www.codewrecks.com/blog/index.php/2017/07/22/exclude-folders-from-sonarqube-analysis/

【讨论】:

【参考方案2】:

部分答案:可以在 SonarQube UI 中为每个“组件”(即每个 MSBuild 项目)配置代码覆盖排除项,因此您应该能够将 ProjectB\Views 从覆盖范围中排除,但不能进行分析。

导航到组件页面,然后选择管理常规设置Analysis Scope 选项卡中的 Coverage Exclusions 属性仅设置此组件的排除项。

找到组件页面并不明显:单击 SonarQube 项目的 代码 选项卡。这将显示组件列表。单击屏幕上您感兴趣的组件旁边最左侧的图标:

组件页面看起来与整个项目页面相同,但页面顶部的路径将同时显示项目和组件名称(下图中红色下划线):

【讨论】:

我检查过了。奇怪的是,所有组件的覆盖范围排除都是相同的。对我来说,这看起来像是一个 UI 错误。我更改了模块 A 中的设置,然后它们反映在模块 B-n 和项目的全局设置中,反之亦然。 这很奇怪。我正在使用 SQ6.7。我有三个组件,我在其中两个组件上设置了覆盖排除,并且在全局级别(每种情况下的模式不同)。在日志输出中,字符串“INFO: Excluded sources for coverage:”在每种情况下出现了 3 次,并且在下一行中出现了预期的模式(没有组件级模式的项目使用全局模式)。跨度> 同意这是部分的,因为在一般设置中允许排除代码覆盖范围,但不能排除整个分析。不过,这是朝着正确方向迈出的一步。努力理解排除,这种晦涩的设置至少在覆盖排除方面有所帮助。运行 msbuild 扫描器时,使用 /d:sonar.verbose=true 标志会提供有助于更好地理解问题的调试信息

以上是关于SonarQube MSBuild Scanner 不会从分析中排除文件的主要内容,如果未能解决你的问题,请参考以下文章

Analyzing .net core application with SonarQube Scanner for MSBuild

使用 SonarQube Scanner for MSBuild 控制模块名称

如何从解决方案的角度正确配置 SonarQube MSBuild Scanner?

SonarQube MSBuild Scanner 不会从分析中排除文件

SonarQube MSBuild 无法排除文件

缺少必需的参数:/ key:[Sonarqube项目密钥]