执行摘要
- 一句话:修复AMD夜间Docker版本标签排序问题
- 推荐动作:此PR是基础设施维护类变更,逻辑相对简单,但review中提出的路径鲁棒性问题值得关注。建议在后续的PR中跟进修复路径问题,使用
$BASH_SOURCE构建相对路径。对于想了解SGLang CI流水线的读者,此PR展示了如何统一版本标签选择逻辑。
功能与动机
AMD夜间Docker构建需要选择最新的发布版本标签,但原来的排序方式将post和稳定版本排在rc之后,导致错误的版本被选中。PR通过引入共享的PEP 440版本比较工具来解决此问题。
实现拆解
1. 修改GitHub Actions工作流文件
- 文件:
.github/workflows/release-docker-amd-nightly.yml 和 .github/workflows/release-docker-amd-rocm720-nightly.yml
- 变更: 将原来通过
git tag -l 'v[0-9]*' --sort=-v:refname获取最新版本标签的方式,替换为调用Python脚本python tools/get_version_tag.py --tag-only,该脚本实现了PEP 440兼容的版本比较逻辑。
- 原因:
--sort=-v:refname按ASCII顺序排序,导致v0.5.7post1排在v0.5.7rc2之后,而PEP 440规定post版本应高于rc版本。
- 影响: 确保稳定版和post发行版标签优先于rc候选版。
2. 在Nightly工作流中添加Python环境配置
- 文件: 同上两个工作流文件
- 变更: 在调用Python脚本之前添加了
actions/setup-python@v5步骤,设置Python版本为3.10。
- 原因: 原来的工作流没有Python环境,无法执行Python脚本。添加此步骤确保脚本可以正常运行。
3. 更新AMD CI容器启动脚本
- 文件:
scripts/ci/amd/amd_ci_start_container.sh 和 scripts/ci/amd/amd_ci_start_container_disagg.sh
- 变更: 将原来类似的
git tag命令替换为python3 python/tools/get_version_tag.py --tag-only || true。
- 原因: 保持一致性,使得容器启动时选择的版本标签与Docker构建使用相同的逻辑。使用
|| true避免Python不可用时脚本失败。
4. 测试验证
- 执行了
python3 test/registered/unit/tools/test_get_version_tag.py验证共享工具的正确性。
- 对shell脚本进行了语法检查(
bash -n)。
关键文件:
.github/workflows/release-docker-amd-nightly.yml(模块 GitHub工作流;类别 infra;类型 infrastructure): AMD夜间Docker构建的主工作流,修改了版本标签获取方式并添加了Python环境设置。
.github/workflows/release-docker-amd-rocm720-nightly.yml(模块 GitHub工作流;类别 infra;类型 infrastructure): 另一个AMD夜间Docker工作流,做了与上一个工作流相同的修改。
scripts/ci/amd/amd_ci_start_container.sh(模块 CI脚本;类别 infra;类型 infrastructure): AMD CI容器启动脚本之一,使用共享工具获取版本标签。但存在路径依赖问题。
scripts/ci/amd/amd_ci_start_container_disagg.sh(模块 CI脚本;类别 infra;类型 infrastructure): 另一个AMD CI容器启动脚本,与上一个脚本做了相同的修改。
关键符号:get_version_tag.py (未直接修改,通过--tag-only参数使用)
关键源码片段
scripts/ci/amd/amd_ci_start_container.sh
AMD CI容器启动脚本之一,使用共享工具获取版本标签。但存在路径依赖问题。
# scripts/ci/amd/amd_ci_start_container.sh(片段)
SGLANG_VERSION="v0.5.5"
# 从 origin 获取最新标签以确保最新
if git fetch --tags origin; then
# 使用共享工具,使稳定版 /post 版本排在 rc 版本之上
VERSION_FROM_TAG=$(python3 python/tools/get_version_tag.py --tag-only || true)
if [ -n "$VERSION_FROM_TAG" ]; then
SGLANG_VERSION="$VERSION_FROM_TAG"
echo "Using SGLang version from git tags: $SGLANG_VERSION"
fi
fi
# 注意:此路径依赖仓库根目录执行,否则会失败
评论区精华
Review中gemini-code-assist[bot]提出了一个关于路径鲁棒性的问题:
当前Python脚本的路径是相对于工作目录的,如果脚本从其他目录(如scripts/ci/amd/)执行,将无法找到脚本。之前的git tag命令可以在仓库的任何子目录下工作。建议使用相对于脚本位置的路径。
该评论使用了$(dirname "${BASH_SOURCE[0]}")/../../../python/tools/get_version_tag.py作为替代方案。
结论: 该建议未在最终提交中被采纳。PR的合并者bingxche在完成审核后直接将PR合并,未回应此建议。目前scripts/ci/amd/目录下的脚本仍然依赖从仓库根目录执行。
- Python脚本路径鲁棒性 (correctness): 建议未被采纳。当前实现仍然依赖从仓库根目录执行。
风险与影响
关联脉络
- PR #23607 [AMD] upd local registry address: 同为AMD CI基础设施的PR,修改了同一批文件(amd_ci_start_container.sh和amd_ci_start_container_disagg.sh),属于同一功能线。
参与讨论