Как заставить стадию Дженкинса выйти из строя и стать красной при слишком низком покрытии (с использованием C# и теста dotnet)?

Я использую C#, coverlet.msbuild и адаптер Jenkins Cobertura. У меня примерно это в моем Jenkinsfile:

stage ('Run unit tests') {
    steps {
        powershell "dotnet test -c:Release /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura --no-build --no-restore --logger trx"
    }
    post {
        always {
            step([$class: 'MSTestPublisher'])
            publishCoverage failUnhealthy: true, 
                globalThresholds: [[thresholdTarget: 'Package', unhealthyThreshold: 50.0]],
                adapters: [coberturaAdapter(
                    mergeToOneReport: true, 
                    path: '**/*.cobertura.xml')]
        }
    }
}

Это приводит к сбою моей сборки Jenkins, если охват ниже 50% на уровне пакета. Все идет нормально.

Но когда сборка из-за этого терпит неудачу, она настроена враждебно к пользователю и трудно понять, почему. Этап "Выполнить модульные тесты" выделен зеленым цветом в Blue Ocean.

Могу ли я сделать этот этап красным при сбое сборки, чтобы было легче понять, в чем заключается ошибка?

2 ответа

Решение

Вдохновленный ответом Sers и другим прочитанным мной кодом Jenkinsfile, я пришел к этому решению, которое делает то, что я хочу:

stage ('Run unit tests') {
    steps {
        powershell "dotnet test -c:Release /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura --no-build --no-restore --logger trx"
    }
    post {
        always {
            step([$class: 'MSTestPublisher'])
            publishCoverage failUnhealthy: true, 
                globalThresholds: [[thresholdTarget: 'Package', unhealthyThreshold: 50.0]],
                adapters: [coberturaAdapter(
                    mergeToOneReport: true, 
                    path: '**/*.cobertura.xml')]
            script {
                if (currentBuild.result == 'FAILURE') {
                    error("Test coverage is too low.")
                }
            }
        }
    }
}

Вы можете установить currentBuild.result к FAILURE если publishCoverage правда. currentBuild.displayName а также currentBuild.description по желанию:

post {
    always {
        script {
            def failed = publishCoverage (failUnhealthy: true, 
                        globalThresholds: [[thresholdTarget: 'Package', unhealthyThreshold: 50.0]],
                        adapters: [coberturaAdapter(
                            mergeToOneReport: true, 
                            path: '**/*.cobertura.xml')])
            if (failed) {
                currentBuild.result = 'FAILURE'
                currentBuild.displayName = "${currentBuild.displayName} Coverage"
                currentBuild.description = "Coverage lower than 50%"
            }
        }
    }
}
Другие вопросы по тегам