1. jenkins在代码扫描时sonar status is ‘PENDING’

如下报错,Checking status of SonarQube task 'XXXXXXX' on server 'sonar' SonarQube task 'XXXXXXXXX' status is 'PENDING'

sonar一直在pending状态,直到超时。原因是代码还在质量检测中,pipline就执行了waitForQualityGate()没有在sonar中添加jenkins webhook来反馈结果,所以有卡住的线性。有3种解决办法,第一种就是添加webhook反馈结果,这里不讲,也不是我的解决方案,其他2种。

1. 查看后台的运行时间,让waitForQualityGate() 在这个时间后执行,缺点:等待时间不确定。

在这里插入图片描述

在这里插入图片描述
pipline代码如下:

    withSonarQubeEnv('sonarqube') {
        sh "sonar-scanner -X;"
        sleep 5
    }
    if (this.waitScan) { 
        // 就这这里添加延时,保证sonar后台执行完毕后在执行 waitForQualityGate()
        sleep 120
        timeout(time: 3, unit: 'MINUTES') { 
            def qg = waitForQualityGate()
            String stage = "${env.stage_name}"
            if (qg.status != 'OK') {
                this.msg.updateBuildMessage(env.BUILD_TASKS, "${stage} Failed...  **×**")
                updateGitlabCommitStatus(name: "${stage}", state: 'failed')
                error "Pipeline aborted due to quality gate failure: ${qg.status}"
            } else {
                this.msg.updateBuildMessage(env.BUILD_RESULT, "${stage} OK...  **√**")
                updateGitlabCommitStatus(name: "${stage}", state: 'success')
            }
        }
    } else {
        echo "skip waitScan"
    } 

2. 获取sonar扫描的报告,查看是否通过 (我的解决方案)。
 withSonarQubeEnv('sonarqube') {
        sh "sonar-scanner -X;"
        sleep 5
    }
    if (this.waitScan) { 
        //  sleep 120
        timeout(time: 10, unit: 'MINUTES') {
            //新增
            String authString = "${this.userName}:${this.passWord}"
            def reportFilePath = "target/sonar/report-task.txt"
            def reportTaskFileExists = fileExists "${reportFilePath}"
            if (reportTaskFileExists) {
                echo "Found report task file"
                def taskProps = readProperties file: "${reportFilePath}"
                echo "taskId[${taskProps['ceTaskId']}]"
                while (true) {
                    sleep 20
                    def taskStatusResult =
                            sh(returnStdout: true,
                                    script: "curl -s -X GET -u ${authString} \'sonarqube:9000/api/ce/task?id=${taskProps['ceTaskId']}\'")
                    echo "taskStatusResult[${taskStatusResult}]"
                    def taskStatus = new JsonSlurper().parseText(taskStatusResult).task.status
                    // Status can be SUCCESS, ERROR, PENDING, or IN_PROGRESS. The last two indicate it's
                    if (taskStatus != "IN_PROGRESS" && taskStatus != "PENDING" && taskStatus != "") {
                        break;
                    }
                }
            }

            String stage = "${env.stage_name}"
            this.msg.updateBuildMessage(env.BUILD_RESULT, "${stage} OK...  **√**")
            updateGitlabCommitStatus(name: "${stage}", state: 'success') 
        }
    } else {
        echo "skip waitScan"
    }

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐