【问题标题】:SonarQube analysis with MSBuild: Line is out of range in file使用 MSBuild 进行 SonarQube 分析:文件中的行超出范围
【发布时间】:2017-11-04 01:04:30
【问题描述】:

因此,我们有一个 TeamCity 项目,该项目使用 .NET 4.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)

我已经检查了什么:

  • UPDATE:进一步分析证明该错误是由于dotCover代码覆盖率分析引起的
  • 文件编码:UTF-8(用 Notepad++ 验证,是没有 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)
  • dotCover 包含在 TeamCity 9.1.6 中
  • Microsoft (R) Build Engine 版本 14.0.24720.0
  • Java(TM) SE 运行时环境(内部版本 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"
    
  • 使用 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-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

你知道我们还能做什么吗?

【问题讨论】:

  • 请edit您的问题包括SonarQube服务器上安装的SonarC#版本。
  • 添加了上面有问题的版本(5.7.0.612),发现它不是最新的。我正在更新到最新版本并在我们说话时重新运行(写)
  • 同样的问题,我认为这可能与我们正在运行的 dotCover 分析有关。

标签: c# msbuild sonarqube


【解决方案1】:

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

【讨论】:

  • 我不一定认为这是一个解决方案。更多的解决方法。
【解决方案2】:

当您更改程序中的文件时,通常会发生此错误。在您的情况下,以前您的文件 (App_Start/UnityConfig.cs) 有第 65 行,现在它不再有该行,因为标准输出对您说:(lines: 64)。

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

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

只让创建的最后一个文件夹删除所有其他文件夹。唯一对声纳很重要的文件夹是最后一个,其他的都是垃圾。请参阅documentation 了解更多信息。

【讨论】:

    猜你喜欢
    • 2017-07-08
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 2016-01-27
    • 2018-02-16
    • 2019-11-27
    • 2017-04-29
    相关资源
    最近更新 更多