执行摘要
- 一句话:固定 Rust 前端 CI 工具版本号
- 推荐动作:该 PR 是标准 CI 基础设施改进,逻辑清晰,改动合理,可直接合并。建议团队后续建立定期更新工具版本的机制,避免版本固定后长期不更新。
功能与动机
本 PR 旨在固定 cargo CI 中安装的工具版本,以提升可重复性,防止类似 issue #48170 的问题再次发生。版本值提取自最近一次成功的 CI 运行。对于通过 cargo binstall 安装的工具,使用语义版本范围以允许补丁更新。
实现拆解
- 定义版本常量:在脚本顶部新增
PROTOC_VERSION、CARGO_BINSTALL_VERSION、UV_VERSION、PYO3_PYTHON_VERSION 等环境变量,以及 CARGO_SORT_VERSION_REQ、CARGO_DENY_VERSION_REQ、CARGO_NEXTEST_VERSION_REQ 等语义版本范围变量,用于显式控制版本。
- 移除版本检查短路:在
install_protoc、install_cargo_binstall、install_cargo_sort、install_cargo_deny、install_cargo_nextest 每个安装函数中,删除了“如果命令已存在则跳过”的早期返回逻辑,确保每次 CI 运行都按固定版本安装,避免缓存/预装版本干扰。
- 更新安装 URL 和参数:将 protoc 的下载 URL 改为使用已定义的版本变量;将 cargo binstall 的安装脚本改为从固定版本标签下载;为
cargo binstall 命令添加 --force 标志和版本约束(如 cargo-sort@${CARGO_SORT_VERSION_REQ}),强制安装指定版本。
- 保留语义版本范围:对于
cargo-sort、cargo-deny、cargo-nextest,使用 CARGO_*_VERSION_REQ 变量(如 2、0.20、0.9)来指定主版本或次版本范围,允许补丁更新,平衡确定性与安全性。
关键文件:
.buildkite/scripts/run-rust-frontend-cargo-ci.sh(模块 CI 脚本;类别 infra;类型 core-logic): 唯一变更文件,核心 CI 脚本,所有改动集中于此:新增版本变量、移除版本检查短路、更新安装命令。
关键符号:未识别
关键源码片段
.buildkite/scripts/run-rust-frontend-cargo-ci.sh
唯一变更文件,核心 CI 脚本,所有改动集中于此:新增版本变量、移除版本检查短路、更新安装命令。
# 在脚本顶部新增版本常量
PROTOC_VERSION="${PROTOC_VERSION:-31.1}"
CARGO_BINSTALL_VERSION="${CARGO_BINSTALL_VERSION:-1.20.1}"
UV_VERSION="${UV_VERSION:-0.11.28}"
PYO3_PYTHON_VERSION="${PYO3_PYTHON_VERSION:-3.12}"
# 对于 cargo binstall 安装的工具,使用语义版本范围(允许补丁更新)
CARGO_SORT_VERSION_REQ="${CARGO_SORT_VERSION_REQ:-2}"
CARGO_DENY_VERSION_REQ="${CARGO_DENY_VERSION_REQ:-0.20}"
CARGO_NEXTEST_VERSION_REQ="${CARGO_NEXTEST_VERSION_REQ:-0.9}"
install_protoc() {
# 移除了 "if command -v protoc >/dev/null 2>&1; then return; fi" 的检查,确保每次安装指定版本
local url="https://github.com/protocolbuffers/protobuf/releases/download/v${PROTOC_VERSION}/protoc-${PROTOC_VERSION}-linux-${arch}.zip"
# ... 下载并安装 ...
}
install_cargo_binstall() {
# 移除了命令存在检查,从固定版本标签下载安装脚本
curl -L --proto '=https' --tlsv1.2 -sSf \
"https://raw.githubusercontent.com/cargo-bins/cargo-binstall/v${CARGO_BINSTALL_VERSION}/install-from-binstall-release.sh" \
| env BINSTALL_VERSION="$CARGO_BINSTALL_VERSION" bash
}
install_cargo_sort() {
# 移除了命令存在检查,使用 --force 和版本约束强制安装
cargo binstall --no-confirm --force "cargo-sort@${CARGO_SORT_VERSION_REQ}"
}
install_cargo_deny() {
cargo binstall --no-confirm --force "cargo-deny@${CARGO_DENY_VERSION_REQ}"
}
install_cargo_nextest() {
cargo binstall --no-confirm --force "cargo-nextest@${CARGO_NEXTEST_VERSION_REQ}"
}
评论区精华
该 PR 无 review 评论,仅包含 Claude bot 的自动提示和 njhill 的批准。无实质性讨论。
风险与影响
- 风险:风险较低。该 PR 仅修改 CI 环境下的工具安装流程,不涉及任何业务代码。主要风险为:
1) 若工具版本固定过低或过时,可能导致某些依赖构建失败,但版本来自最近成功运行,基本可靠;
2) 移除“命令已存在”检查后,每次 CI 运行都会重新安装工具,可能略微增加 CI 时间,但影响极小。
- 影响:影响范围仅限 CI 构建环境中的 Rust 前端相关作业。正向影响:提升构建可重复性,避免因工具版本自动更新引发的突发 CI 失败(如 issue #48170)。负面影响:轻微增加 CI 执行时间(重新安装工具),以及需要手动更新版本固定(当工具发布新版本时)。
- 风险标记:CI 变更, 构建可重复性
关联脉络
参与讨论