Sonarqube分析使用MSBUILD:线路不超出文件范围



所以,我们使用.NET 4.5的Teamcity项目构建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)

我已经检查了什么:

  • 更新:进一步分析证明,由于点cover代码覆盖分析
  • 文件编码:UTF-8(使用Notepad 验证,是UTF-8,没有BOM(,使用CRLF线feeds(使用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运行时环境(构建1.8.0_111-B14(

我们在构建过程中执行以下步骤(与Sonarqube相关(:

  • 开始分析

    E:SonarQubesonar-scanner-msbuild-2.3.2SonarQube.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:TeamCitybuildAgenttoolsdotCoverdotCover.exe analyse /TargetExecutable="%system.teamcity.build.workingDir%packagesNUnit.ConsoleRunner.3.6.1toolsnunit3-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:TeamCitybuildAgenttoolsdotCoverdotCover.exe analyse /TargetExecutable="%system.teamcity.build.workingDir%packagesNUnit.ConsoleRunner.3.6.1toolsnunit3-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:SonarQubesonar-scanner-msbuild-2.3.2SonarQube.Scanner.MSBuild.exe end
    

确切的错误:

[23:25:19][Step 14/16] INFO: Parsing the dotCover report E:TeamCitybuildAgentwork5728a1531387749f.DotCover-webapisrc996.html
[23:25:19][Step 14/16] INFO: Parsing the dotCover report E:TeamCitybuildAgentwork5728a1531387749f.DotCover-webapisrc997.html
[23:25:19][Step 14/16] INFO: Parsing the dotCover report E:TeamCitybuildAgentwork5728a1531387749f.DotCover-webapisrc998.html
[23:25:19][Step 14/16] INFO: Parsing the dotCover report E:TeamCitybuildAgentwork5728a1531387749f.DotCover-webapisrc999.html
[23:25:19][Step 14/16] INFO: Adding this code coverage report to the cache for later reuse: E:TeamCitybuildAgentwork5728a1531387749f.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_Start/UnityConfig.cs(具有65行,现在不再有那条线,正如stdout对您所说的那样: (lines: 64)

正如本教程中所述,运行dotnet sonarscanner命令(使用dotnet-sonarscanner工具已经安装了(,在dotnet builddotnet test --settings your-settings.xml命令之后,将创建一个称为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

仅让最后一个文件夹创建删除所有其他文件夹。对声纳很重要的唯一文件夹是最后一个文件夹,另一个文件夹是垃圾。有关更多信息,请参见文档。

最新更新