如何配置非流水线Maven Jenkins Job在Sonar质量门不达标时失败/告警
嗨,我来帮你搞定这个非流水线Jenkins Maven Job的Sonar质量门校验问题!针对你用的Jenkins 2.176.3版本,这里有两个靠谱的方案,能让Job在质量门不达标时直接失败或者进入告警状态:
方案一:用SonarQube Scanner插件的Post-build校验(推荐)
这个方法最省心,插件已经帮我们封装了所有逻辑,不用自己写脚本:
- 首先确认你的Jenkins已经安装了SonarQube Scanner插件(注意插件版本要和你的SonarQube服务器兼容,Jenkins 2.176.3别装太新的插件版本,避免兼容性问题)
- 配置步骤:
- 打开你的非流水线Maven Job的配置页面
- 往下滑到Post-build Actions区域,点击「Add post-build action」,选择「SonarQube quality gate check」
- 选中你之前在Jenkins全局配置里设置好的SonarQube服务器(如果还没配置,先去Jenkins首页的「Manage Jenkins」→「Configure System」里添加,填好Sonar服务器URL和权限令牌)
- 如果你想让Job在质量门失败时直接标记为失败,就勾选「Abort the build if the quality gate is failed」;要是只想告警(比如标记为不稳定的黄色状态),就勾选「Mark the build as unstable if the quality gate is failed」
- 保存配置,重新跑一次Job试试就行
方案二:用脚本调用SonarQube API手动校验
如果插件的方式不适用(比如插件版本兼容问题),可以用脚本自己调用Sonar的API来判断质量门状态:
- 配置步骤:
- 在Job的「Build」区域,在
mvn sonar:sonar这条命令之后,添加一个「Execute shell」(Linux)或者「Execute Windows batch command」(Windows)步骤 - 给你个Linux shell的示例脚本(需要Jenkins服务器上装
jq工具来解析JSON):# 从mvn命令的输出里提取Sonar分析任务ID TASK_ID=$(mvn sonar:sonar | grep -o 'ceTaskId=\w*' | cut -d'=' -f2) # 轮询Sonar API,等分析任务完成 while true; do # 用Sonar令牌访问API,获取任务状态 STATUS=$(curl -s -u ${SONAR_TOKEN}: "http://你的Sonar服务器地址/api/ce/task?id=${TASK_ID}" | jq -r '.task.status') if [ "${STATUS}" == "SUCCESS" ]; then break elif [ "${STATUS}" == "FAILED" ]; then echo "Sonar代码分析任务失败了!" exit 1 fi sleep 5 # 每5秒查一次 done # 查询项目的质量门状态 QUALITY_GATE_STATUS=$(curl -s -u ${SONAR_TOKEN}: "http://你的Sonar服务器地址/api/qualitygates/project_status?projectKey=你的项目Key" | jq -r '.projectStatus.status') if [ "${QUALITY_GATE_STATUS}" == "ERROR" ]; then echo "质量门未达标!" exit 1 # 让Job直接失败 # 如果只想告警,把exit 1改成echo "质量门告警!",然后可以用Jenkins命令标记为不稳定:echo "##junit[buildStatus status='UNSTABLE' text='质量门未达标']" fi - 注意:要在Job的「环境变量」里配置
SONAR_TOKEN(SonarQube生成的权限令牌)和你的项目Key,确保Jenkins服务器能访问到SonarQube服务器 - Windows环境的话,可以用PowerShell脚本实现类似逻辑,用
Invoke-RestMethod来调用API
- 在Job的「Build」区域,在
小提示:优先用方案一,毕竟插件已经做了完善的错误处理和轮询逻辑,比自己写脚本靠谱多啦。记得测试的时候先故意让代码不达标,看看Job会不会按预期变成失败或不稳定状态。
内容的提问来源于stack exchange,提问作者mn3
相关产品推荐
相关产品推荐

