SonarQube 不会将 waitForQualityGate() 的状态返回给詹金斯?

Posted

技术标签:

【中文标题】SonarQube 不会将 waitForQualityGate() 的状态返回给詹金斯?【英文标题】:SonarQube does not return status of waitForQualityGate() to jenkins? 【发布时间】:2019-10-06 03:31:14 【问题描述】:

我在 jenkins 管道中使用了 sonarQube。我已经在 jenkins 中安装了所有与 sonarqube 相关的插件。在jenkins配置系统中,我正确配置了sonarqube服务器,jenkins全局工具配置我正确配置了SonarQube Scanner。

这是詹金斯管道代码..

node
stage('git checkout process')
  echo 'started checkout'
  git 'https://github.com/ramkumar/sampleproject'
  echo 'completed sucessfully'


stage('compile package')
  def mvnTool = tool name: 'Maven', type: 'maven'
  sh "$mvnTool/bin/mvn clean install" 


  stage('SonarQube analysis') 
    withSonarQubeEnv('sonarqube') 
      mvnHome = '/opt/apache-maven/bin'
      sh "$mvnHome/mvn sonar:sonar"

    
  

  stage("Quality Gate")
          timeout(time: 1, unit: 'HOURS') 
              def qg = waitForQualityGate()
              if (qg.status != 'OK') 
                  emailext body: 'Your code was failed due to sonarqube quality gate', subject: 'Jenkins Failed Report', to: 'prakashpp666666@gmail.com'
                  error "Pipeline aborted due to quality gate failure: $qg.status"

              
          
      

我还在 sonarqube 中配置了 webhook。但是当我构建工作时,3 阶段 waitForQualityGate() 没有将 ok 状态返回给詹金斯,而是显示 在服务器“sonarqube”上检查 SonarQube 任务“AWrQj5In7abK9JVZ9”的状态 SonarQube 任务“AWrQj5In7abK9JVZ9”状态为“IN_PROGRESS”

它不断加载它没有完成。当我签入 sonarqube 服务器时,它显示 Response: Server Unreachable。我没有在本地运行 sonarqube,它在 docker 上运行。可能有什么问题?

【问题讨论】:

【参考方案1】:

为质量门配置 SonarQube webhook

管理 > 配置 > Webhook > 创建

该 URL 应指向您的 Jenkins 服务器 http://JENKINS_HOST/sonarqube-webhook/

这对我来说已经解决了。因为我不知道这个钩子。一旦我配置了这个,一切都很顺利。

【讨论】:

【参考方案2】:

按照官方文档 here 和 here 中的建议,我能够通过在 SonarQube 服务器上为 Jenkins 实例配置一个 webhook 来让 waitForQualityGate() 正常工作。

在您的 SonarQube 服务器配置中添加您的<your-jenkins-instance>/sonarqube-webhook/ 形式的 webhook,指向您的 Jenkins 实例。请注意尾部斜杠很重要。

【讨论】:

【参考方案3】:

尝试在检查前加上sleep(60)命令:

sleep(60)
timeout(time: 1, unit: 'MINUTES') 
    def qg = waitForQualityGate()
    print "Finished waiting"
    if (qg.status != 'OK') 
        error "Pipeline aborted due to quality gate failure: $qg.status"
    
  

它为我解决了同样的问题。

【讨论】:

这可能是一个有用的解决方法,但它并不能真正解决问题。问题是 SonarQube 在扫描完成时未能触发 Jenkins webhook。通过添加延迟,SonarQube 可能会在 waitForQualityGate 开始之前完成扫描,因此 waitForQualityGate 可以立即返回,而不是等待 webhook。如果由于某种原因扫描未完成,则 waitForQualityGate 仍将超时,因为未触发 webhook。【参考方案4】:

我通过在 SonarQube 中创建一个 webhook 解决了这个问题。

    在您的项目/项目设置中,选择 Webhooks

    将网址设置为 https://YOUR_JENKINS_URL/sonarqube-webhook/

ps:如果您从 SQ 错误地得到 FAIL,请验证您的 SonarQube 服务器的 url(在 Jenkins 设置中)不以 '/' 结尾

【讨论】:

以上是关于SonarQube 不会将 waitForQualityGate() 的状态返回给詹金斯?的主要内容,如果未能解决你的问题,请参考以下文章

Sonarqube + Jacoco - 声纳不会从属性中读取报告路径

“更改此条件,使其不会总是评估为假” - SonarQube

为啥删除的 Maven 模块不会从 SonarQube 中消失?

SonarQube 不会向 Discord webhook 发送通知

连接到 PostgresQL 时,Sonarqube 不会加载其页面而没有任何错误消息

SonarQube 中的质量门故障不会导致 Teamcity 中的构建失败