【问题标题】: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 将我的工作状态更改为失败吗?

标签: sonarqube jenkins-pipeline quality-gate


【解决方案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 命令,但没有成功。
猜你喜欢
  • 2012-09-15
  • 1970-01-01
  • 2022-08-05
  • 1970-01-01
  • 2018-05-01
  • 2019-01-29
  • 2013-11-22
  • 2012-02-21
  • 1970-01-01
相关资源
最近更新 更多