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?