在 Jenkins 声明式管道中使用 waitForQualityGate

Posted

技术标签:

【中文标题】在 Jenkins 声明式管道中使用 waitForQualityGate【英文标题】:Using waitForQualityGate in a Jenkins declarative pipeline 【发布时间】:2017-08-12 01:49:07 【问题描述】:

Jenkins 2.50 中声明性管道中的以下 SonarQube (6.3) 分析阶段失败,控制台日志中出现此错误:http://pastebin.com/t2ja23vC。更具体地说:

在此作业 (SonarGate) 中定义的 SonarQube 安装与任何已配置的安装不匹配。可配置的安装数量:1。

更新:在 Jenkins 设置中将“SonarQube”更改为“SonarGate”(在 SonarQube 服务器下,因此它将与 Jenkinsfile 匹配)后,我得到一个不同的错误:http://pastebin.com/HZZ6fY6V

java.lang.IllegalStateException:无法获取 SonarQube 任务 ID 和/或服务器名称。请使用“withSonarQubeEnv”包装器来运行您的分析。


该阶段是对 SonarQube 文档中示例的修改:https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+Jenkins#AnalyzingwithSonarQubeScannerforJenkins-AnalyzinginaJenkinspipeline

stage ("SonarQube analysis") 
     steps 
        script 
           STAGE_NAME = "SonarQube analysis"

           if (BRANCH_NAME == "develop") 
              echo "In 'develop' branch, don't analyze."
           
           else  // this is a PR build, run sonar analysis
              withSonarQubeEnv("SonarGate") 
                 sh "../../../sonar-scanner-2.9.0.670/bin/sonar-scanner"   
              
           
        
     
  

  stage ("SonarQube Gatekeeper") 
     steps 
        script 
           STAGE_NAME = "SonarQube Gatekeeper"

           if (BRANCH_NAME == "develop") 
              echo "In 'develop' branch, skip."
           
           else  // this is a PR build, fail on threshold spill
              def qualitygate = waitForQualityGate()
              if (qualitygate.status != "OK") 
                 error "Pipeline aborted due to quality gate coverage failure: $qualitygate.status"
               
           
        
     
       

我还创建了一个 Webhook sonarqube-webhook,其 URL 为 http://****/sonarqube-webhook/。应该是这样,还是http://****/sonarqube/sonarqube-webhook?要访问服务器仪表板,我使用http://****/sonarqube

在 SonarQube 的质量门部分,我创建了一个新的质量门:

我不确定 SonarGate 中的设置是否正确。我确实使用 jenkins-mocha 来生成一个 lcov.info 文件,该文件在 Sonar 中用于生成覆盖数据。

也许质量门设置是错误的设置?如果不满足覆盖率 %,最终结果是 Jenkins 中的工作失败。

最后,我不确定Jenkins系统配置中是否需要以下配置:

(这是 9000 而不是 900...截屏中的文字)

【问题讨论】:

Do not post images of code or errors! 图片和屏幕截图可以很好地添加到帖子中,但请确保帖子在没有它们的情况下仍然清晰有用。如果您发布代码或错误消息的图像,请确保您还复制并粘贴或直接在帖子中输入实际代码/消息。 帖子中没有代码截图。帖子超级清晰。 【参考方案1】:

SonarQube Jenkins 插件扫描构建输出中的两个特定行,用于获取 SonarQube 报告任务属性和项目 URL。如果您对sonar-scanner 的调用未输出这些行,则waitForQualityGate() 调用将没有任务ID 来查找它们。因此,您必须找出正确的设置以使其更详细。

查看插件SonarUtils 类中的extractSonarProjectURLFromLogsextractReportTask 方法,了解它们的工作原理:

ANALYSIS SUCCESSFUL, you can browse <project URL> 用于添加徽章链接(在构建历史中) Working dir: <dir with report-task.txt> 用于将任务 ID 传递给 waitForQualityGate 步骤

【讨论】:

谢谢,但所有这些都没有在此功能的文档中提及。事实上,该文档的重量非常轻,以至于它看起来非常即插即用。如果不是这样,那么 SonarQube 确实需要让集成比看起来更顺畅。 这里没有提到,因为它是技术实现细节。我们的目标是让它“即插即用”,但我们失败了,至少在 Gradle 项目中是这样。它仍然适用于其他情况。我们正在调查一个主/从问题。 谢谢,我确实在我的 Jenkins 设置中使用了从站。同一个从站(构建机器)也托管 SonarQube 服务器。 如果您需要我做任何实验,请告诉我。 SonarUtils 的链接帮助我确定 report-task.txt 仅考虑来自活动 (Jenkins) 工作区而不是当前目录。 IE。在 waitForQualityGate() 修复它之前运行 cp /app/.scannerwork/report-task.txt .【参考方案2】:

当使用 Jenkins 从站执行作业时,发现这是 Jenkins 的 SonarQube 扫描仪中的一个错误(如果作业在主站上运行,它会工作)。你可以在这里阅读更多:https://jira.sonarsource.com/browse/SONARJNKNS-282

我已经使用扫描仪插件 v2.61 的测试版本对此进行了测试,发现它可以正常工作。 解决方案是发布后升级到v2.61。

然后这个阶段将起作用:

stage ("SonarQube analysis") 
   steps 
      withSonarQubeEnv('SonarQube') 
         sh "../../../sonar-scanner-2.9.0.670/bin/sonar-scanner"   
      

      def qualitygate = waitForQualityGate()
      if (qualitygate.status != "OK") 
         error "Pipeline aborted due to quality gate coverage failure: $qualitygate.status"
      
   

【讨论】:

【参考方案3】:

如果您在 docker 容器中运行 SonarCube,请检查内存是否已耗尽。我们已经竭尽全力了。这似乎是问题所在。

【讨论】:

以上是关于在 Jenkins 声明式管道中使用 waitForQualityGate的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Jenkins 声明式管道中设置 PATH

项目根配置文件:NONE Jenkins 声明式管道

如何在 Jenkins 声明式管道中设置声纳扫描仪

如何在没有 Maven 和 Docker 的 Jenkins 声明式管道中执行 SonarQube 扫描仪

Jenkins中管道案例脚本(声明式语法)

如何在声明性 Jenkins 管道的各个阶段之间传递变量?