Prhub

#43266 [XPU][CI]Fix Docker image pull-to-run race in Intel GPU CI

原始 PR 作者 zxd1997066 合并时间 2026-05-21 18:41 文件变更 1 提交数 2 评论 1 代码增减 +22 / -8

执行摘要

修复 Intel GPU CI 中 Docker 镜像拉取与容器启动的竞态条件

Intel GPU CI 存在 Docker 镜像拉取与容器创建/启动之间的竞态条件。当并发 Pipeline 同时触发时,一个任务的 docker run 可能因镜像尚未完全拉取或元数据尚未更新而失败,导致 CI 不稳定。PR body 未引用具体 Issue,但从 commit 消息和脚本上下文可推断此为修复 Intel GPU CI 基础设施稳定性问题。

该 PR 值得 CI 维护者精读,尤其是以下设计决策值得关注:

  • 使用 flock 解决 CI 竞态条件的模式,可推广到其他硬件 CI 脚本中。
  • docker create + docker start 分离 与直接在 docker run 前检查镜像的两种方式,后者更简洁但 lock 范围更晚,此 PR 采用了前者保证可靠性。
  • 注意 final version 已规避掉 review 中提出的双引号变量展开问题,说明作者在合并前主动完善了实现。
讨论亮点

仅有一条来自 gemini-code-assist[bot] 的 review comment,指出高优先级问题:使用双引号 flock ... bash -c "..." 会导致 $CMDS 等变量在 host shell 中提前展开,若命令中包含特殊字符(如引号、子命令替换)可能引发安全漏洞和语法错误。但该评论发出时作者已完成另一版实现(使用 { flock 9; ...; } 9>/tmp/docker-pull.lock 的 sub-shell + 文件描述符重定向),推测作者在收到评论前已自行修复该问题,最终合并的版本中未出现双引号 bash -c 结构。最终在 jikunshang 的 APPROVED 审核后闭合并合并。

实现拆解

该 PR 只修改了 .buildkite/scripts/hardware_ci/run-intel-test.sh 一个文件,按以下步骤组织变更:

  1. 导出环境变量:将 commandsHF_TOKENZE_AFFINITY_MASKexport 声明,使其对子进程可见,替代原先 -e 逐项传递方式,减少命令行引用复杂度。

  2. 引入文件锁(flock):使用 flock/tmp/docker-pull.lock 加锁,将镜像校验(docker image inspect)和条件拉取(docker pull)放在临界区内,保证并发 Pipeline 中只有一个任务执行镜像拉取,其余任务等待锁释放后直接使用已有镜像。

  3. 拆分 docker run 为 docker create + docker start:先通过 docker create 创建容器但不启动,再在锁外以 docker start -a 附加并启动容器。此分离确保容器创建时镜像已完整就绪,并且 docker create 本身不会因镜像未就绪而失败。

该变更为纯粹的基础设施脚本改动,不涉及源码、测试或配置更新。

文件 模块 状态 重要度
.buildkite/scripts/hardware_ci/run-intel-test.sh 部署脚本 modified 3.76

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

flock 双引号导致变量提前展开的安全风险 正确性

bot reviewer 指出早期实现中使用 `flock ... bash -c "..."` 会导致 $CMDS 等变量在 host shell 中展开,引发安全与正确性问题。

结论:作者在合并前已改为 sub-shell + 文件描述符重定向方式(`{ flock 9; ...; } 9>/tmp/docker-pull.lock`),避免了双引号变量展开问题;该评论为 bot 自动化生成,非人工 reviewer 指出。 · 已解决

风险与影响

变更仅涉及 CI 脚本中 Docker 操作顺序和并发控制,不涉及生产代码、模型逻辑或核心运行时。主要风险来自:

  1. 文件锁 /tmp/docker-pull.lock 泄露:如果容器提前退出且未清理,可能导致后续 Pipeline 永久阻塞。可通过设置超时或使用 flock -w 缓解,但当前未实现。
  2. docker createdocker start 分离后,原有 entrypoint 和参数传递路径发生变化,若 CMDS 变量中含有特殊字符仍可能解析异常,虽新版避免了直接 bash -c 引用,但仍有潜在跨环境兼容问题。
  3. export 方式暴露了 CMDS 给子进程,若调试打印日志可能泄露敏感令牌,不过 HW CI 环境通常为受控场景,风险较低。

影响范围局限于 Intel GPU CI 的测试脚本 .buildkite/scripts/hardware_ci/run-intel-test.sh;不改变用户可见的推理能力或 API 行为;不涉及模型支持、性能调优或容器内运行时逻辑。对 Intel GPU CI 的并发 Pipeline 稳定性有显著改善,预计可减少因镜像竞态导致的随机失败。影响程度中等但范围狭小。

锁文件可能泄露 缺少超时机制 Env 暴露敏感令牌

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论