【问题标题】:How to react on SonarQube Quality Gate within Jenkins Pipeline如何在 Jenkins Pipeline 中对 SonarQube 质量门做出反应
【发布时间】:2017-03-23 02:52:16
【问题描述】:

在我的 Jenkins 流水线中,我需要对 SonarQube 质量门做出反应。 有没有更简单的方法来实现这一点,但在 Sonar-Scanner 日志中查找结果页面(例如https://mysonarserver/sonar/api/ce/task?id=xxxx)并从那里解析 JSON 结果?

我使用 Jenkins 2.30 和 SonarQube 5.3

提前致谢

【问题讨论】:

    标签: jenkins sonarqube jenkins-pipeline sonarqube-scan


    【解决方案1】:

    根据文森特的回答,并使用Pipeline utility steps,这是我的更新版本,适用于我(使用声纳扫描仪报告文件):

       withSonarQubeEnv('SONAR 6.4') {
                        sh "${scannerHome}/bin/sonar-scanner"
                        sh "cat .scannerwork/report-task.txt"
                        def props = readProperties  file: '.scannerwork/report-task.txt'
                        echo "properties=${props}"
                        def sonarServerUrl=props['serverUrl']
                        def ceTaskUrl= props['ceTaskUrl']
                        def ceTask
                        timeout(time: 1, unit: 'MINUTES') {
                            waitUntil {
                                def response = httpRequest ceTaskUrl
                                ceTask = readJSON text: response.content
                                echo ceTask.toString()
                                return "SUCCESS".equals(ceTask["task"]["status"])
                            }
                        }
                        def response2 = httpRequest url : sonarServerUrl + "/api/qualitygates/project_status?analysisId=" + ceTask["task"]["analysisId"], authentication: 'jenkins_scanner'
                        def qualitygate =  readJSON text: response2.content
                        echo qualitygate.toString()
                        if ("ERROR".equals(qualitygate["projectStatus"]["status"])) {
                            error  "Quality Gate failure"
                        }
                    }
    

    请注意使用 Jenkins 凭据(身份验证:'jenkins_scanner')来检索正在被身份验证的声纳中的质量门。

    【讨论】:

    • 嗨@tibo,你能告诉我你是如何使用“jenkins_scanner”对sonarqube进行身份验证的吗?
    • 我知道了,它来自http请求插件。 stackoverflow.com/questions/41571090/… 非常感谢,这个答案帮助我实现了质量门故障通知。
    【解决方案2】:

    使用SonarQube Scanner for Jenkins 2.8.1,解决方案开箱即用:

    stage('SonarQube analysis') {
        withSonarQubeEnv('My SonarQube Server') {
            sh 'mvn clean package sonar:sonar'
        } // SonarQube taskId is automatically attached to the pipeline context
      }
    }
    stage("Quality Gate"){
        timeout(time: 1, unit: 'HOURS') { // Just in case something goes wrong, pipeline will be killed after a timeout
        def qg = waitForQualityGate() // Reuse taskId previously collected by withSonarQubeEnv
        if (qg.status != 'OK') {
            error "Pipeline aborted due to quality gate failure: ${qg.status}"
        }
      }
    }
    

    【讨论】:

    • 此解决方案完美运行。这里唯一需要补充的是,我们需要在声纳上配置 jenkins webhook 才能使其工作。
    • 调用 waitForQualityGate() 时会发生什么? jenkins 是否会联系 sonarqube 服务器并检查其状态?如果您没有配置 webhook,是否仍可以通过运行 waitForQualityGate() 多次轮询来轮询 sonarqube?
    • @red888 - 我认为没有 Webhook 就无法工作。见这里:docs.sonarqube.org/latest/analysis/scan/…
    【解决方案3】:

    先扫描:

    node("sonar") {
          deleteDir()
          unstash 'sources'
          def scannerHome = tool 'sonar-scanner'; 
          withSonarQubeEnv('sonarqube-rec') {
              withEnv(["JAVA_HOME=${ tool 'JDK_8.0' }", "PATH+MAVEN=${tool 'M325'}/bin:${env.JAVA_HOME}/bin"]) {        
               // requires SonarQube Scanner for Maven 3.2+
               sh '''
                 mvn org.sonarsource.scanner.maven:sonar-maven-plugin:3.2:sonar
                 echo "SONAR_AUTH_TOKEN=$SONAR_AUTH_TOKEN" >> target/sonar/report-task.txt
               '''
               stash includes: "target/sonar/report-task.txt", name: 'sonar-report-task'
              }
          }
        }
    

    然后检查质量门:

        stage("Quality Gate"){
        node("sonar") {
            deleteDir()
            unstash 'sonar-report-task'
            def props = utils.getProperties("target/sonar/report-task.txt")
            echo "properties=${props}"
            def sonarServerUrl=props.getProperty('serverUrl')
            def ceTaskUrl= props.getProperty('ceTaskUrl')
            def ceTask
            def URL url = new URL(ceTaskUrl)
              timeout(time: 1, unit: 'MINUTES') {
                waitUntil {
                  ceTask = utils.jsonParse(url)
                  echo ceTask.toString()
                  return "SUCCESS".equals(ceTask["task"]["status"])
                }
              }
              url = new URL(sonarServerUrl + "/api/qualitygates/project_status?analysisId=" + ceTask["task"]["analysisId"] )
              def qualitygate =  utils.jsonParse(url)
              echo qualitygate.toString()
              if ("ERROR".equals(qualitygate["projectStatus"]["status"])) {
                error  "Quality Gate failure"
              }
       }
    }
    

    【讨论】:

      【解决方案4】:

      我使用“.sonar/report-task.txt”来检索 ceTaskUrl - 然后我使用 Pipeline Shared Libraries 并编写了自己的管道函数来检索质量门。

      http://mySonarQube.com:9001/api/ce/task?id="ceTaskUrl"

      解析“task.analysisId”

      http://mySonarQube.com:9001/api/qualitygates/project_status?analysisId="task.analysisId" 解析质量门

      【讨论】:

      • 你在 Github 上的某个地方碰巧有你的库的源代码吗?我是 Groovy 的新手,想从一个例子中学习。谢谢。
      • 我刚刚为这个函数创建了一个仓库:github.com/chforster/JenkinsPipelineLibrary
      猜你喜欢
      • 2019-07-20
      • 2016-01-31
      • 2021-05-06
      • 2020-07-21
      • 1970-01-01
      • 2015-07-05
      • 2016-08-11
      • 2017-08-09
      • 2018-12-24
      相关资源
      最近更新 更多