如果不满足成功条件,Quality Gate不会失败

问题描述

我已经通过SonarQube为我的Jenkins项目建立了Quality Gate。我的一个项目根本没有测试,因此在分析中我看到代码覆盖率为0%。根据质量门规则(

我遇到一个与分析有关的错误,该错误之前总是返回0%的覆盖率,但是设法解决了这一问题(在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”。如果需要确定任务是否仍在运行,则必须检查最后两个值之一。如果需要确定任务是否完成,则需要检查前两个值之一。您正在检查完成情况,但是仅在检查“成功”情况。这意味着如果任务失败(如果质量门失败)(在这里没有发生),您将继续等待直到超时。