十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Rust 编译器破坏性变更影响评估:Crater 生态回归测试实战指南

Rust 编译器破坏性变更影响评估:Crater 生态回归测试实战指南 Rust 编译器破坏性变更影响评估Crater 生态回归测试实战指南【免费下载链接】rustEmpowering everyone to build reliable and efficient software.项目地址: https://gitcode.com/GitHub_Trending/ru/rust本指南面向 rustc 编译器贡献者系统讲解 Cratercrate regression testing——一个用于在 crates.io 全量 crate以及部分 GitHub 公开仓库上编译并运行测试的生态回归测试工具以及它在 rustc 开发流程中的定位与使用方式。读完本文你将掌握何时需要申请 Crater 运行、如何向 Rust 团队请求三种不同类型的 Crater 任务check / build / build-and-test、结果如何解读以及如何将 Crater 纳入破坏性变更breaking change的标准处理流程中从而科学评估 PR 对 Rust 生态的影响范围。Crater 是什么面向全量 crates.io 的回归测试工具Crater 是 rust-lang 组织维护的一套独立工具其核心职责是编译并运行 crates.io 上每一个 crate以及少量 GitHub 仓库的测试。它与 rustc 本身的测试体系互补——rustc 内部测试compiletest、mir-opt、ui 测试等验证的是编译器自身行为而 Crater 验证的是编译器改动对真实世界代码的破坏程度。在 rustc 开发流程中Crater 主要用于两个典型场景评估破坏范围当实现一个可能破坏现有代码的变更例如收紧类型检查、改变 trait 推导、调整 lint 行为时用 Crater 量化到底有多少 crate 会挂确保无回归通过运行 beta 版编译器与 stable 版编译器的对比测试验证即将发布的版本是否引入了生态回归。从本仓库的开发指南看Crater 是生态测试Ecosystem testing体系中的第一类方法。在 生态测试章节 中Crater 与另外两类手段并列cargotest在 CI 中运行cargo test于 stylo、ripgrep、tokei 等少量示例项目上命令为./x test src/tools/cargotest以及大型开源项目构建任务如 Fuchsia、Rust for Linux 的 CI 集成。区别在于cargotest 样本量小但随 CI 常驻而 Crater 样本量巨大、拥有独立的运行基础设施不随 CI 执行属于按需发起的重量级评估。何时需要运行 Crater并非每个 PR 都需要 Crater。开发指南给出的触发条件很明确PR 对编译器做出大规模改动large changesPR可能导致既有代码编译失败could cause breakage。如果你不确定自己的改动是否满足条件直接询问 PR 的 reviewer 即可。在 PR 生命周期章节 中明确写道当评审者认为改动可能引起破坏时会主动请求一次 Crater 运行——这会用你的改动编译编译器再尝试编译 crates.io 上的所有 crate作为检验改动是否影响大面积生态的 smoke test。在 rustc 的其他开发流程文档中Crater 也被反复提及为必经步骤破坏性变更处理流程基于 RFC 1589 的标准流程第一步就是 Do a crater run to assess the impact of the change即用 Crater 评估影响之后才建立专门的 tracking issue、发出未来兼容future-compatibilitylint 警告实现新功能指南实现新特性时若改动有潜在破坏需先做 Crater 运行评估影响再考虑添加 future-compatibility lint属性attributes变更对现有属性如#[foo]进行重命名等改动时建议单独安排一次 Crater 运行评估 fallout且要注意 Crater并非穷尽式的不覆盖所有现存稳定代码稳定化报告模板如果稳定化本身是已知破坏性变更需在报告中链接 Crater 报告及其分析结论并列出为受影响生态项目提交的所有修复 PR。如何请求 Crater 运行Rust 团队维护了几台专用机器用于对 PR 引入的改动执行 Crater 运行。申请流程很简单在 PR 线程中给 triage 团队triage team留言说明需要 Crater 运行明确告知团队你需要的运行类型见下表triage 团队将你的 PR 排入队列结果就绪后会发布在 PR 上。三种 Crater 运行模式运行模式说明适用场景check-only仅执行cargo check级别的类型检查不编译、不运行测试改动只在编译期生效例如实现新 trait时足够build-only完整编译所有 crate 的二进制产物需要验证链接、代码生成层面的影响build-and-test编译并运行测试默认推荐选项不确定时直接选它三种模式的差异主要体现在耗时上check 运行平均约 3~4 天build 与 build-and-test 平均约 5~6 天。因此如果改动只在编译期产生效果比如实现一个新 trait 导致方法解析变化选择 check-only 即可大幅缩短等待周期反之任何可能影响运行时行为的改动都建议采用 build-and-test。前置条件bors try必须成功请求 Crater 之前有一个硬性前置条件你的 PR 必须能通过bors try构建出可用的编译器产物。如果代码本身无法编译Crater 就无法运行也就是说——编译不过的 PR 不能申请 Crater。这与 CI 章节 中描述的 try build 机制紧密相关。bors try触发的 try build 用于在 CI 上构建某 PR 的编译器产物而不合并它其典型用途之一就是用 Crater 运行 检查 PR 对生态的影响。由于 Crater 需要在 Linux x86_64 上运行优化版编译器try build 默认执行dist-x86_64-linux任务若希望以最快速度拿到可用工具链可走fast try build模式该任务带-quick后缀不执行测试、允许编译警告——它专为 Crater 运行和性能基准而设计。解读 Crater 结果时必须警惕的四个局限Crater 覆盖面极广但绝非万无一失。开发指南明确列出了四类必须时刻谨记的 caveats并非所有代码都在 crates.io 上。GitHub 上还有大量仓库代码而公司内部代码通常不会发布。因此一次成功的 Crater 运行不代表绝对不会破坏发布前仍需保持谨慎。bug-fix 流程文档也强调 Crater 报告只列出在你的改动下停止编译、或开始编译的 crate未覆盖的代码依然存在风险。Crater 只在 Linux x86_64 上构建。这意味着其他架构ARM、RISC-V 等和其他平台完全不在测试范围内其中最关键的是Windows未被覆盖。平台相关的破坏路径处理、链接器行为、MSVC 差异等Crater 检测不到。大量 crate 实际未被测试。原因多种多样crate 本身已无法编译例如依赖过时的 nightly 特性、测试损坏或不稳定flaky、需要网络访问、以及各种其他原因。因此 Crater 的绿灯只能说明被测样本没问题不能推广到全部生态。必须先有可构建的产物。如前所述bors try必须先行成功代码编译失败则无法运行 Crater。Crater 在破坏性变更流程中的完整角色将 Crater 放入 bug-fix-procedure.md 描述的完整链路中可以更清楚地看到它的位置。破坏性变更的标准处理流程为运行 Crater 评估影响本指南主题为该变更建立专门的 tracking issue优先以未来兼容 lint 警告而非硬错误的方式引入变更无法用警告时才直接报错并给出指向 tracking issue 的精确错误信息同时向所有已知受影响 crate 提交修复 PR 或至少通知维护者变更在线上至少停留一个版本周期后再稳定化将警告转为错误。其中有一条实用经验法则与 Crater 结果直接挂钩若 Crater 显示受影响项目总数少于 10 个注意是受影响项目而非根因错误数可以跳过警告阶段直接报错若影响面更大超过 10 个 crate则必须以警告方式推进除非编译器团队特批豁免。当 Crater 报告发布后开发者应当仔细阅读报告定位所有在你的改动下停止编译的 crate分析根因判断是真实破坏还是误报礼貌地通知受影响 crate 的作者最好直接提交修复 PR——这是 bug-fix 流程中明确的期望行为It is polite and considerate to notify the authors of crates affected by the breaking change. It is even better to submit PRs fixing the breakage.如果影响面超出预期可以借助跟踪 issue 收集反馈甚至回滚变更或寻找替代方案这正是先警告后错误策略的容错优势。小结Crater 是 rustc 团队评估改动对生态影响的关键基础设施它以 crates.io 全量 crate 为样本提供 check-only、build-only、build-and-test 三种运行模式耗时 3~6 天不等通过 PR 内留言即可申请但前提是bors try构建必须成功。同时必须清醒认识到它的边界——不覆盖 crates.io 之外与公司私有代码、仅测 Linux x86_64不含 Windows、大量 crate 因各种原因缺席测试。在破坏性变更的完整流程中Crater 是评估影响的第一步其结论直接决定变更走直接报错还是警告过渡路径。对于任何触碰编译器核心行为的 PRCrater 都是不可省略的生态安全网。【免费下载链接】rustEmpowering everyone to build reliable and efficient software.项目地址: https://gitcode.com/GitHub_Trending/ru/rust创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表