Путь отчета 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
(где цифры случайные). Так
Процедура такова:
- Создайте шаг PowerShell Build в Team City после этапа с тестированием и покрытием
- вы можете использовать командную строку, если вы предпочитаете
- Получить полное имя снимка dotCover во временной папке
- Запустите dotCover, чтобы создать отчет HTML из снимка
- Примечание. Sonar (C# plugin v 2.3) поддерживает только HTML-отчеты dotCover
- Передать полученный 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, и нам нужно добавить временный путь построения командного города на начальный шаг.
- Запустите команду SonarScanner.MSBuild.exe begin, указав временную директорию сборки, в которой отчеты будут доступны, используя
/d:sonar.cs.dotcover.reportsPaths="%system.teamcity.build.tempDir%".
Создайте свой проект с помощью MSBuild
Запустите свой тестовый инструмент, указав ему создать отчет в том же месте, которое было указано ранее для MSBuild SonarQube Runner.
Запустите команду завершения 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%"