Prhub

#44981 [Rust Frontend] [CI] Unify Rust artifact builds with setuptools-rust

原始 PR 作者 BugenZhao 合并时间 2026-06-10 17:48 文件变更 11 提交数 3 评论 8 代码增减 +117 / -90

执行摘要

统一 Rust 构件构建入口为 setuptools-rust

原先存在两套 Rust 构建路径:CI 上手动调用 cargo,本地通过 setup.py 触发 setuptools-rust。一旦需要添加多个 Rust 扩展模块,平台相关的后缀、ABI 标签和安装路径必须由 setuptools-rust 统一处理,而不是在 shell 或 Docker 中重复。此外,BuildKit 缓存 /workspace/rust/target 偶尔损坏导致构建失败,必须移除。PR body 原文:"it becomes fragile once we introduce more Rust extension modules" 和 "Also removed BuildKit cache on /workspace/rust/target as it seems to use corrupted cache sometimes"。

建议关注其“单一入口”设计模式——未来扩展 Rust 模块只需在 tools/build_rust.py 中添加 RustExtension 条目,其余环节自动适配。值得精读 tools/build_rust.pysetup.py 的改动以理解共享构建的原理。

讨论亮点

自动化安全工具 depthfirst-app[bot] 提出了两个关于依赖版本的安全评论:

  • requirements/build/rust.txtsetuptools>=77.0.3 受 CVE-2025-47273 影响(路径遍历),建议提升至 >=78.1.1
  • wheel 未固定版本,建议 >=0.46.2 避免 CVE-2026-24049。
    这些评论未在 PR 中被回复或采纳。
    此外,评审者 Harry-Chen 批准了 PR 并触发了 release pipeline 验证,但因主分支其他 bug 失败。njhill 口头认可设计。

实现拆解

  1. 新增共享构建入口 tools/build_rust.py:定义 rust_extensions() 函数(返回 RustExtension 列表,接收 optional 参数)和 build_binary() 函数(内嵌 setup 调用,指定 build_rust 命令)。该文件成为 Rust 构件的唯一声明点。

  2. 修改 setup.py:移除 import setuptools_rust.BindingRustExtension 的直接使用;通过 load_module_from_path 动态加载 tools/build_rust.py 模块并调用其 rust_extensions(),将结果传给 setup()rust_extensions 参数。这样保持 setup.py 结构的同时复用共享定义。

  3. 简化 build_rust.sh:脚本不再指定 VLLM_RS_TARGET_PATH,转而依赖 setuptools-rust 的 --inplace 输出路径。

  4. 修改各 DockerfileDockerfileDockerfile.cpuDockerfile.nightly_torchDockerfile.xpuDockerfile.rocm):将 rust-build 阶段的基础镜像从 BUILD_BASE_IMAGE 改为 base,确保 Python 环境可用;安装 protoc、复制 tools/build_rust.pybuild_rust.sh;移除手动安装 rustup 的步骤(改用 requirements/build/rust.txt 中的 Python 包依赖);移除 BuildKit target 缓存挂载;构建后从预设包路径复制构件(vllm/vllm-rs 而非自定义路径)。

  5. 新增 requirements/build/rust.txt:锁定 setuptoolssetuptools-rustwheel 版本,确保构建环境一致。

  6. 更新 MANIFEST.in:包含 tools/build_rust.py,保证 sdist 中携带该文件。

  7. 修正 rust/README.md:反映新的构建路径。

文件 模块 状态 重要度
tools/build_rust.py 构建脚本 added 8.09
setup.py 安装配置 modified 5.68
docker/Dockerfile Docker 镜像 modified 4.23
build_rust.sh 构建脚本 modified 3.37
requirements/build/rust.txt 依赖配置 added 2.14

关键符号

rust_extensions build_binary main

关键源码片段

setup.py dependency-wiring

通过导入使用 tools/build_rust.py 替代直接定义 RustExtension,体现共享入口的集成。

# 在函数 load_module_from_path 之后,新增加载 tools/build_rust.py
envs = load_module_from_path("envs", os.path.join(ROOT_DIR, "vllm", "envs.py"))
# 新增:加载共享构建模块
rust_build = load_module_from_path(
    "rust_build", os.path.join(ROOT_DIR, "tools", "build_rust.py")
)VLLM_TARGET_DEVICE = envs.VLLM_TARGET_DEVICE
# ... 其他代码不变 ...# 设置 rust_extensions 时调用共享函数
rust_extensions = rust_build.rust_extensions(
    optional=not should_require_rust_frontend()
)setup(
    # ... 其他参数 ...
    rust_extensions=rust_extensions,
    # ...
)

评论区精华

setuptools 版本存在 CVE 安全

自动化工具评论要求将 setuptools>=77.0.3 提升至 >=78.1.1 以修复 CVE-2025-47273(路径遍历导致任意文件写入)。

结论:未在 PR 中处理,未回复或采纳,PR 已合并。 · unresolved

wheel 版本未固定 安全

建议 wheel 版本 >=0.46.2 避免 CVE-2026-24049(wheel unpack 路径遍历导致文件权限修改)。

结论:未处理。 · unresolved

风险与影响

  1. 构建缓存移除风险:移除了 /workspace/rust/target 的缓存挂载,尽管解决了偶发损坏问题,但每次有 Rust 变更时 Docker 构建时间可能增加 <5 分钟。
  2. 基础镜像变更风险:rust-build 阶段改用 base 镜像,可能引入 Python 版本兼容问题(已在后续修复 commit 中处理)。
  3. 新依赖风险:新增 requirements/build/rust.txt 引入 setuptools-rust 版本约束,未来升级可能需同步。
  4. 安全风险:未采纳的安全建议可能遗留潜在 CVE,但影响范围有限(wheel 仅用于构建时,且 setuptools 版本仍在 77-81 之间)。

对用户:无直接影响,Rust 前端二进制正常打包。
对开发者:统一了本地和 CI 的 Rust 构建逻辑,降低了认知负担。
对 CI/CD:Docker 构建步骤整合,减少维护点;但移除 target 缓存可能导致增量构建时间增加。
对团队:为后续添加新 Rust 扩展模块(如推理或 tokenizer 扩展)提供了清晰的注册入口,预计 PR #44624 会直接受益。

BuildKit 缓存移除 CVE 未修复 基础镜像变更

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论