PR预览分析导致waitForQualityGate失败

时间:2017-06-08 12:57:17

标签: sonarqube sonarqube-scan

今天我在设置Jenkins管道脚本时遇到了异常,该脚本会检查质量门 并注释任何新问题的拉请求。

我们的设置包含:

  • SonarQube 6.2
  • BitBucket Stash
  • 詹金斯2(有2个奴隶)
  • AmadeusITGroup存储插件

部分管道脚本:

node(node_label) {
    stage("SonarQube analysis") {
        withSonarQubeEnv('SonarQube') {
            def sonarQubeCommand = "org.sonarsource.scanner.maven:sonar-maven-plugin:3.2:sonar " +
                    "-Dsonar.host.url=https://sonar-url " +
                    "-Dsonar.login=sonarqube " +
                    "-Dsonar.password=token " +
                    "-Dsonar.language=java " +
                    "-Dsonar.sources=. " +
                    "-Dsonar.inclusions=**/src/main/java/**/*"
            if (pr.id != '') {
                sonarQubeCommand = sonarQubeCommand +
                        " -Dsonar.analysis.mode=preview" +
                        " -Dsonar.stash.notification=true " +
                        " -Dsonar.stash.project=" + pr.project_key +
                        " -Dsonar.stash.repository=" + pr.repository_slug +
                        " -Dsonar.stash.pullrequest.id=" + pr.id +
                        " -Dsonar.stash.password=token"
            }
            pipeline.mvn(sonarQubeCommand)
        }
    }
}

stage("Check Quality Gate") {
    timeout(time: 1, unit: 'HOURS') {
        def qg = waitForQualityGate()
        waitUntil {
            // Sometimes an analysis will get the status PENDING meaning it still needs to be analysed.
            if (qg.status == 'PENDING') {
                qg = waitForQualityGate()
                return false
            } else {
                return true
            }
        }
        node(node_label) {
            if (qg.status != 'OK') {
                bitbucket.comment(pr, "_${env.JOB_NAME}#${env.BUILD_NUMBER}:_ **[✖ BUILD FAILURE](${build_url})**")
                bitbucket.approve(pr, false)
                pipeline.cleanWorkspace()
                error "Pipeline aborted due to quality gate failure: ${qg.status}"
            } else {
                bitbucket.comment(pr, "_${env.JOB_NAME}#${env.BUILD_NUMBER}:_ **[✔ BUILD SUCCESS](${build_url})**")
                bitbucket.approve(pr, true)
            }
        }
    }
}

顺便说一下:如果没有waitUntil,管道就会失败,因为任务状态在SonarQube中是PENDING。 所以SonarSource博客中的例子并不适合我。

现在详细说明此管道是如何失败的:

在maven命令中使用sonar.analysis.mode = preview作为参数时 jenkins作业日志不包含SonarQube分析任务ID。 这将导致命令waitForQualityGate上的管道脚本失败。 消息如下: 无法获取SonarQube任务ID和/或服务器名称。请使用' withSonarQubeEnv'包装器来运行您的分析。

一旦我删除了sonar.analysis.mode = preview参数,jenkins日志会读取如下行:[INFO] More about the report processing at https://sonar-url/api/ce/task?id=AVyHXjcsesZZZhqzzCSf

此行使waitForQualityGate命令正常成功。 然而,除了使用PR结果在SonarQube中进行项目污染之外,这还有一个不必要的副作用。 副作用是当在拉取请求中添加问题时,不会在存储中的拉取请求中报告。 它总是报告零新问题,这显然是错误的。 由于它不再是预览分析,我可以在SonarQube服务器上看到新问题。

所以不知怎的,我现在必须在拉出请求注释新问题之间做出选择 检查质量门。 显然我想做两件事。 我选择让拉请求注释正常工作,暂时跳过检查质量门。

问题仍然是我在这里做错了或者我是否必须等待新版本的扫描仪和/或藏匿插件才能解决这个问题?

1 个答案:

答案 0 :(得分:1)

在声纳的服务器上,请转到:

  

管理>配置>一般设置>网络挂接

     

名称:詹金斯或类似的东西

     

网址http://127.0.0.1:8080/sonarqube-webhook/

其中,URL是Jenkins主机。

<强>原因

默认情况下,声纳上的webkooks是https,而我的jenkins正在使用http。