【问题标题】:TeamCity dotCover report path for Sonar声纳的 TeamCity dotCover 报告路径
【发布时间】:2012-10-21 16:03:06
【问题描述】:

我正在尝试将声纳分析集成到 TeamCity 构建过程中。我有一个 NUnit 构建步骤,它运行我的单元测试,然后运行 ​​dotCover 进行覆盖。

我的下一步是 sonar-runner。当前存在的配置是; gallio.mode=dotCover, sonar.gallio.mode=reuseReport 但我还需要 sonar.gallio.reports.path。

有人知道上一步生成的dotCover报告的路径吗?

【问题讨论】:

    标签: teamcity sonarqube dotcover sonar-runner teamcity-7.1


    【解决方案1】:

    在同一问题上花费了一些时间,但使用了较新的 Sonar c# 插件 (v.2.3) - 已放弃对 Gallio 的支持,但仍需要报告。

    为了直接回答这个问题,TeamCity 将 dotcover snapshot 文件放入一个名为 coverage_dotcover27574681205420364801.data 的临时文件夹中(其中数字是随机的)。所以

    程序是:

    1. 在包含测试和覆盖的步骤之后,在 Team City 中创建一个 PowerShell 构建步骤
      • 如果您愿意,可以使用命令行
    2. 在临时文件夹中获取完整的 dotCover 快照名称
    3. 运行 dotCover 从快照生成 HTML 报告
      • 注意 - Sonar (c# plugin v 2.3) 仅支持 dotCover HTML 报告
    4. 将生成的 HTML 报告传递给声纳

    PowerShell 脚本:

    $snapshot = Get-ChildItem "%system.teamcity.build.tempDir%" `
         -Filter coverage_dotcover*.data `
         | select -ExpandProperty FullName -First 1
    
    %teamcity.dotCover.home%\dotCover.exe report `
        /ReportType=HTML /Source="$snapshot" `
        /Output="%sonar.coverageReport%"
    

    现在您可以在 sonnar runner 中将您的报告指定为 sonar.cs.dotcover.reportsPaths='%sonar.coverageReport%'

    其中 %sonar.coverageReport% 是 TeamCity 中定义的属性

    【讨论】:

    • 对我不起作用,此解决方案会生成一个正文为空的 html 文件 :-( 请参阅:stackoverflow.com/q/33043021/1226568
    • 您将 %sonar.coverageReport% 设置为什么?
    【解决方案2】:

    似乎 TeamCity 2017 不再创建 coverage_dotcover*.data 文件。相反,它会创建 *.dcvr 文件。

    在创建报告之前可能需要合并多个文件。因此,powershell 需要更新。

    所以使用 Oleksandr 提供的步骤,只需将脚本更新为:

    $snapshotfiles = Get-ChildItem "%system.teamcity.build.tempDir%" `
     -recurse -Filter *.dcvr `
     | select -ExpandProperty Name
    
    $snapshots = $snapshotfiles -join ";"
    
    %teamcity.dotCover.home%\dotCover.exe merge /Source=$snapshots 
    /Output=dotcovermerge.dcvr
    
    %teamcity.dotCover.home%\dotCover.exe report `
    /ReportType=HTML /Source=dotcovermerge.dcvr `
    /Output="%sonar.coverageReport%"
    

    然后可以将属性 %sonar.coverageReport% 传递给声纳扫描仪。顺便说一句,您需要在 TC 中为 %sonar.coverageReport% 创建一个参数,例如“声纳覆盖.html”

    【讨论】:

      【解决方案3】:

      我找不到使用内置 NUnit 运行器的方法。我设法通过使用 powershell 构建步骤手动调用所需的命令来使其工作。

      第一步是在 dotCover 封面调用中通过 Gallio 运行 NUnit 测试:

      & dotCover cover `
      /TargetExecutable="C:\Program Files\Gallio\bin\Gallio.Echo.exe" `
      /TargetArguments="/report-type:XML /report-name-format:test-report /runner:IsolatedProcess /report-directory:.\Gallio .\Path\Test.dll" `
      /Filters="+:WhatToCover" `
      /Output=coverage.snapshot
      

      Sonar 可以使用reuseReport 获取Gallio 测试报告,TeamCity 会自动检测测试结果。

      您可以通过将service message 写入标准输出来让 TeamCity 直接处理覆盖率快照:

      Write-Host "##teamcity[importData type='dotNetCoverage' tool='dotcover' path='coverage.snapshot']"
      

      要将覆盖信息转换为 Sonar 可用的格式,您需要使用 dotCover 报告命令和 undocumented report type TeamCityXML:

      & dotCover report /Source=coverage.snapshot /Output=coverage-report.xml /ReportType=TeamCityXML
      

      【讨论】:

        【解决方案4】:

        我们正在使用SonarScanner for MSBuild,需要将团队城市临时构建路径添加到开始步骤。

        1. 使用
        2. 运行 SonarScanner.MSBuild.exe 开始命令 specifying the temp build directory to be where the reports will be available
           /d:sonar.cs.dotcover.reportsPaths="%system.teamcity.build.tempDir%".
        
        1. 使用 MSBuild 构建项目

        2. 运行您的测试工具,指示它在之前指定给 MSBuild SonarQube Runner 的同一位置生成报告

        3. 运行 SonarScanner.MSBuild.exe 结束命令

        【讨论】:

          【解决方案5】:

          来自 nunit/dotcover 构建步骤的覆盖率报告存储在 teamcity 隐藏工件目录中。您需要在声纳步骤中将其添加为工件依赖项。我不会推荐隐藏的工件路线,但可以做到。

          这是我用来发布报告的工件路径,它工作了几周然后开始失败:

          %env.TEAMCITY_DATA_PATH%/system\artifacts\**\%teamcity.build.id%\.teamcity\.NETCoverage\dotCover.snapshot

          一旦你有了报告,你就可以回家了。

          【讨论】:

            【解决方案6】:

            虽然这可能是一个有点麻烦的解决方案,但我正在使用两个链式构建。

            第一个构建配置构建解决方案并运行测试/覆盖,并将 dotCover 快照保存为工件。

            另一个构建依赖于.teamcity/.NETCoverage/dotCover.snapshot 上的第一个构建并运行 "C:\Program Files (x86)\JetBrains\dotCover\v2.7\bin\dotCover.exe" report /ReportType=HTML /Source="dotCover.snapshot" /Output="dotCover.html" 并在最后一步执行 SonarRunner(您的项目属性文件将指向“dotCover.html”)。

            (已尝试使用 SonarQube 5、dotCover 2.7、TC8)

            【讨论】:

              【解决方案7】:

              以下是对我有用的。我在 TC 2018.2.4 上,dotCover 的捆绑版本没有生成任何东西,所以我也将它升级到了最新版本,即 2019.1.1

              我无法让代理使用最新版本的 dotcover 工具,因此我不得不为此构建文件夹路径,而不是使用默认的 %teamcity.dotCover.home% 变量。

              我也不想使用临时文件夹,因为那里的东西会被构建删除。

              $snapshot_file_list = Get-ChildItem "%system.teamcity.build.tempDir%" -recurse -Filter coverage_dotcover*.data | select -ExpandProperty FullName
              Echo "dotCover Snapshot files"
              Echo $snapshot_file_list
              $joined_snapshot_files = $snapshot_file_list -join ";"
              Echo "Merging data files to %system.teamcity.build.checkoutDir%\dotcovermerge.dcvr"
              & "%teamcity.agent.tools.dir%\JetBrains.dotCover.CommandLineTools.2019.1.1\dotCover.exe" merge /Source=$joined_snapshot_files /Output="%system.teamcity.build.checkoutDir%\dotcovermerge.dcvr" /LogFile="%system.teamcity.build.checkoutDir%\dotCover.log"
              Echo "Generating dotCover Html report"
              Echo "%system.teamcity.build.checkoutDir%\%sonar.coverageReport%"
              & "%teamcity.agent.tools.dir%\JetBrains.dotCover.CommandLineTools.2019.1.1\dotCover.exe" report /ReportType=HTML /Source="%system.teamcity.build.checkoutDir%\dotcovermerge.dcvr" /Output="%system.teamcity.build.checkoutDir%\%sonar.coverageReport%"
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2016-09-09
                • 1970-01-01
                • 1970-01-01
                • 2018-09-15
                • 1970-01-01
                • 2015-05-22
                • 2012-11-24
                • 2023-04-01
                相关资源
                最近更新 更多