不满足成功条件时,质量之门不会失败
Posted
技术标签:
【中文标题】不满足成功条件时,质量之门不会失败【英文标题】:Quality Gate does not fail when conditions for success are not met 【发布时间】:2021-02-09 23:15:08 【问题描述】:我已经通过 SonarQube 为我的 Jenkins 项目建立了质量门。我的一个项目根本没有测试,所以在分析中我看到代码覆盖率为 0%。根据质量门规则(
我有一个与分析相关的错误,之前总是返回 0% 的覆盖率,但设法修复它(在 this 链接的帮助下)。发现很多文章都有类似的问题,但没有任何一个答案。这个post 看起来很有希望,但我找不到合适的替代方案来替代它的建议。
值得一提的是,分析阶段与另一个阶段并行完成(以节省一些时间)。质量门阶段很快就会到来。
我用来为我的项目初始化分析的相关代码是(org.jacoco...bit是我上面提到的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"
【问题讨论】:
您在哪个分支上执行分析?如果是功能分支或长期存在的分支(比如 master、release 或 development) @SouravAtta 在我希望进行分析的分支上(我正在使用多分支项目,它似乎适用于选定的 Git 分支) 是的,它是长寿命分支还是短寿命分支?可能是您正在对短期分支进行分析,因此质量门状态不正确。因为你不能为短期分支附加质量门。它只能以硬编码的方式完成。 docs.sonarqube.org/7.9/branches/short-lived-branches/…. @SouravAtta 根据您分享的一篇文章,我不确定。我没有使用我当前的 Git 分支几个星期,而是因为我几乎每天都在编辑很多东西,所以它是短暂的? (在质量门眼中就是) @SouravAtta 我已经设法硬编码我的质量门,现在它可以工作了。不理想,但我可以做到。我唯一的问题是我在 SonarQube UI 的分析仍然说 QG 已经通过了。我怎样才能改变它?我真的很想在服务器上进行分析。我可以通过 API 将我的工作状态更改为失败吗? 【参考方案1】:项目的 SonarQube UI 中显示了什么?它是否表明质量门失败了?
我不太明白你在那个管道脚本中做了什么。看起来您确实调用了两次“waitForQualityGate()”,但仅在第二次调用时检查错误。我使用脚本化管道,所以我知道它看起来会略有不同。
更新:
根据您的附加评论,如果 SonarQube 用户界面说它通过了质量门,那么这意味着您的管道代码没有问题(至少在质量门方面)。问题在于您的质量门的定义。
但是,我还要指出您检查后台任务结果的另一个错误。
“taskStatus”的可能值为“SUCCESS”、“ERROR”、“PENDING”和“IN_PROGRESS”。如果您需要确定任务是否仍在运行,则必须检查最后两个值中的任何一个。如果您需要确定任务是否完成,您需要检查前两个值中的任何一个。您正在检查是否完成,但您只检查“成功”。这意味着如果任务失败,如果质量门失败(这里没有发生),你将继续等待它,直到你超时。
【讨论】:
首先,我忘记删除第一次调用“waitForQualityGate”调用。我的错。我将为您更新我的代码以查看完整的质量门脚本。简而言之:一旦完成了 webhook 的工作,我就会检查质量门 至于我的UI,它说QG每次都通过 发现了我的问题。你错误地定义了 QG 是对的。另外,在我的另一个项目WARN: Found multiple 'report-task.txt' in the workspace. Taking the first one.
中有以下警告我如何删除所有这些report-task.txt 文件?我怎样才能确保我始终只有一个?
带有上述警告的项目是参数化的 - 该参数确定用于项目构建的文件夹(每个文件夹都有一些代码、测试、POM 文件等)。尝试通过 shell 函数运行 rm
命令,但没有成功。以上是关于不满足成功条件时,质量之门不会失败的主要内容,如果未能解决你的问题,请参考以下文章