如何在 Jenkins Pipeline 中对 SonarQube 质量门做出反应

Posted

技术标签:

【中文标题】如何在 Jenkins Pipeline 中对 SonarQube 质量门做出反应【英文标题】:How to react on SonarQube Quality Gate within Jenkins Pipeline 【发布时间】: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

提前致谢

【问题讨论】:

【参考方案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请求插件。 ***.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

以上是关于如何在 Jenkins Pipeline 中对 SonarQube 质量门做出反应的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins Pipeline第一次演进

[转] 在Jenkins Pipeline DSL中 遍历 groovy list

Jenkins pipeline 并行执行任务流

如何使用Jenkins构建基本的Pipeline

如何使用 Jenkins 的脚本化流水线(Pipeline)

基于 Jenkins Pipeline 自动化部署