执行摘要
- 一句话:修复 setuptools-scm 版本解析中 rc 标签排序错误,确保 CI 构建正确版本。
- 推荐动作:建议精读
python/tools/get_version_tag.py 以理解版本解析策略,特别是 PEP 440 排序的实现和精确匹配与回退逻辑的权衡。关注设计决策如何解决 strverscmp 问题,并注意 review 中指出的效率问题。
功能与动机
PR body 指出:git tag --sort=-version:refname 使用 strverscmp 排序,将 v0.5.10rc0 排在 v0.5.10 之上,导致 PyPI 发布工作流构建了 sglang-0.5.10rc0 而不是 sglang-0.5.10(参考失败运行链接)。需要修复此问题以确保发布版本正确。
实现拆解
- 创建版本解析脚本:新增
python/tools/get_version_tag.py,定义核心函数如 parse_version_tuple(实现 PEP 440 排序)、get_exact_version_tag(优先处理精确匹配标签)和 get_latest_version_tag_describe(回退到最高版本标签描述)。这样改的原因是为了避免 strverscmp 排序错误,并支持 CI 和开发构建。
- 更新配置契约:修改多个
pyproject.toml 文件(如 python/pyproject.toml、python/pyproject_cpu.toml、3rdparty/amd/wheel/sglang/pyproject.toml 等),将 git_describe_command 从原有的 bash 命令替换为调用新脚本(["python3", "python/tools/get_version_tag.py", "--tag-only"])。这确保 setuptools-scm 使用正确的版本解析逻辑。
- 调整 CI 工作流:更新
.github/workflows/release-pypi-pr.yml 和 .github/workflows/release-pypi-nightly.yml,将版本标签获取命令从 git tag --list --sort=-version:refname 改为调用 Python 脚本,以保持版本一致性并避免排序问题。
- 测试配套:PR body 提到包含 18 个单元测试,但无测试文件变更;测试计划通过
python3 python/tools/test_get_version_tag.py 验证。
关键文件:
python/tools/get_version_tag.py(模块 工具脚本;类别 source;类型 dependency-wiring;符号 parse_version_tuple, run_git, get_exact_version_tag, get_latest_version_tag_describe): 新增版本解析脚本,核心实现,包含 PEP 440 排序和 git 命令调用逻辑。
.github/workflows/release-pypi-pr.yml(模块 CI工作流;类别 infra;类型 infrastructure): 修改 CI 工作流,使用新脚本获取版本标签,确保发布版本正确。
python/pyproject.toml(模块 项目配置;类别 config;类型 configuration): 更新 setuptools-scm 配置,指向新版本解析脚本,影响所有构建。
3rdparty/amd/wheel/sglang/pyproject.toml(模块 第三方配置;类别 config;类型 configuration): 更新 AMD 特定配置,确保版本解析一致性。
.github/workflows/release-pypi-nightly.yml(模块 CI工作流;类别 infra;类型 infrastructure): 修改夜间发布工作流,使用新脚本获取版本标签。
关键符号:parse_version_tuple, run_git, get_exact_version_tag, get_latest_version_tag_describe, get_version_describe, get_latest_version_tag, main
评论区精华
gemini-code-assist[bot] 在 review 中指出:get_latest_version_tag_describe 函数效率低下,因为它循环调用 git describe 并仍依赖有问题的 git tag --sort=-version:refname 排序,可能导致开发构建版本不正确(如相对于 rc 标签而非稳定标签)。但 PR 被 Fridge003 批准合并,可能问题被接受或留待后续优化。
- 版本解析函数的效率与正确性 (correctness): PR 被合并,但问题被指出,可能后续优化。
风险与影响
- 风险:技术风险包括:新脚本
get_version_tag.py 可能引入解析错误,影响所有构建流程;版本排序逻辑复杂,边缘情况(如非标准标签)可能处理不当;依赖 git 命令执行,在特定环境(如浅克隆)可能失败。此外,脚本效率问题可能影响构建性能。
- 影响:对用户影响:确保 PyPI 发布的包版本正确,避免用户安装错误版本。对系统影响:修复 CI 发布工作流的可靠性,防止静默失败。对团队影响:版本解析逻辑集中化,便于维护,但需关注脚本正确性和性能。影响范围限于构建和发布流程,不影响核心业务逻辑。
- 风险标记:版本排序逻辑风险, 脚本执行依赖, 效率问题
关联脉络
- PR #23497 ci: build sgl-kernel wheels for both cu129 and cu130: 同样涉及 CI 构建修复和依赖调整,与本 PR 在基础设施改进上相关。
- PR #23510 [CI] /rerun-stage: fix workflow-run URL lookup for sgl-kernel PRs: 涉及 CI 命令修复,与本 PR 在 CI 工作流调整上相关。
参与讨论