在 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 类中的extractSonarProjectURLFromLogs
和extractReportTask
方法,了解它们的工作原理:
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的主要内容,如果未能解决你的问题,请参考以下文章