fix(ci): unify ax-errno resolution before release - #1930
Conversation
There was a problem hiding this comment.
本 PR 为 release-plz 发布预检的依赖解析修复:固定 stable toolchain、更新锁文件,并尝试统一 ax-errno 解析。它不新增用户可见功能、公共 API、syscall 或 app;因此 feature-development、syscall 与 app 运行验证不适用。
发现 1 个阻塞问题:新增的 [patch.crates-io] 不符合仓库强制依赖策略,且会使工作区与发布后消费者的解析条件不同,详见行内评论。
验证:组织 CI(当前 head)中的路径路由、同步检查和格式检查均成功;大量 skipped 是 host/container 矩阵分支。git diff --check、cargo fmt --all -- --check、cargo +stable metadata --locked --format-version=1 --no-deps 本地通过。未执行重复的全工作区测试,因为当前组织 CI 已覆盖相关检查;未发现历史 review/comment,相关开放 PR 搜索未见独立的重叠实现。
最终 todo 审计:改动文件、发布语义、锁文件和右侧锚点已核验;唯一未解决项为下述阻塞问题。建议移除该 patch 后,使用正常 registry 解析下可发布的依赖升级或明确的边界适配重新验证发布预检。
Powered by gpt-5.6-terra
| kmod-tools = "0.3" | ||
| kprobe = "0.6" | ||
|
|
||
| [patch.crates-io] |
There was a problem hiding this comment.
阻塞(依赖解析策略):这里新增了工作区级 [patch.crates-io],会覆盖整个依赖图中 ax-errno 的 crates.io 解析。项目的依赖策略明确禁止任何 crates.io patch(包括本地 path 覆盖);该覆盖只在工作区内生效,发布后的消费者不会继承它,因而本地/发布依赖图可能不一致。请移除该 patch,保持正常 registry 解析,并在边界处做显式适配或采用上游可发布的依赖升级方案。
问题
release-plz 的工作区发布预检在打包
starry-kernel时失败。kbpf-basic 0.6.0通过传递依赖声明ax-errno ^0.6.0,但现有Cargo.lock仍将这条依赖解析到 crates.io 的ax-errno 0.6.2;与此同时,工作区直接依赖使用 path 来源的ax-errno 0.6.3。Cargo 在发布打包时会把 path 依赖改写为 registry 依赖,因此 registry/path 双来源会在同一发布依赖图中发生冲突。这个冲突出现在全工作区上传前预检阶段;若缺少该预检,则可能在部分 crate 已上传后才暴露问题,形成半发布状态。
修改
Cargo.toml使用 Cargo 官方的[patch.crates-io],将 crates.io 上的ax-errno统一替换为components/axerrno。Cargo.lock,移除 registry 来源的ax-errno 0.6.2,使包括kbpf-basic在内的依赖边全部解析到 path 来源的ax-errno 0.6.3。RUSTUP_TOOLCHAIN=stable,使 release PR 与 release 发布任务使用相同的 stable Cargo 行为。dependencies_update = true、release-plz 的拓扑顺序发布行为,以及上传前的cargo publish --workspace --dry-run --no-verify全工作区预检。方案逻辑
kbpf-basic并未锁死ax-errno 0.6.2,其^0.6.0版本要求能够接受0.6.3;真正锁定旧版本的是工作区锁文件。根级[patch.crates-io]会作用于整个依赖图,因此既覆盖工作区直接依赖,也覆盖 registry crate 的传递依赖,从源头消除双来源解析,而不需要修改上游 crate 或放宽发布检查。全工作区预检继续承担发布事务边界:只有所有待发布 crate 都能按拓扑完成打包后,release-plz 才进入实际上传流程。
本地验证
cargo +stable metadata --locked --format-version=1:通过;依赖图仅包含 path 来源的ax-errno 0.6.3。cargo +stable publish --manifest-path os/StarryOS/kernel/Cargo.toml --dry-run --no-verify:成功进入starry-kernel打包;随后按预期因同批待发布的ax-alloc 0.8.15尚未存在于 crates.io 而停止,说明单包模式无法表达本次多 crate 拓扑发布。cargo +stable publish --workspace --dry-run --no-verify:通过;ax-errno 0.6.3、ax-alloc 0.8.15、starry-kernel 0.7.7和starryos 0.5.28均完成打包,命令退出码为 0。cargo xtask clippy --package starry-kernel:通过,25/25 checks passed。cargo fmt --all -- --check:通过。git diff --check:通过。本地全工作区预检在与 GitHub Actions 相同的 clean worktree 中执行,避免本机 ignored 生成文件影响 Cargo 的 dirty-tree 检查。