当不满足成功条件时,质量门不会失败
Quality Gate does not fail when conditions for success are not met
我已经通过 SonarQube 为我的 Jenkins 项目建立了 Quality Gate。我的一个项目根本没有测试,所以在分析中我看到代码覆盖率为 0%。根据质量门规则(<60% 的覆盖率 = 失败)我的管道应该 return 一个错误。但是,这不会发生。质量门表示分析成功,质量门为 'OK'。在另一个项目中,我删除了一些测试以使覆盖率 <60%,并且质量门再次通过,即使它注定要失败。
我有一个与分析相关的错误,之前总是 returning 0% 的覆盖率,但设法修复了它(在 this link). Found a lot of articles with the similar questions but with no answers on any of them. This post 的帮助下看起来很有希望,但我找不到合适的替代品建议。
值得一提的是,分析阶段是与另一个阶段并行进行的(以节省一些时间)。质量门阶段紧随其后。
我用来初始化我的项目分析的相关代码是(org.jacoco...位是我上面提到的0%覆盖率错误的解决方案):
sh "mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent verify sonar:sonar -Dsonar.host.url=${env.SONAR_HOST_URL} -Dsonar.login=${env.SONAR_AUTH_TOKEN} -Dsonar.projectKey=${projectName} -Dsonar.projectName=${projectName} -Dsonar.sources=. -Dsonar.java.binaries=**/* -Dsonar.language=java -Dsonar.exclusions=$PROJECT_DIR/src/test/java/** -f ./$PROJECT_DIR/pom.xml"
完整的质量门代码(阐明我的质量门是如何开始和结束的):
stage("Quality Gate") {
steps {
timeout(time: 15, unit: 'MINUTES') { // If analysis takes longer than indicated time, then build will be aborted
withSonarQubeEnv('ResearchTech SonarQube'){
script{
// Workaround code, since we cannot have a global webhook
def reportFilePath = "target/sonar/report-task.txt"
def reportTaskFileExists = fileExists "${reportFilePath}"
if (reportTaskFileExists) {
def taskProps = readProperties file: "${reportFilePath}"
def authString = "${env.SONAR_AUTH_TOKEN}"
def taskStatusResult =
sh(script: "curl -s -X GET -u ${authString} '${taskProps['ceTaskUrl']}'", returnStdout: true)
//echo "taskStatusResult[${taskStatusResult}]"
def taskStatus = new groovy.json.JsonSlurper().parseText(taskStatusResult).task.status
echo "taskStatus[${taskStatus}]"
if (taskStatus == "SUCCESS") {
echo "Background tasks are completed"
} else {
while (true) {
sleep 10
taskStatusResult =
sh(script: "curl -s -X GET -u ${authString} '${taskProps['ceTaskUrl']}'", returnStdout: true)
//echo "taskStatusResult[${taskStatusResult}]"
taskStatus = new groovy.json.JsonSlurper().parseText(taskStatusResult).task.status
echo "taskStatus[${taskStatus}]"
if (taskStatus != "IN_PROGRESS" && taskStatus != "PENDING") {
break;
}
}
}
} else {
error "Haven't found report-task.txt."
}
def qg = waitForQualityGate() // Waiting for analysis to be completed
if(qg.status != 'OK'){ // If quality gate was not met, then present error
error "Pipeline aborted due to quality gate failure: ${qg.status}"
}
}
}
}
}
}
项目的 SonarQube UI 中显示了什么?是否表明质量门失败?
我不太明白你在那个管道脚本中做了什么。看起来您确实两次调用“waitForQualityGate()”,但仅在第二次调用时检查错误。我使用脚本化管道,所以我知道它看起来会略有不同。
更新:
根据您的补充评论,如果 SonarQube UI 表示它通过了质量门槛,那么这意味着您的管道代码没有任何问题(至少在质量门槛方面)。问题将出在您的质量门的定义中。
但是,我还要指出另一个关于您检查后台任务结果的错误。
“taskStatus”的可能值为“SUCCESS”、“ERROR”、“PENDING”和“IN_PROGRESS”。如果您需要确定任务是否仍然是 运行,则必须检查最后两个值中的任何一个。如果需要确定任务是否完成,则需要检查前两个值中的任何一个。您正在检查是否完成,但您只是在检查“成功”。这意味着如果任务失败,如果质量门失败(这里没有发生),您将继续等待直到超时。
我已经通过 SonarQube 为我的 Jenkins 项目建立了 Quality Gate。我的一个项目根本没有测试,所以在分析中我看到代码覆盖率为 0%。根据质量门规则(<60% 的覆盖率 = 失败)我的管道应该 return 一个错误。但是,这不会发生。质量门表示分析成功,质量门为 'OK'。在另一个项目中,我删除了一些测试以使覆盖率 <60%,并且质量门再次通过,即使它注定要失败。
我有一个与分析相关的错误,之前总是 returning 0% 的覆盖率,但设法修复了它(在 this link). Found a lot of articles with the similar questions but with no answers on any of them. This post 的帮助下看起来很有希望,但我找不到合适的替代品建议。
值得一提的是,分析阶段是与另一个阶段并行进行的(以节省一些时间)。质量门阶段紧随其后。
我用来初始化我的项目分析的相关代码是(org.jacoco...位是我上面提到的0%覆盖率错误的解决方案):
sh "mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent verify sonar:sonar -Dsonar.host.url=${env.SONAR_HOST_URL} -Dsonar.login=${env.SONAR_AUTH_TOKEN} -Dsonar.projectKey=${projectName} -Dsonar.projectName=${projectName} -Dsonar.sources=. -Dsonar.java.binaries=**/* -Dsonar.language=java -Dsonar.exclusions=$PROJECT_DIR/src/test/java/** -f ./$PROJECT_DIR/pom.xml"
完整的质量门代码(阐明我的质量门是如何开始和结束的):
stage("Quality Gate") {
steps {
timeout(time: 15, unit: 'MINUTES') { // If analysis takes longer than indicated time, then build will be aborted
withSonarQubeEnv('ResearchTech SonarQube'){
script{
// Workaround code, since we cannot have a global webhook
def reportFilePath = "target/sonar/report-task.txt"
def reportTaskFileExists = fileExists "${reportFilePath}"
if (reportTaskFileExists) {
def taskProps = readProperties file: "${reportFilePath}"
def authString = "${env.SONAR_AUTH_TOKEN}"
def taskStatusResult =
sh(script: "curl -s -X GET -u ${authString} '${taskProps['ceTaskUrl']}'", returnStdout: true)
//echo "taskStatusResult[${taskStatusResult}]"
def taskStatus = new groovy.json.JsonSlurper().parseText(taskStatusResult).task.status
echo "taskStatus[${taskStatus}]"
if (taskStatus == "SUCCESS") {
echo "Background tasks are completed"
} else {
while (true) {
sleep 10
taskStatusResult =
sh(script: "curl -s -X GET -u ${authString} '${taskProps['ceTaskUrl']}'", returnStdout: true)
//echo "taskStatusResult[${taskStatusResult}]"
taskStatus = new groovy.json.JsonSlurper().parseText(taskStatusResult).task.status
echo "taskStatus[${taskStatus}]"
if (taskStatus != "IN_PROGRESS" && taskStatus != "PENDING") {
break;
}
}
}
} else {
error "Haven't found report-task.txt."
}
def qg = waitForQualityGate() // Waiting for analysis to be completed
if(qg.status != 'OK'){ // If quality gate was not met, then present error
error "Pipeline aborted due to quality gate failure: ${qg.status}"
}
}
}
}
}
}
项目的 SonarQube UI 中显示了什么?是否表明质量门失败?
我不太明白你在那个管道脚本中做了什么。看起来您确实两次调用“waitForQualityGate()”,但仅在第二次调用时检查错误。我使用脚本化管道,所以我知道它看起来会略有不同。
更新:
根据您的补充评论,如果 SonarQube UI 表示它通过了质量门槛,那么这意味着您的管道代码没有任何问题(至少在质量门槛方面)。问题将出在您的质量门的定义中。
但是,我还要指出另一个关于您检查后台任务结果的错误。
“taskStatus”的可能值为“SUCCESS”、“ERROR”、“PENDING”和“IN_PROGRESS”。如果您需要确定任务是否仍然是 运行,则必须检查最后两个值中的任何一个。如果需要确定任务是否完成,则需要检查前两个值中的任何一个。您正在检查是否完成,但您只是在检查“成功”。这意味着如果任务失败,如果质量门失败(这里没有发生),您将继续等待直到超时。