You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 21:57:22