SonarQube MSBuild扫描器无法排除要分析的文件

12

我们目前正在使用SonarQube Scanner for VSTS/TFS 4.1.1(该版本使用的是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

我们尝试过的:

  1. 在 TFS Build 任务中进行排除
    • 绝对路径(带反斜杠或斜杠):sonar.exclusions="$(Build.SourcesDirectory)\Source\ProjectA\Scripts\**\*.js" (覆盖率类似)
    • 相对路径:**/ProjectsA/Scripts/**/*.js
  2. 在 SonarQube 前端进行排除
    • 分析排除:**/ProjectA/Scripts/**/*.js
    • 覆盖率排除:**/ProjectB/Views/**/*.cs
  3. 使用 sonar-project.properties 进行排除:
    • 不支持,会导致以下错误:sonar-project.properties files are not understood by the SonarScanner for MSBuild

我们看到的:

SonarQube Web 界面中 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扫描器的日志如下:

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]

我们没有尝试过的:

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

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

  • 排除整个项目

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


3
这个扫描仪的主要问题在于基础路径。你可以在这里看到:Base dir: D:\agent1\_work\5\s\Source\Solution\Source\ProjectA 它包含ProjectA,所以你的过滤器 **/ProjectA/Scripts/**/*.js 将不起作用。应该改为类似于 **/Scripts/**/*.js 的形式。但是这个过滤器将从所有项目中删除所有的“Scripts”,这并不是你想要的结果。Ants通配符也不接受“..”,因此你无法向上移动目录。我有过类似的问题,最后只能删掉了我不想分析的文件。我会给你点赞的,因为我也对答案很感兴趣。 - Peska
这对于CS文件不起作用,因为构建会中断。我想知道为什么没有简单的解决方案。有些人通过创建hackish解决方案来解决这个问题,例如:https://stackoverflow.com/a/48705850/2560519 - Marcell Spies
1
如果您按照以下步骤运行构建,我就不会破坏它:1.SonarQube.Scanner.MSBuild.exe begin 2.MSBuild.exe 3.删除文件 4.SonarQube.Scanner.MSBuild.exe end。它会给您关于SonarQube中缺少文件的警告,但除此之外,一切都会很好。但正如我所说,这是一个奇怪的解决方法。我也对永久解决方案感兴趣。 - Peska
2个回答

6
部分回答:代码覆盖率排除可以在 SonarQube UI 的“组件”(即每个 MSBuild 项目)上进行配置,因此您应该能够从覆盖范围中排除 ProjectB\Views,但不能排除分析。
导航到组件页面,然后选择 管理常规设置。在 分析范围 标签下的 覆盖率排除 属性仅为此组件设置排除内容。
找到组件页面并不明显:单击 SonarQube 项目的 代码 选项卡。这将显示组件列表。单击您感兴趣的组件旁边屏幕最左侧的图标:

打开组件页面

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

组件页面


我已经检查过了。奇怪的是,所有组件的覆盖排除都是相同的。对我来说看起来像是一个UI错误。我在模块A中更改设置,然后它们会反映在模块B-n和项目全局设置中,反之亦然。 - Marcell Spies
这很奇怪。我正在使用SQ6.7。我有三个组件,并在其中两个组件以及全局级别上设置了覆盖排除(每种情况下的模式不同)。在日志输出中,字符串“INFO:Excluded sources for coverage:”出现了三次,并且在每种情况下的下一行都有预期的模式(没有组件级别模式的项目使用全局模式)。 - duncanp
同意这一点,即通用设置允许从代码覆盖范围中排除,但不允许完全分析。虽然如此,但这是朝着正确方向迈出的一步。在了解排除的过程中遇到了很多困难,但这个模糊的设置至少在覆盖范围排除中有所帮助。当运行msbuild扫描程序时,使用/d:sonar.verbose=true标志可以提供调试信息,有助于更好地理解问题。 - Praveen Nayak


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接