Почему отчет о покрытии кода SonarQube показывает нулевые строки для покрытия при выполнении из файла jenkins

#c# #jenkins #sonarqube

#c# #дженкинс #sonarqube

Вопрос:

Я пытаюсь получить отчет о покрытии кода SonarQube во время сборки решения dotnet c #. Для целей тестирования решение действительно простое. Он содержит проект библиотеки и проект модульного тестирования. Модульный тест охватывает один метод из двух, определенных в проекте lib. Я использую инструмент dotnet sonarscanner. При локальном запуске следующего скрипта

 dotnet sonarscanner begin /d:sonar.login='myToken' /d:sonar.host.url='https://sbt-sonarqube.sigma.sbrf.ru' /k:SBERSPACE:backend /n:SBERSPACE:backend /d:sonar.branch.name='feature/TEAMX-3687-xunit-sonar' /d:sonar.cs.opencover.reportsPaths='Tests/**/coverage.opencover.xml' /d:sonar.cs.vstest.reportsPaths='Tests/**/TestResults.trx' /d:sonar.sourceEncoding='UTF-8'

dotnet build

dotnet test --logger "trx;LogFileName=TestResults.trx" /p:CollectCoverage=true /p:CoverletOutputFormat=opencover

dotnet sonarscanner end /d:sonar.login='myToken'
 

Все работает нормально, и на хосте SonarQube я вижу: покрытие кода 50% на 6 новых строках.

Но когда я пытаюсь выполнить то же самое задание insinde jenkins (вот часть jenkinsfile):

 def sonarExec
sonarExec = "dotnet sonarscanner"

withCredentials([usernamePassword(credentialsId: 'myCredentialId', passwordVariable: 'SonarPass', usernameVariable: 'SonarUser')]) {
    dir("SberSpace"){
        def SonarBeginCommand = """${sonarExec} begin /d:sonar.login=${SonarUser} /d:sonar.password=${SonarPass} /d:sonar.host.url=https://sbt-sonarqube.sigma.sbrf.ru /k:SBERSPACE:backend /n:SBERSPACE:backend 
                /d:sonar.branch.name=feature/TEAMX-3687-xunit-sonar 
                /d:sonar.cs.opencover.reportsPaths=Tests/**/coverage.opencover.xml 
                /d:sonar.cs.vstest.reportsPaths=Tests/**/TestResults.trx 
                /d:sonar.sourceEncoding=UTF-8"""

    exec(SonarBeginCommand)

    exec "dotnet build"
    
    exec "dotnet test --logger "trx;LogFileName=TestResults.trx" /p:CollectCoverage=true /p:CoverletOutputFormat=opencover"

    def endCommand = """${sonarExec} end /d:sonar.login=${SonarUser} /d:sonar.password=${SonarPass}"""

    exec(endCommand)
    }
}
 

Я вижу пустое покрытие кода на нулевых (!) новых строках для покрытия.

Комментарии:

1. Tests/**/coverage.opencover.xml Tests/**/TestResults.trx Существует ли и в рабочей области? Я также вижу, что вы не заключили их в одинарные кавычки. Возможно, пути интерпретируются.

2. @agabrys Да, файлы есть: 18:22:57 Вычисление результата покрытия … 18:22:57 Генерация отчета ‘C:jenkins_slaveworkspaced_feature_TEAMX-3687-xunit-sonarSberSpaceTestsMyLib . Testscoverage.opencover.xml ‘

3. И даже sonar видит их: 18:23:17 ИНФОРМАЦИЯ: датчик C # Проверяет импорт отчета о покрытии [csharp] 18:23:17 ИНФОРМАЦИЯ: Анализ отчета об открытии C:jenkins_slaveworkspaced_feature_TEAMX-3687-xunit-sonarSberSpace . Tests MyLib. Testscoverage.opencover.xml 18:23:17 ИНФОРМАЦИЯ: Добавление этого отчета о покрытии кода в кэш для последующего повторного использования: C:jenkins_slaveworkspaced_feature_TEAMX-3687-xunit-sonarSberSpace . Tests MyLib. Testscoverage.opencover.xml 18:23:17 ИНФОРМАЦИЯ: Статистика отчета о покрытии: 2 файла, 2 основных файла, 2 основных файла с покрытием, 0 тестовых файлов, 0 файлов, исключенных из проекта, 0 файлов на другом языке

4. Coverage Report Statistics: 2 files, 2 main files, 2 main files with coverage, 0 test files, 0 project excluded files, 0 other language file звучит так, что файлы отчета о покрытии не содержат никакой информации о покрытии.

5. Тот же вывод предназначен для успешного выполнения.