如何在 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 DSL中 遍历 groovy list