C# 使用MSBuild进行SonarQube分析:文件中的行超出范围

C# 使用MSBuild进行SonarQube分析:文件中的行超出范围,c#,msbuild,sonarqube,C#,Msbuild,Sonarqube,因此,我们有一个TeamCity项目,使用.NET4.5构建一个C#webapi项目,其中包括SonarQube分析 在分析结束时,我们收到以下例外情况: [13:41:13][Step 14/16] ERROR: Error during SonarQube Scanner execution [13:41:13][Step 14/16] java.lang.IllegalStateException: Line 65 is out of range in the file App_Start

因此,我们有一个TeamCity项目,使用.NET4.5构建一个C#webapi项目,其中包括SonarQube分析

在分析结束时,我们收到以下例外情况:

[13:41:13][Step 14/16] ERROR: Error during SonarQube Scanner execution
[13:41:13][Step 14/16] java.lang.IllegalStateException: Line 65 is out of range in the file App_Start/UnityConfig.cs (lines: 64)
我已经检查了什么:

  • 更新:进一步分析证明错误是由dotCover代码覆盖率分析引起的
  • 文件编码:UTF-8(用记事本++验证,是不带BOM的UTF-8),使用CRLF换行符(用hexdump检查,文件以0x0D 0x0A结尾)
  • SonarQube使用的编码

    [16:17:37][Step 14/16] INFO: Default locale: "en_US", source code encoding: "windows-1252" (analysis is platform dependent)
    [16:17:37][Step 14/16] INFO: Process project properties
    [16:17:37][Step 14/16] bla bla
    [16:17:59][Step 14/16] INFO: Source encoding: UTF-8, default locale: en_US
    
使用以下堆栈:

  • SonarQube 6.4(刚刚更新)
  • SonarC#5.11(1761年建造)
  • TeamCity 9.1.6中包含的dotCover
  • Microsoft(R)生成引擎版本14.0.24720.0
  • Java(TM)SE运行时环境(build 1.8.0_111-b14)
我们在构建过程中执行以下步骤(与SonarQube相关):

  • 开始分析

    E:\SonarQube\sonar-scanner-msbuild-2.3.2\SonarQube.Scanner.MSBuild.exe begin /k:"CoBen" /n:"CoBen" /v:"%build.number%" /d:sonar.cs.nunit.reportsPaths="TestResult-*.xml" /d:sonar.cs.dotcover.reportsPaths="DotCover-*.html"
    
  • 建设项目

    MSBuild.exe /p:Configuration=Release;Targets=Rebuild
    
  • 使用dotCover运行单元测试

    C:\TeamCity\buildAgent\tools\dotCover\dotCover.exe analyse /TargetExecutable="%system.teamcity.build.workingDir%\packages\NUnit.ConsoleRunner.3.6.1\tools\nunit3-console.exe" /TargetArguments="--teamcity --agents=1 --result=%system.teamcity.build.workingDir%\TestResult-unit.xml;format=nunit2 --where \"cat != WebApiTests\" %system.teamcity.build.workingDir%\TestDlls.nunit" /Output="DotCover-unit.html" /ReportType="HTML"
    
    C:\TeamCity\buildAgent\tools\dotCover\dotCover.exe analyse /TargetExecutable="%system.teamcity.build.workingDir%\packages\NUnit.ConsoleRunner.3.6.1\tools\nunit3-console.exe" /TargetArguments="--teamcity --agents=1 --result=%system.teamcity.build.workingDir%\TestResult-webapi.xml;format=nunit2 --where \"cat == WebApiTests\" %system.teamcity.build.workingDir%\TestDlls.nunit" /Output="DotCover-webapi.html" /ReportType="HTML"
    
  • 使用dotCover运行集成测试

    C:\TeamCity\buildAgent\tools\dotCover\dotCover.exe analyse /TargetExecutable="%system.teamcity.build.workingDir%\packages\NUnit.ConsoleRunner.3.6.1\tools\nunit3-console.exe" /TargetArguments="--teamcity --agents=1 --result=%system.teamcity.build.workingDir%\TestResult-unit.xml;format=nunit2 --where \"cat != WebApiTests\" %system.teamcity.build.workingDir%\TestDlls.nunit" /Output="DotCover-unit.html" /ReportType="HTML"
    
    C:\TeamCity\buildAgent\tools\dotCover\dotCover.exe analyse /TargetExecutable="%system.teamcity.build.workingDir%\packages\NUnit.ConsoleRunner.3.6.1\tools\nunit3-console.exe" /TargetArguments="--teamcity --agents=1 --result=%system.teamcity.build.workingDir%\TestResult-webapi.xml;format=nunit2 --where \"cat == WebApiTests\" %system.teamcity.build.workingDir%\TestDlls.nunit" /Output="DotCover-webapi.html" /ReportType="HTML"
    
  • 末端声纳分析

    E:\SonarQube\sonar-scanner-msbuild-2.3.2\SonarQube.Scanner.MSBuild.exe end
    
确切的错误是:

[23:25:19][Step 14/16] INFO: Parsing the dotCover report E:\TeamCity\buildAgent\work\5728a1531387749f\.\DotCover-webapi\src\996.html
[23:25:19][Step 14/16] INFO: Parsing the dotCover report E:\TeamCity\buildAgent\work\5728a1531387749f\.\DotCover-webapi\src\997.html
[23:25:19][Step 14/16] INFO: Parsing the dotCover report E:\TeamCity\buildAgent\work\5728a1531387749f\.\DotCover-webapi\src\998.html
[23:25:19][Step 14/16] INFO: Parsing the dotCover report E:\TeamCity\buildAgent\work\5728a1531387749f\.\DotCover-webapi\src\999.html
[23:25:19][Step 14/16] INFO: Adding this code coverage report to the cache for later reuse: E:\TeamCity\buildAgent\work\5728a1531387749f\.\DotCover-webapi.html
[23:25:19][Step 14/16] INFO: ------------------------------------------------------------------------
[23:25:19][Step 14/16] INFO: EXECUTION FAILURE
[23:25:19][Step 14/16] INFO: ------------------------------------------------------------------------
[23:25:19][Step 14/16] INFO: Total time: 12:17.339s
[23:25:20][Step 14/16] ERROR: Error during SonarQube Scanner execution
[23:25:20][Step 14/16] INFO: Final Memory: 52M/392M
[23:25:20][Step 14/16] INFO: ------------------------------------------------------------------------
[23:25:20][Step 14/16] java.lang.IllegalStateException: Line 65 is out of range in the file App_Start/UnityConfig.cs (lines: 64)
[23:25:20][Step 14/16]  at org.sonar.api.internal.google.common.base.Preconditions.checkState(Preconditions.java:197)
[23:25:20][Step 14/16]  at org.sonar.api.batch.sensor.coverage.internal.DefaultCoverage.validateLine(DefaultCoverage.java:90)
[23:25:20][Step 14/16]  at org.sonar.api.batch.sensor.coverage.internal.DefaultCoverage.lineHits(DefaultCoverage.java:78)
[23:25:20][Step 14/16]  at org.sonar.plugins.dotnet.tests.CoverageReportImportSensor.analyze(CoverageReportImportSensor.java:94)
[23:25:20][Step 14/16]  at org.sonar.plugins.dotnet.tests.CoverageReportImportSensor.execute(CoverageReportImportSensor.java:69)
[23:25:20][Step 14/16]  at org.sonar.scanner.sensor.SensorWrapper.analyse(SensorWrapper.java:53)
[23:25:20][Step 14/16]  at org.sonar.scanner.phases.SensorsExecutor.executeSensor(SensorsExecutor.java:57)
[23:25:20][Step 14/16]  at org.sonar.scanner.phases.SensorsExecutor.execute(SensorsExecutor.java:49)
[23:25:20][Step 14/16]  at org.sonar.scanner.phases.AbstractPhaseExecutor.execute(AbstractPhaseExecutor.java:78)
[23:25:20][Step 14/16]  at org.sonar.scanner.scan.ModuleScanContainer.doAfterStart(ModuleScanContainer.java:175)
[23:25:20][Step 14/16]  at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:143)
[23:25:20][Step 14/16]  at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:128)
[23:25:20][Step 14/16]  at org.sonar.scanner.scan.ProjectScanContainer.scan(ProjectScanContainer.java:262)
[23:25:20][Step 14/16]  at org.sonar.scanner.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:257)
[23:25:20][Step 14/16]  at org.sonar.scanner.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:255)
[23:25:20][Step 14/16]  at org.sonar.scanner.scan.ProjectScanContainer.doAfterStart(ProjectScanContainer.java:247)
[23:25:20][Step 14/16]  at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:143)
[23:25:20][Step 14/16]  at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:128)
[23:25:20][Step 14/16]  at org.sonar.scanner.task.ScanTask.execute(ScanTask.java:47)
[23:25:20][Step 14/16]  at org.sonar.scanner.task.TaskContainer.doAfterStart(TaskContainer.java:86)
[23:25:20][Step 14/16]  at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:143)
[23:25:20][Step 14/16]  at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:128)
[23:25:20][Step 14/16]  at org.sonar.scanner.bootstrap.GlobalContainer.executeTask(GlobalContainer.java:118)
[23:25:20][Step 14/16]  at org.sonar.batch.bootstrapper.Batch.executeTask(Batch.java:117)
[23:25:20][Step 14/16]  at org.sonarsource.scanner.api.internal.batch.BatchIsolatedLauncher.execute(BatchIsolatedLauncher.java:63)
[23:25:20][Step 14/16]  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[23:25:20][Step 14/16]  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[23:25:20][Step 14/16]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[23:25:20][Step 14/16]  at java.lang.reflect.Method.invoke(Method.java:498)
[23:25:20][Step 14/16]  at org.sonarsource.scanner.api.internal.IsolatedLauncherProxy.invoke(IsolatedLauncherProxy.java:60)
[23:25:20][Step 14/16]  at com.sun.proxy.$Proxy0.execute(Unknown Source)
[23:25:20][Step 14/16]  at org.sonarsource.scanner.api.EmbeddedScanner.doExecute(EmbeddedScanner.java:233)
[23:25:20][Step 14/16]  at org.sonarsource.scanner.api.EmbeddedScanner.runAnalysis(EmbeddedScanner.java:151)
[23:25:20][Step 14/16]  at org.sonarsource.scanner.cli.Main.runAnalysis(Main.java:123)
[23:25:20][Step 14/16]  at org.sonarsource.scanner.cli.Main.execute(Main.java:77)
[23:25:20][Step 14/16]  at org.sonarsource.scanner.cli.Main.main(Main.java:61)
[23:25:20][Step 14/16] ERROR: 
[23:25:20][Step 14/16] ERROR: Re-run SonarQube Scanner using the -X switch to enable full debug logging.
[23:25:21][Step 14/16] The SonarQube Scanner did not complete successfully

知道我们还能做什么吗?

解决了!我从dotCover切换到OpenCover,现在一切都运行良好。

当您更改程序中的文件时,通常会发生此错误。在您的情况下,以前您的文件(
App\u Start/UnityConfig.cs
)有第65行,现在它不再有第65行了,正如标准代码对您所说:
(第64行)

如本教程所述,在
dotnet build
dotnet test--settings your settings.xml
命令之后,运行
dotnet sonarscanner
命令(使用已安装的
dotnet sonarscanner
工具),将创建一个名为
TestResults
的文件夹,并在该文件夹下创建另一个带有随机guid名称的文件夹,其中包含所有覆盖范围文件(取决于覆盖范围xml设置),如下所示:

TestResults
    51481fee-256a-483f-b473-d4e741228025
        coverage
        coverage.xml
        coverage.info
        coverage.json
        coverage.opencover.xml
如果TestResults文件夹有多个guid文件夹,如下所示:

TestResults
    51481fee-256a-483f-b473-d4e741228025
    8341f0a9-ae41-4c28-a651-5a94931add2f
    b6c0b109-72c4-415e-934f-230e6438c03f
    953c1a4f-b98b-4fb0-bd55-7616e9464257
    0597c293-c904-4a1f-ba13-5b494edeefcf

仅允许创建的最后一个文件夹删除所有其他文件夹。唯一对sonar重要的文件夹是最后一个,其他文件夹是垃圾。有关更多信息,请参阅。

请在您的问题中包含安装在SonarQube服务器上的SonarC版本。在上面添加了有问题的版本(5.7.0.612),发现它不是最新版本。我正在更新最新版本和重新运行,因为我们说(写)同样的问题,我想这可能与我们正在运行的dotSub分析有关。我不认为这是一个必要的解决方案。更多的是一种变通方法。