声纳的 TeamCity dotCover 报告路径

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

程序是:

    在包含测试和覆盖的步骤之后,在 Team City 中创建一个 PowerShell 构建步骤 如果您愿意,可以使用命令行 在临时文件夹中获取完整的 dotCover 快照名称 运行 dotCover 从快照生成 html 报告 注意 - Sonar (c# plugin v 2.3) 仅支持 dotCover HTML 报告 将生成的 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 文件 :-( 请参阅:***.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,需要将团队城市临时构建路径添加到开始步骤。

    使用 运行 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%".

    使用 MSBuild 构建项目

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

    运行 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%"

【讨论】:

以上是关于声纳的 TeamCity dotCover 报告路径的主要内容,如果未能解决你的问题,请参考以下文章

如何在 TeamCity 的 dotCover 中排除类型和方法?

如何从Jenkins的多个测试项目中获取dotCover覆盖率报告

TeamCity 中图表格式的 FxCop 报告

TFS构建写入消息链接以进行报告

从 Visual Studio 生成声纳报告

在 TeamCity 上为 Karma 配置代码覆盖率报告