如何在Jenkins脚本化流水线中传参使Sonar结果失败时终止流水线
Jenkins脚本化流水线中传递SonarQube参数终止流水线
问题背景
我是Groovy新手,正在使用Jenkins脚本化流水线,项目为Gradle类型。我们在Jenkinsfile中引入了sonarqube.groovy库,希望基于SonarQube质量门结果终止流水线。该库的scan方法默认stopOnFailure: false,将其设为true即可实现需求,但我无法修改该库,请问如何在Jenkinsfile中传递这个参数?
附sonarqube.groovy代码:
def scan(Map args=[stopOnFailure:false, waitForCompletion:true], Closure closure) { closure.resolveStrategy = Closure.DELEGATE_FIRST withEnv(["JAVA_HOME=${tool 'JDK 11'}"]) { withEnv(["PATH+SONARSCANNER=${tool 'SonarQube Scanner'}/bin"]) { withSonarQubeEnv('CICD Sonarqube') { closure() env.SONARQUBE_URL = env.SONAR_HOST_URL } if (args.waitForCompletion == true) { sleep 5 timeout(time: 1, unit: 'HOURS') { // 防止异常情况,超时后终止流水线 def qg = waitForQualityGate() // 复用withSonarQubeEnv收集的taskId if ((args.stopOnFailure == true) && (qg.status != 'OK')) { error "Pipeline aborted due to quality gate failure: ${qg.status}" } } } } } }
原Jenkinsfile代码片段:
stage('CodeQuality') { withEnv(["SONAR_USER_HOME=${WORKSPACE}/.sonar"]) { withSonarQubeEnv { sh "./gradlew sonarqube" } } }
解决方案
直接调用库中的scan方法时,传入包含stopOnFailure: true的Map参数,覆盖默认值即可。scan方法内部已封装了withSonarQubeEnv、环境变量配置、质量门检查等逻辑,无需重复编写。
修改后的Jenkinsfile代码:
stage('CodeQuality') { // 确保已通过@Library等方式引入sonarqube库 sonarqube.scan([stopOnFailure: true]) { withEnv(["SONAR_USER_HOME=${WORKSPACE}/.sonar"]) { sh "./gradlew sonarqube" } } }
说明
- 调用
scan方法时,传入[stopOnFailure: true],会覆盖方法默认的stopOnFailure: false参数 waitForCompletion默认值为true,如果不需要修改可以不用显式传递scan方法会自动处理JDK、SonarScanner路径、SonarQube环境绑定,以及等待质量门结果并根据参数终止流水线的逻辑
内容的提问来源于stack exchange,提问作者Pritish
相关产品推荐
相关产品推荐

