Prhub

#51735 [CI] Parallelize release image publishing

原始 PR 作者 khluu 合并时间 2026-08-11 07:38 文件变更 2 提交数 2 评论 0 代码增减 +178 / -141

执行摘要

DockerHub 发布拆成七路并行矩阵,关键路径降至约 40 分钟

PR body 给出明确的数据驱动理由:Release v0.27.0 build 4962 在 DockerHub publish 步骤耗时超过两小时,原因是脚本在单个 agent 上串行 pull、retag、push 所有镜像族。四个主要族的实测耗时分别为 CUDA 13.0 32m34s、CUDA 12.9 40m20s、CUDA 13.0+Ubuntu 24.04 32m39s、CUDA 12.9+Ubuntu 24.04 39m37s;若保留两个 Ubuntu 变体在同一 job,关键路径约为 72 分钟。作者因此按族拆分并行,使发布关键路径等于最慢的单个镜像族而非所有族之和,并受 release 队列容量限制。

值得 CI/发布工程维护者精读,是典型的“串行任务→矩阵并行”改造:TARGET 默认 all 保持向后兼容、target_enabled 统一控制执行域、matrix 与脚本参数一一对应,都是可直接复用的设计。需要注意的短板是没有自动化测试覆盖发布脚本、部分失败语义未处理;也可把它当作“AI 辅助起草 + 人工逐行 review”的协作流程样例来观察。

讨论亮点

正式 review 评论为 0,唯一条目来自 claude[bot] 的自动提示,说明该仓库配置为手动 code review,可回复 @claude review 触发一次性或持续 review,不构成技术评审。PR body 自述由 OpenAI Codex 辅助实现并强调 “This draft requires human review of every changed line before it is marked ready”,因此设计决策(矩阵拆分、保留 all 默认值、删除 ROCm base cache key 打印)没有在讨论区被质疑,技术把关完全由合入审查完成。

实现拆解

  1. 目标化发布脚本:在 .buildkite/scripts/publish-release-images.sh 中引入 TARGET="${1:-all}" 参数,并用 case 白名单校验七种族名与 all,新增 target_enabled 辅助函数。原先按族编写的 pull/tag/push/manifest 逻辑全部包进 if target_enabled <族名> 分支,使每个族可独立执行;同时删除了仅用于日志的 ROCM_BASE_CACHE_KEY 计算与打印。
  2. 矩阵化流水线配置:在 .buildkite/release-pipeline.yaml 中把单个 Publish release images to DockerHub job 改写成 matrix 步骤,label 与 commands 均引用 {{matrix}},并在 matrix 中列出七个目标;保留 block-publish-release-images 审批依赖、docker-login 插件与 small_cpu_queue_release 队列,审批通过后七个 agent 各自发布一个镜像族。
  3. 兼容与验证:脚本默认 all,不传参数时行为与旧版一致,手动调用和旧 job 引用不受影响;作者通过 bk pipeline validate、shellcheck、bash -n 校验,并对七个目标加 legacy all 做了 mock registry 演练,且对比确认生成的 docker 命令列表与 origin/main 一致。
  4. 配套改动:无新增测试或部署配置,纯 CI 变更。PR 由 OpenAI Codex 辅助编写,body 明确要求在标记 ready 前对每一行做人工 review。
文件 模块 状态 重要度
.buildkite/scripts/publish-release-images.sh 发布脚本 modified 5.9
.buildkite/release-pipeline.yaml 发布管线 modified 3.98

关键符号

target_enabled

关键源码片段

.buildkite/scripts/publish-release-images.sh core-logic

核心发布脚本:从串行发布全部镜像族改造为按 TARGET 参数只发布一个族,配合 pipeline matrix 实现七路并行;同时移除仅用于日志的 ROCm base cache key 计算。

# 目标参数:默认 all 保持向后兼容,矩阵模式每次只发布一个镜像族
TARGET="${1:-all}"
case "${TARGET}" in
  cuda-13-0 | cuda-12-9 | cuda-13-0-ubuntu-24-04 | \
  cuda-12-9-ubuntu-24-04 | rocm | xpu | cpu | all) ;;
  *)
    echo "Usage: $0 {cuda-13-0|...|all}"
    exit 2
    ;;
esac# 判断当前族是否需要执行:all 表示全量发布,否则按族名精确匹配
target_enabled() {
  [ "${TARGET}" = "all" ] || [ "${TARGET}" = "$1" ]
}# 每个镜像族用 target_enabled 包裹,矩阵中各 agent 互不干扰
if target_enabled cuda-13-0; then
  docker pull public.ecr.aws/q9t5s3a7/vllm-release-repo:${COMMIT}-x86_64
  docker pull public.ecr.aws/q9t5s3a7/vllm-release-repo:${COMMIT}-aarch64
​
  # 按架构打 latest 与版本号两个 tag 再分别推送
  docker tag public.ecr.aws/q9t5s3a7/vllm-release-repo:${COMMIT}-x86_64 vllm/vllm-openai:latest-x86_64
  docker tag public.ecr.aws/q9t5s3a7/vllm-release-repo:${COMMIT}-x86_64 vllm/vllm-openai:v${RELEASE_VERSION}-x86_64
  docker push vllm/vllm-openai:latest-x86_64
  docker push vllm/vllm-openai:v${RELEASE_VERSION}-x86_64
​
  docker tag public.ecr.aws/q9t5s3a7/vllm-release-repo:${COMMIT}-aarch64 vllm/vllm-openai:latest-aarch64
  docker tag public.ecr.aws/q9t5s3a7/vllm-release-repo:${COMMIT}-aarch64 vllm/vllm-openai:v${RELEASE_VERSION}-aarch64
  docker push vllm/vllm-openai:latest-aarch64
  docker push vllm/vllm-openai:v${RELEASE_VERSION}-aarch64
​
  # 清理旧 manifest 后创建并推送双架构 manifest
  docker manifest rm vllm/vllm-openai:latest || true
  docker manifest rm vllm/vllm-openai:v${RELEASE_VERSION} || true
  docker manifest create vllm/vllm-openai:latest vllm/vllm-openai:latest-x86_64 vllm/vllm-openai:latest-aarch64
  docker manifest create vllm/vllm-openai:v${RELEASE_VERSION} vllm/vllm-openai:v${RELEASE_VERSION}-x86_64 vllm/vllm-openai:v${RELEASE_VERSION}-aarch64
  docker manifest push vllm/vllm-openai:latest
  docker manifest push vllm/vllm-openai:v${RELEASE_VERSION}
fi

评论区精华

claude[bot] 自动 review 提示 other

claude[bot] 留言说明该仓库配置为手动 code review,可回复 @claude review 触发一次性 review,或 @claude review always 订阅后续每次 push 的 review。

结论:非技术性自动提示,未产生实际评审内容;PR 中也没有其他人工 review 评论,技术风险由合入审查承担。 · info-only

风险与影响

  • 部分发布不一致:矩阵并行后若某个族失败,其余六个族仍可能已完成推送并对外可见,形成半发布状态;旧串行脚本会在失败处中断后续步骤,语义上更接近“全有或全无”。
  • 并发推送压力:七个 agent 同时向 DockerHub push,可能触发流量限制或排队抖动,首轮 release 需要观察 429 等错误。
  • ROCM_BASE_CACHE_KEY 移除影响:补丁显示该变量仅被计算并用于 echo,但若脚本其他位置存在隐含引用,ROCm 发布会受影响;建议合入前确认无残留引用。
  • 验证依赖人工:合法性校验全部为本地手动演练(shellcheck、bash -n、mock registry),没有自动化回归测试保护目标参数语义,未来改动容易悄悄破坏矩阵行为。
  • all 模式风险:默认 all 仍会串行执行全部族,若 release 错误触发 all,失败模式与旧版相同,但该路径不是 CI 默认入口。
  • 发布操作员:发布关键路径从 >2 小时降至最慢镜像族约 40 分钟(受 release 队列最多 7 个 agent 的容量限制);每个族在 Buildkite 上独立显示,可单独查看失败并重试,排障粒度变细。
  • 系统与服务:零影响,本次改动不涉及模型、推理、API 或镜像内容本身,只是发布过程的重编排。
  • 团队与流程:release 流程阻塞时间显著缩短;对 CI 维护者增加了矩阵相关概念,后续新增镜像族需同步修改脚本 case 与 pipeline matrix 两处。
部分发布不一致风险 缺少自动化测试覆盖 手动验证依赖 并发 DockerHub 推送

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论