【问题标题】:Sonarscanner not analyzing netcoreapp2.2Sonarscanner 不分析 netcoreapp2.2
【发布时间】:2019-11-15 09:30:42
【问题描述】:

我正在我的 aspnetcore2.2 项目上尝试 sonarqube。

该项目使用 MSbuild 版本 - 16.1.76.45076。

当我运行官方 dotnet-sonarscanner 工具 - 版本 4.6.2 时, 只分析 CSS 代码,而不分析 C#、Javascript 和项目中的其他代码。

我尝试了以下方法,

使用不同的 MSBuild:

我已经使用不同的 MSBuild 版本进行了测试,因为 MSBuild 从 aspnetcore2.1 到 aspnetcore2.2 发生了变化

尝试过的版本

  • MSBuild - 16.1.76.45076
  • MSBuild - 15.1.0.0

两者都返回了相同的结果,即不分析 CSS 文件以外的任何文件。


使用不同的 Sonarscanner 工具:

我还继续检查了不同的声纳扫描仪工具

使用的声纳扫描仪工具

  • dotnet-sonarscanner - 4.6.2
  • dotnet-sonarscanner - 4.6.0
  • SonarScanner.MSBuild - 4.6.2 for aspnetcore2.0+
  • SonarScanner.MSBuild - 用于 aspnetcore 2.1.3
  • .NETFramework4.6

以上所有的结果都是一样的,除了 CSS 文件之外没有其他文件被分析


在 Sonarqube 中验证项目设置:

为了检查服务器端是否设置正确,我在 aspnetcore 的不同框架上进行了测试

经过测试的框架

  • aspnetcore 2.0
  • aspnetcore 2.1
  • aspnetcore 2.2

只有在aspnetcore2.2,我才遇到这个问题。

对aspnetcore2.0、aspnetcore2.1的所有文件进行C#、HTML、Javascript和CSS分析

这些还使用不同的 MSBuild 版本和声纳扫描仪工具进行了测试。


CLI 命令已尝试

这些是用于复制问题的 CLI

以下所有命令均未返回错误。

只有 CSS 文件被分析用于 aspnetcore2.2 项目

按照上述不同的组合尝试了这些命令以复制版本问题

dotnet sonarscanner begin /k:"<projectname>" /d:sonar.host.url="<sonarqserver>" /d:sonar.login="<usertoken>"
dotnet build
dotnet sonarscanner end /d:sonar.login="<usertoken>"
dotnet <pathto Sonarscanner.MSBuild.dll> begin /k:"<projectname>" /d:sonar.host.url="<sonarqserver>" /d:sonar.login="<usertoken>"
dotnet build
dotnet <pathto Sonarscanner.MSBuild.dll> end /d:sonar.login="<usertoken>"
dotnet sonarscanner begin /k:"<projectname>" /d:sonar.host.url="<sonarqserver>" /d:sonar.login="<usertoken>"
<pathto MSBuildversion.exe> build
dotnet sonarscanner end /d:sonar.login="<usertoken>"

预期结果是

  • C#、Javascript、CSS 和 HTML 代码分析

实际结果是

  • 仅分析 CSS 文件

编辑 1

回答以下问题

  • 是否列出了预期的文件 .sonarqube\out\sonar-project.properties?
  • 将属性 /d:sonar.verbose=true 添加到开始步骤并运行 再次分析步骤。然后看看结束步骤的输出 对于警告(尝试搜索一个文件的文件名 应该已经分析过了,对于“C#”)
  • 您使用的是哪个版本的 SonarQube?
  • SonarC# 插件的哪个版本?

  • 是的,它们存在于 .sonarqube\out\sonar-project.properties 中
  • /d:sonar.verbose=true到最开始的步骤经过测试和分析,这些是从输出中观察的关键点

  • 文件的索引已完成,所有文件包括 .cs、.cshtml(Razor Pages)、缩小的 js、缩小的 CSS、CSS 等都在此过程中被提取。

    李>
  • 在编制索引期间,.cshtml 文件被识别为“web”,所有其他 C# 代码被识别为“cs”语言
  • 在运行传感器阶段,仅使用了以下传感器
DEBUG: Sensors : SonarCSS Metrics -> SonarCSS Rules -> JaCoCo XML Report Importer -> C# Properties -> JavaXmlSensor -> XML Sensor.

这将启动 CSS 分析,默认情况下,它使用 node, -v, v8.12.0。处理的以下节点也用于 .cshtml 文件。 - 从其余的传感器中,得到以下输出

对于XML,文件在声纳扫描仪开始时被索引。 这个文件是我们自己的无关格式分析文件,不是sonarqube的一部分

Sensor JavaXmlSensor [java]
2 source files to be analyzed
'AnalysisFile.xml' generated metadata as test  with charset 'UTF-8'
'wwwroot/XML/AnalysisFile_16-04-2019.xml' generated metadata as test  with charset 'UTF-8'
Sensor JavaXmlSensor [java] (done) | time=1284ms

对于C#

Sensor C# Properties [csharp]
Analyzer working directory '<ProjectDir>\.sonarqube\out\0\output-cs' contains 5 .pb file(s)
Found Roslyn issues report
Sensor C# Properties [csharp] (done) | time=15ms
  1. 运行传感器再次使用小写的项目键运行。这次在 SensorC# 中没有出现要分析的文件,如下所示
Sensor C# [csharp]
No files to analyze. Skip Sensor.
Sensor C# [csharp] (done) | time=0ms
  1. Run sensors 在项目上运行,这次输出如下输出
Java CPD Block Indexer' skipped because there is no related file in current project
Sensor Zero Coverage Sensor (done) | time=0ms
  1. 此后,.cs 和 .cshtml 文件列表如下
<filename>.cshtml generated metadata as test  with charset 'UTF-8'
<filename>.cs generated metadata as test  with charset 'UTF-8'
  1. 在最后给出WARN:,然后再发布分析
WARN: Missing blame information for the following files
WARN:   * SonarQube.Analysis.xml
WARN: This may lead to missing/broken features in SonarQube
  1. 职位已发布

    • 我正在使用 Sonarqube 7.9 社区版
    • 我正在使用随 Sonarqube 7.9 Server - SonarC# - 7.15 下载的默认插件(我不确定这是否与 Sonarqube 7.9 Server 中默认安装的版本相同

    • 我对dotnetcore2.1尝试了以下步骤,分析了C#等文件

    • 如果由于内部 XML 分析文件导致分析中断,还尝试了以下操作。

问题依旧


【问题讨论】:

  • 您确实有来自此扫描仪的日志,对吗?粘贴到这里;我们会检查发生了什么。
  • @Peska 我已在 Edit1 标题下的问题中添加了日志文件,请检查。谢谢

标签: c# asp.net-mvc sonarqube continuous-integration code-analysis


【解决方案1】:

注意:这些问题是在Scanner for MSBuild repoSonarscanner Community 上提出的——Sonarscanner 社区中的答案

@armourshield 你在 S4MSB 存储库中对这个问题的最新评论说:

I wanted to test the environment if it is right with the same tools
Created new projects for dotnetcore2.1 and dotnetcore2.2
When running the sonarq analysis it ran perfectly analyzing all the files

@Duncan Pocklington

这是否意味着您的工作环境可以正确分析 netcoreapp2.2 应用程序?

如果是这样,您的工作环境和非工作环境有什么不同?


  • 是的,正在分析新的 netcoreapp2.2。

不同之处在于新创建的项目没有TestCases。 在我们的项目中,我们有 Nunit 3,使用模拟的 TestCases。

经过sonarqube的输出,找到了这个.sonarqube\out\0\ProjectInfo.xml

    <?xml version="1.0" encoding="utf-8"?>
<ProjectInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.sonarsource.com/msbuild/integration/2015/1">
  <ProjectName>project</ProjectName>
  <ProjectLanguage>C#</ProjectLanguage>
  <ProjectType>Test</ProjectType>
  <ProjectGuid>ad649366-fea7-4513-91e3-90deb56bd30c</ProjectGuid>
  <FullPath>project.csproj</FullPath>
  <IsExcluded>false</IsExcluded>
  <AnalysisResults>
    <AnalysisResult Id="FilesToAnalyze" Location=".sonarqube\out\0\FilesToAnalyze.txt" />
  </AnalysisResults>
  <AnalysisSettings>
    <Property Name="sonar.cs.roslyn.reportFilePath">project\bin\Debug\netcoreapp2.2\project.dll.RoslynCA.json|project\bin\Debug\netcoreapp2.2\project.Views.dll.RoslynCA.json</Property>
    <Property Name="sonar.cs.analyzer.projectOutPath">project\.sonarqube\out\0</Property>
  </AnalysisSettings>
  <Configuration>Debug</Configuration>
  <Platform>AnyCPU</Platform>
  <TargetFramework>netcoreapp2.2</TargetFramework>
</ProjectInfo>

即使没有提及,整个项目也被认定为测试项目

上面可以追溯到.sonarqube\conf\sonar-project.properties,这里sonar.souces没有拿cs文件,文件是去.sonar.tests。如下图所示

    sonar.projectKey=exp_test
sonar.working.directory=D:\\Work\\Experiment\\project\\.sonarqube\\out\\.sonar
sonar.projectBaseDir=project

AD649366-FEA7-4513-91E3-90DEB56BD30C.sonar.projectKey=exp_test:AD649366-FEA7-4513-91E3-90DEB56BD30C
AD649366-FEA7-4513-91E3-90DEB56BD30C.sonar.projectName=project
AD649366-FEA7-4513-91E3-90DEB56BD30C.sonar.projectBaseDir=project
AD649366-FEA7-4513-91E3-90DEB56BD30C.sonar.sourceEncoding=utf-8
AD649366-FEA7-4513-91E3-90DEB56BD30C.sonar.sources=
AD649366-FEA7-4513-91E3-90DEB56BD30C.sonar.tests=\
"project\\Areas\\Identity\\file.cs",\
"project\\Areas\\Identity\\Pages\\Account\\file.cshtml.cs",\
"project\\Areas\\Identity\\Pages\\Account\\file.cshtml.cs",\
"project\\Controllers\\file.cs",\
"project\\Controllers\\file.cs",\
"project\\Controllers\\file.cs",\
"project\\Controllers\\file.cs",\
"project\\Controllers\\file.cs",\
"project\\Controllers\\file.cs",\
"project\\Controllers\\file.cs",\
"project\\Controllers\\file.cs",\
"project\\Data\\file.cs",\
"project\\Data\\file.cs",\
"project\\Models\\file.cs",\
"project\\Models\\file.cs",\
"project\\Models\\file.cs",\
"project\\Models\\file.cs",\
"project\\Models\\file.cs",\
"project\\Models\\file.cs",\
"project\\Models\\file.cs",\
"project\\Models\\file.cs",\
"project\\Models\\file.cs",\
"project\\Models\\file.cs",\
"project\\Models\\file.cs",\
"project\\Models\\file.cs",\
"project\\Models\\file.cs",\
"project\\Models\\file.cs",\
"project\\Models\\file.cs",\
"project\\Models\\file.cs",\
"project\\Models\\file.cs",\
"project\\Models\\file.cs",\
"project\\Models\\file.cs",\
"project\\Models\\file.cs",\
"project\\Models\\file.cs",\
"project\\Models\\file.cs",\
"project\\Models\\file.cs",\
"project\\Models\\file.cs",\
"project\\Models\\file.cs",\
"project\\Models\\file.cs",\
"project\\Models\\file.cs",\
"project\\Models\\file.cs",\
"project\\Models\\file.cs",\
"project\\Models\\file.cs",\
"project\\file.cs",\
"project\\REST\\Controllers\\file.cs",\
"project\\REST\\Controllers\\file.cs",\
"project\\REST\\Controllers\\file.cs",\
"project\\REST\\UnitTests\\file.cs",\
"project\\REST\\ViewModels\\file.cs",\
"project\\REST\\ViewModels\\file.cs",\
"project\\REST\\ViewModels\\file.cs",\
"project\\file.cs",\
"project\\ViewComponents\\file.cs",\
"project\\ViewModels\\file.cs",\
"project\\ViewModels\\file.cs",\
"project\\ViewModels\\file.cs",\
"project\\ViewModels\\file.cs",\
"project\\ViewModels\\file.cs",\
"project\\obj\\Debug\\netcoreapp2.2\\project.file.cs",\
"project\\obj\\Debug\\netcoreapp2.2\\project.file.cs",\
"project\\Areas\\Identity\\Pages\\Account\\file.cshtml",\
"project\\Areas\\Identity\\Pages\\Account\\file.cshtml",\
"project\\Areas\\Identity\\Pages\\Account\\_file.cshtml",\
"project\\Areas\\Identity\\Pages\\_file.cshtml",\
"project\\Areas\\Identity\\Pages\\_file.cshtml",\
"project\\Areas\\Identity\\Pages\\_file.cshtml",\
"project\\Views\\Account\\file.cshtml",\
"project\\Views\\Audit\\file.cshtml",\
"project\\Views\\Home\\file.cshtml",\
"project\\Views\\Home\\file.cshtml",\
"project\\Views\\Home\\file.cshtml",\
"project\\Views\\Home\\file.cshtml",\
"project\\Views\\Home\\file.cshtml",\
"project\\Views\\Home\\file.cshtml",\
"project\\Views\\Home\\file.cshtml",\
"project\\Views\\Home\\file.cshtml",\
"project\\Views\\Home\\file.cshtml",\
"project\\Views\\Incident\\file.cshtml",\
"project\\Views\\Incident\\file.cshtml",\
"project\\Views\\ProfileUpload\\file.cshtml",\
"project\\Views\\ProfileUpload\\file.cshtml",\
"project\\Views\\Shared\\Components\\Profile\\file.cshtml",\
"project\\Views\\Shared\\file.cshtml",\
"project\\Views\\Shared\\_file.cshtml",\
"project\\Views\\Shared\\_file.cshtml",\
"project\\Views\\Shared\\_file.cshtml",\
"project\\Views\\UserManagement\\file.cshtml",\
"project\\Views\\UserManagement\\file.cshtml",\
"project\\Views\\UserManagement\\file.cshtml",\
"project\\Views\\UserManagement\\file.cshtml",\
"project\\Views\\UserManagement\\file.cshtml",\
"project\\Views\\UserManagement\\file.cshtml",\
"project\\Views\\XMlParse\\file.cshtml",\
"project\\Views\\XMlParse\\file.cshtml",\
"project\\Views\\XMlParse\\file.cshtml",\
"project\\Views\\XMlParse\\file.cshtml",\
"project\\Views\\XMlParse\\file.cshtml",\
"project\\Views\\XMlParse\\file.cshtml",\
"project\\Views\\_file.cshtml",\
"project\\Views\\_file.cshtml",\
"project\\wwwroot\\css\\css-chart.css",\
"project\\wwwroot\\css\\site.css",\
"project\\wwwroot\\css\\site.min.css",\
"project\\wwwroot\\css\\stylesheet.css",\
"project\\wwwroot\\favicon.ico",\
"project\\wwwroot\\images\\favicon.ico",\
"project\\wwwroot\\images\\favicon.png",\
"project\\wwwroot\\images\\landing-page-background.jpg",\
"project\\wwwroot\\images\\no-user.jpg",\
"project\\wwwroot\\images\\user.png",\
"project\\wwwroot\\images\\yondrlogo.png",\
"project\\wwwroot\\images\\yondrlogoblack.png",\
"project\\wwwroot\\images\\yongroup-main.jpg",\
"project\\wwwroot\\js\\bootstrap-material-design.min.js",\
"project\\wwwroot\\js\\chartist.min.js",\
"project\\wwwroot\\js\\jquery-ui.min.js",\
"project\\wwwroot\\js\\jquery.dataTables.min.js",\
"project\\wwwroot\\js\\jquery.min.js",\
"project\\wwwroot\\js\\material-dashboard.min.js",\
"project\\wwwroot\\js\\perfect-scrollbar.jquery.min.js",\
"project\\wwwroot\\js\\popper.min.js",\
"project\\wwwroot\\js\\site.js",\
"project\\wwwroot\\js\\site.min.js",\
"project\\wwwroot\\lib\\bootstrap\\.bower.json",\
"project\\wwwroot\\lib\\bootstrap\\dist\\css\\bootstrap-grid.css",\
"project\\wwwroot\\lib\\bootstrap\\dist\\css\\bootstrap-grid.css.map",\
"project\\wwwroot\\lib\\bootstrap\\dist\\css\\bootstrap-grid.min.css",\
"project\\wwwroot\\lib\\bootstrap\\dist\\css\\bootstrap-grid.min.css.map",\
"project\\wwwroot\\lib\\bootstrap\\dist\\css\\bootstrap-reboot.css",\
"project\\wwwroot\\lib\\bootstrap\\dist\\css\\bootstrap-reboot.css.map",\
"project\\wwwroot\\lib\\bootstrap\\dist\\css\\bootstrap-reboot.min.css",\
"project\\wwwroot\\lib\\bootstrap\\dist\\css\\bootstrap-reboot.min.css.map",\
"project\\wwwroot\\lib\\bootstrap\\dist\\css\\bootstrap-theme.css",\
"project\\wwwroot\\lib\\bootstrap\\dist\\css\\bootstrap-theme.css.map",\
"project\\wwwroot\\lib\\bootstrap\\dist\\css\\bootstrap-theme.min.css",\
"project\\wwwroot\\lib\\bootstrap\\dist\\css\\bootstrap-theme.min.css.map",\
"project\\wwwroot\\lib\\bootstrap\\dist\\css\\bootstrap.css",\
"project\\wwwroot\\lib\\bootstrap\\dist\\css\\bootstrap.css.map",\
"project\\wwwroot\\lib\\bootstrap\\dist\\css\\bootstrap.min.css",\
"project\\wwwroot\\lib\\bootstrap\\dist\\css\\bootstrap.min.css.map",\
"project\\wwwroot\\lib\\bootstrap\\dist\\fonts\\glyphicons-halflings-regular.eot",\
"project\\wwwroot\\lib\\bootstrap\\dist\\fonts\\glyphicons-halflings-regular.svg",\
"project\\wwwroot\\lib\\bootstrap\\dist\\fonts\\glyphicons-halflings-regular.ttf",\
"project\\wwwroot\\lib\\bootstrap\\dist\\fonts\\glyphicons-halflings-regular.woff",\
"project\\wwwroot\\lib\\bootstrap\\dist\\fonts\\glyphicons-halflings-regular.woff2",\
"project\\wwwroot\\lib\\bootstrap\\dist\\js\\bootstrap.bundle.js",\
"project\\wwwroot\\lib\\bootstrap\\dist\\js\\bootstrap.bundle.js.map",\
"project\\wwwroot\\lib\\bootstrap\\dist\\js\\bootstrap.bundle.min.js",\
"project\\wwwroot\\lib\\bootstrap\\dist\\js\\bootstrap.bundle.min.js.map",\
"project\\wwwroot\\lib\\bootstrap\\dist\\js\\bootstrap.js",\
"project\\wwwroot\\lib\\bootstrap\\dist\\js\\bootstrap.js.map",\
"project\\wwwroot\\lib\\bootstrap\\dist\\js\\bootstrap.min.js",\
"project\\wwwroot\\lib\\bootstrap\\dist\\js\\bootstrap.min.js.map",\
"project\\wwwroot\\lib\\bootstrap\\dist\\js\\npm.js",\
"project\\wwwroot\\lib\\bootstrap\\LICENSE",\
"project\\wwwroot\\lib\\jquery-validation-unobtrusive\\.bower.json",\
"project\\wwwroot\\lib\\jquery-validation-unobtrusive\\jquery.validate.unobtrusive.js",\
"project\\wwwroot\\lib\\jquery-validation-unobtrusive\\jquery.validate.unobtrusive.min.js",\
"project\\wwwroot\\lib\\jquery-validation-unobtrusive\\LICENSE.txt",\
"project\\wwwroot\\lib\\jquery-validation\\.bower.json",\
"project\\wwwroot\\lib\\jquery-validation\\dist\\additional-methods.js",\
"project\\wwwroot\\lib\\jquery-validation\\dist\\additional-methods.min.js",\
"project\\wwwroot\\lib\\jquery-validation\\dist\\jquery.validate.js",\
"project\\wwwroot\\lib\\jquery-validation\\dist\\jquery.validate.min.js",\
"project\\wwwroot\\lib\\jquery-validation\\LICENSE.md",\
"project\\wwwroot\\lib\\jquery\\.bower.json",\
"project\\wwwroot\\lib\\jquery\\dist\\jquery.js",\
"project\\wwwroot\\lib\\jquery\\dist\\jquery.min.js",\
"project\\wwwroot\\lib\\jquery\\dist\\jquery.min.map",\
"project\\wwwroot\\lib\\jquery\\LICENSE.txt",\
"project\\wwwroot\\swagger-ui\\style.css",\
"project\\nlog.config",\
"project\\appsettings.Development.json",\
"project\\appsettings.json",\
"project\\Connected Services\\Application Insights\\ConnectedService.json",\
"project\\Properties\\launchSettings.json",\
"project\\internalLog.txt"

AD649366-FEA7-4513-91E3-90DEB56BD30C.sonar.cs.roslyn.reportFilePath=project\\bin\\Debug\\netcoreapp2.2\\project.dll.RoslynCA.json
AD649366-FEA7-4513-91E3-90DEB56BD30C.sonar.cs.analyzer.projectOutPath=project\\.sonarqube\\out\\0
AD649366-FEA7-4513-91E3-90DEB56BD30C.sonar.cs.analyzer.projectOutPaths=\
"project\\.sonarqube\\out\\0"
AD649366-FEA7-4513-91E3-90DEB56BD30C.sonar.cs.roslyn.reportFilePaths=\
"project\\bin\\Debug\\netcoreapp2.2\\project.dll.RoslynCA.json",\
"project\\bin\\Debug\\netcoreapp2.2\\project.Views.dll.RoslynCA.json"

AD649366-FEA7-4513-91E3-90DEB56BD30C.sonar.working.directory=project\\.sonarqube\\out\\.sonar\\mod0
sonar.host.url=sonarqurl
sonar.visualstudio.enable=false

sonar.modules=AD649366-FEA7-4513-91E3-90DEB56BD30C

这里的源文件将用于测试而不是源,对于新项目它会进入源。

但是对于当前项目,它会进行测试


@Duncan Pocklington

好的,这是有道理的。 Scanner for MSBuild 不分析测试代码,整个项目被分类为测试代码或产品代码(而不是逐个文件)。文档中的检测测试项目部分解释了扫描程序如何确定项目是否为测试项目,以及如何将项目明确标记为测试/非测试项目。


因此,使用 .csproj 中的以下代码作为 false 将项目标记为测试项目。

```
<!-- in .csproj -->
<PropertyGroup>
<!-- Mark the project as being a test project -->
<SonarQubeTestProject>false</SonarQubeTestProject>
</PropertyGroup>
```

现在去测试一下,谢谢

----------------------------------------------- ----------------------------------

成功了,C# 精通,项目分析完毕,感谢您的帮助

但我只是好奇为什么声纳扫描仪会有这样的行为?当项目完全拥有从 MVC、Nunit Cases 到 RestAPI 的所有组件时,它仍然只将其识别为测试项目吗?

之前没有添加任何项目组

这是否意味着 dotnet 框架项目需要在 MVC 分离 csproj 和 Nunit 分离 csproj 的意义上解耦,这有助于 sonarscanner 识别它是测试项目还是不是测试项目

【讨论】:

  • 真棒线程!一点格式可以帮助社区很多:)
猜你喜欢
  • 2021-06-29
  • 2021-07-25
  • 1970-01-01
  • 2020-06-08
  • 2020-03-26
  • 2019-07-28
  • 2018-07-27
  • 2021-11-27
  • 1970-01-01
相关资源
最近更新 更多