Путь отчета TeamCity dotCover для сонара

Я пытаюсь интегрировать анализ сонара в процесс сборки TeamCity. У меня есть шаг сборки NUnit, который запускает мои модульные тесты, а затем запускает dotCover для покрытия.

Мой следующий шаг - гидролокатор. Конфигурация, которая в настоящее время существует, является; gallio.mode = dotCover, sonar.gallio.mode = reuseReport, но мне также нужен sonar.gallio.reports.path.

Кто-нибудь знает путь к отчету dotCover, созданному на предыдущем шаге?

5 ответов

Решение

Я не мог найти способ сделать это, используя встроенный NUnit Runner. Мне удалось заставить его работать, используя шаг сборки powershell, чтобы вручную вызывать необходимые команды.

Первый шаг - запустить тесты NUnit через Gallio в рамках вызова оболочки dotCover:

& 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

Отчет о тестировании Gallio доступен для захвата Sonar с помощью reuseReport, TeamCity автоматически определяет результаты теста.

Вы можете заставить TeamCity напрямую обрабатывать снимок покрытия, записав служебное сообщение в стандартный вывод:

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

Чтобы получить информацию о покрытии в формате, используемом Sonar, вам нужно использовать команду отчета dotCover и недокументированный тип отчета TeamCityXML:

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

Кажется, TeamCity 2017 больше не создает файлы cover_dotcover*.data. Вместо этого он создает файлы *.dcvr.

Существует потенциально несколько файлов, которые необходимо объединить, прежде чем вы сможете создать отчет. В результате PowerShell нуждается в обновлении.

Таким образом, используя шаги, предоставленные Александром, просто обновите скрипт так, чтобы:

$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% может быть передано в сканер sonarqube. Кстати, вам нужно создать параметр в TC для%sonar.coverageReport%, например, "sonarcoverage.html"

Потратил некоторое время на ту же проблему, но с новым плагином Sonar C# (v.2.3) - поддержка Gallio была прекращена, но отчет все еще требуется.

Чтобы ответить на вопрос напрямую, TeamCity помещает файл моментального снимка dotcover во временную папку с именем вроде coverage_dotcover27574681205420364801.data (где цифры случайные). Так

Процедура такова:

  1. Создайте шаг PowerShell Build в Team City после этапа с тестированием и покрытием
    • вы можете использовать командную строку, если вы предпочитаете
  2. Получить полное имя снимка dotCover во временной папке
  3. Запустите dotCover, чтобы создать отчет HTML из снимка
    • Примечание. Sonar (C# plugin v 2.3) поддерживает только HTML-отчеты dotCover
  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%"

Теперь вы можете указать свой отчет в эхолоте как sonar.cs.dotcover.reportsPaths='%sonar.coverageReport%'

Где%sonar.coverageReport% - это определенное свойство в TeamCity

Мы используем SonarScanner для MSBuild, и нам нужно добавить временный путь построения командного города на начальный шаг.

  1. Запустите команду SonarScanner.MSBuild.exe begin, указав временную директорию сборки, в которой отчеты будут доступны, используя
   /d:sonar.cs.dotcover.reportsPaths="%system.teamcity.build.tempDir%".
  1. Создайте свой проект с помощью MSBuild

  2. Запустите свой тестовый инструмент, указав ему создать отчет в том же месте, которое было указано ранее для MSBuild SonarQube Runner.

  3. Запустите команду завершения SonarScanner.MSBuild.exe

Хотя это может быть немного громоздким решением, я использую две цепочки сборки.

Первая конфигурация сборки создает решение и запускает тесты / покрытие, а также сохраняет снимок 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)

Отчет о покрытии из этапа сборки nunit/dotcover хранится в каталоге скрытых артефактов teamcity. Вы должны добавить это как зависимость артефакта на этапе сонара. Я бы не рекомендовал маршрут скрытых артефактов, но это можно сделать.

Это путь артефакта, который я использовал для публикации отчета, который работал в течение нескольких недель, а затем начал давать сбой:

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

Как только у вас будет отчет, вы свободны.

Ниже показано, что у меня сработало. Я использую 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%"
Другие вопросы по тегам