Jenkins Analysis阶段因Sonar问题无限循环无法正常结束
问题描述
Jenkins流水线执行至Analysis阶段时出现长时间卡死,无法正常推进结束,循环数小时始终无法完成,对应流水线执行日志片段如下:
[Pipeline] sh 14:37:02 + curl -s -k -u ********: https://sonarqube..... [Pipeline] readJSON [Pipeline] echo 14:37:02 Found branch info: [name:feature/X.X/random-branch-name, isMain:false, type:SHORT, mergeBranch:master, status:[qualityGateStatus:OK, bugs:0, vulnerabilities:0, codeSmells:0], analysisDate:2022-07-07T12:10:34+0000] [Pipeline] echo 14:37:02 Analysis for this pipeline run hasn't finished yet: Thu Jul 07 14:10:34 CEST 2022 < Thu Jul 07 14:10:36 CEST 2022 [Pipeline] sh 14:37:02 + sleep 15s [Pipeline] echo 14:37:17 Looking for analysis result in SonarQube Community (https://sonarqube....)...
从日志逻辑可判断:当流水线判定本次运行对应的Sonar分析未完成时,会休眠15秒后重新查询SonarQube Community的分析结果,该循环持续运行数小时始终无法退出,导致阶段阻塞。
根因定位
- 流水线轮询Sonar结果的判断逻辑为:拉取对应分支的最新分析记录,将返回的
analysisDate字段值与本次流水线的触发时间做对比,如果分析时间早于流水线触发时间,就判定本次提交的扫描还未完成,进入下一轮轮询。 - 日志中接口已经返回了分支质量门状态为
OK、各类问题计数均为0,但返回的analysisDate始终固定为2022-07-07T12:10:34+0000没有更新,时间判断条件永远无法满足,最终进入死循环。 - 常见触发场景:
- SonarQube侧对应本次提交的扫描任务实际执行失败,没有生成新的分析记录,轮询接口只能拉到分支上的历史旧数据
- 流水线轮询逻辑的匹配维度有缺陷,仅通过分支名拉取最新分析,没有绑定本次构建对应的commit id、扫描任务id,无法匹配到新生成的分析结果
- SonarQube后台任务队列阻塞,新提交的扫描任务长时间排队未执行,无法生成新的分析记录
- 注意:SonarQube Community(社区版)官方原生不支持分支分析能力,如果是通过第三方插件实现分支功能,插件兼容性问题也可能导致分支分析数据无法正常更新。
修复方案
- 第一步先排查SonarQube侧状态:登录SonarQube管理后台,进入对应项目页面,找到出问题的
feature/X.X/random-branch-name分支,查看最近的分析记录时间、任务状态。如果没有找到对应本次流水线触发时间的新分析记录,就进入后台任务队列页面,排查是否存在任务堆积、任务失败的情况:堆积就清理无效排队任务释放资源,任务失败就根据扫描日志修复配置问题。 - 第二步优化流水线轮询逻辑:不要仅用分支维度拉取分析结果,轮询时要绑定本次构建提交的commit SHA或者扫描步骤返回的专属analysisId做精确匹配,避免拉取到历史旧数据导致判断失效。
- 第三步给轮询增加超时兜底:设置最长轮询时长(比如10分钟),超过时长后直接终止轮询抛出明确报错,避免无意义的死循环长时间占用Jenkins执行资源。
内容的提问来源于stack exchange,提问作者wolfroyce
相关产品推荐
相关产品推荐

