【发布时间】: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 将我的工作状态更改为失败吗?
标签: sonarqube jenkins-pipeline quality-gate