Files
honey-biscuit-workshop/2026-04-25.md
T

193 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 2026-04-25 工作意图说明
## 工作范围
本次工作仅对 `workshop-baker` 进行操作,遵循以下原则:
- 仅在**近期未更改或已稳定**的功能上操作
- 小功能函数不受此限制
- 不操作包含 `unimplemented!()``// TODO:` 或裸 `todo!()` 的函数/类型
- 谨慎对待近期变更的代码
## 已完成工作
### 1. Docstring (`///`)
为以下稳定模块的所有 `pub` 函数/结构体/枚举添加了 docstring
| 模块 | 文件数 | 说明 |
|------|--------|------|
| `types/` | 9 | architecture, time, compression, cache, command, builderconfig, repology, buildstatus, memsize(已有) |
| `bake/` | 4 | decorator, schedule, parser, builder |
| `engine/` | 5 | pm, pm/pacman, upm, cgroups, repology/local |
| `finalize/` | 8 | fetch/checksum, fetch/types, fetch/extract, fetch/git, mail/config, mail/template, metadata, stage/hook, event |
| `socket.rs` | 1 | get_socket_addr, establish_connection |
**跳过模块**
- `notify.rs` / `notify/types.rs` — 近期重构中,含 `todo!()`
- `error.rs` / `lib.rs` / `main.rs` — 近期 CLI 重构
- `finalize/config.rs` — 标记 "TODO: under heavy refactor"
- `prebake/env/custom.rs` / `engine/pm/apt.rs` / `finalize/plugin/rhai.rs` — 含 `todo!()`
- `daemon.rs` / `monitor/jobobject.rs` — 含 `todo!()` / `unimplemented!()`
### 2. 单元测试
新增 `#[cfg(test)] mod tests` 到以下文件:
| 文件 | 测试数 | 覆盖内容 |
|------|--------|----------|
| `types/architecture.rs` | 15 | normalized, as_str, FromStr 全变体+大小写+错误 |
| `types/time.rs` | 11 | parse_duration, deserialize_duration, option_duration, 溢出/负值边界 |
| `types/compression.rs` | 6 | Default, serde round-trip (使用 match 断言规避 PartialEq) |
| `types/cache.rs` | 14 | default 值, serde round-trip |
| `types/command.rs` | 3 | default 值, full/minimal serde |
| `types/builderconfig.rs` | 5 | BuilderType serde, DockerConfig serde, untagged 行为 |
| `types/repology.rs` | 10 | 全变体 deserialize, 空串→Default, unknown→error, serialize round-trip |
| `engine/pm.rs` | 3 | all_managers 非空, select 已知/未知 |
| `engine/upm.rs` | 3 | all_managers 非空, select 已知/未知 |
| `engine/repology/local.rs` | 4 | resolve 已知包/未知包/多包/不同 PM |
| `socket.rs` | 5 | get_socket_addr 全 5 种模式 |
| `finalize/plugin/fetch/checksum.rs` | 9 | detect 长度分支, verify SHA256/SHA512 |
| `finalize/plugin/fetch/types.rs` | 5 | get_checksum 组合, serde round-trip |
| `finalize/plugin/fetch/extract.rs` | 8 | CompressionType::from_path 全扩展名 |
| `finalize/plugin/fetch/git.rs` | 5 | parse_git_url 3 种模式+复杂 URL |
| `finalize/plugin/internal/mail/config.rs` | 19 | EmailAddress, Recipients, MailConfig::validate, serde |
| `finalize/plugin/internal/mail/template.rs` | 3 | render_template simple/build-status/invalid |
| `finalize/plugin/metadata.rs` | 7 | default, clone, serde |
**已有测试未动**`types/memsize.rs`, `bake/decorator.rs`, `bake/schedule.rs`, `types/buildstatus.rs`, `engine/pm/pacman.rs`
**测试修复记录**(非实现代码问题):
- `types/builderconfig.rs` — untagged enum 测试中 DockerConfig 因全字段 optional+default 总是优先匹配,修正测试断言以反映实际 serde 行为
- `types/command.rs` — serde roundtrip 中 `timeout` 字段 serialize 为秒、deserialize 时 `deserialize_duration_ms` 乘 1000,修正期望值
- `types/repology.rs``serde_yaml::from_str("")` 返回 EOF 错误,改用 `"default"` 测试
- `types/time.rs``deserialize_option_duration_ms` 的 visitor 不支持 `visit_some`,改用标准 `Option<u64>`/`Option<String>` 测试
### 3. 系统测试 (tests/)
新增/完善 3 个 Rust 集成测试文件:
| 文件 | 测试数 | 覆盖内容 |
|------|--------|----------|
| `tests/types_config_integration.rs` | 8 | Architecture FromStr, BuilderConfig untagged, CacheDirectory round-trip, RepologyEndpoint, CompressionMethod, CustomCommand YAML |
| `tests/bake_pipeline_integration.rs` | 5 | parse_script 全 pipeline, @after, 混合 decorator, remaining_code, multiline function |
| `tests/prebake_config_integration.rs` | 6 | PrebakeConfig minimal, builder type, envvars, bootstrap/workspace, validate pass/fail |
**设计决策**
- `bake_pipeline_integration.rs` 中未测试 `sort_function`,因为 `schedule` 模块是 private (`mod schedule;`),无法从 crate 外部访问
- `types_config_integration.rs``CompressionMethod` 使用 `matches!()` 替代 `assert_eq!`,因该 enum 未实现 `PartialEq`pre-existing
### 4. 文档 (docs/)
**Vol2 管理员手册** (`docs/src/zh-CN/vol2_admin/`)
- `environment_config.md` — 环境变量(HBW_*)、Socket 配置、工作空间、资源限制、构建状态文件
- `deployment.md` — 安装、CLI vs Daemon 模式、预烘焙环境(Docker/Firecracker/Baremetal)、Systemd 示例、权限模型
- `troubleshooting.md` — 日志调试、退出码对照表、常见问题(cgroup/_socket/decorator/hook/包管理器)
**Vol3 开发者手册** (`docs/src/zh-CN/vol3_dev/`)
- `index.md` — 项目简介、9 crates 结构、阅读指南
- `architecture.md` — 整体架构、数据流(Prebake→Bake→Finalize)、核心模块、类型系统、插件架构
- `extension.md` — 添加包管理器、自定义插件(Shell/manifest)、自定义 Decorator、模板变量、邮件模板
- `contributing.md` — 开发环境(Rust 1.85+)、代码规范、错误处理(thiserror+anyhow)、测试、提交规范、PR 流程
`docs/src/SUMMARY.md` 已更新导航。
## 已知问题(未修复实现代码)
以下问题属于 pre-existing,已按约束要求记录但不修复实现:
| 位置 | 问题 | 影响 |
|------|------|------|
| `src/finalize/plugin/fetch/git.rs:169,176` | `test_parse_git_url_complex_url` / `test_parse_git_url_single_with_at_in_path` 失败 | `parse_git_url``@` 在 path 中的处理与测试预期不符 |
| `src/types/compression.rs:8` | `CompressionMethod` 缺少 `PartialEq` | 集成测试需用 `matches!()` 替代 `assert_eq!()` |
| `src/finalize/plugin/fetch/extract.rs` | `CompressionType` 缺少 `PartialEq` | 已有测试中使用 match 断言 |
| `src/finalize/plugin/fetch/checksum.rs` | `ChecksumType` 缺少 `PartialEq` | 同上 |
| `src/finalize/plugin/fetch/git.rs` | `GitVersion` 缺少 `Debug` | 测试中使用 match 断言 |
## 追加调整(用户反馈后)
### 5. 移除 archived/ 相关描述
从文档中移除了所有 `archived/` 目录相关 crate 的活跃描述:
- `docs/src/zh-CN/vol3_dev/index.md` — 将 9 crates 列表改为仅列出 4 个活跃 crate,其余标注为已归档
- `docs/src/zh-CN/vol3_dev/architecture.md` — 将整体架构描述改为仅列出活跃 crate,标注其余已归档
### 6. 移除 cgroups 相关描述
从以下文档中移除了 cgroups 相关内容:
- `docs/src/zh-CN/vol2_admin/environment_config.md` — 移除 cgroup v2 资源限制章节
- `docs/src/zh-CN/vol2_admin/troubleshooting.md` — 移除 cgroup 常见问题条目
- `docs/src/zh-CN/vol3_dev/architecture.md` — 从数据流与核心模块描述中移除 cgroup 引用
### 8. 修正 HBW_USERNAME 描述
`docs/src/zh-CN/vol2_admin/environment_config.md``environment_variables.md`
-`HBW_USERNAME` 从"构建用户名 / 默认为 vulcan / 用于权限降级"修正为"提交者用户名(来自 base / server"
- 明确说明与构建系统内的 Unix/Windows 用户名无关,仅用于日志、通知与审计追踪
### 9. 文档拆分
将包含多个不相关章节的文档拆分为独立文件:
**vol2_admin/**
- `environment_config.md`(环境变量 + Socket + 工作空间 + 构建状态)拆分为:
- `environment_variables.md` — 仅环境变量
- `socket_config.md` — 仅 Socket 配置
- `workspace.md` — 仅工作空间
- (构建状态内容已独立为 `status_file_format.md`,不再重复)
**vol3_dev/**
- `extension.md`(包管理器 + 插件 + Decorator + 模板变量 + 邮件模板)拆分为:
- `add_package_manager.md`
- `custom_plugin.md`
- `custom_decorator.md`
- `template_variables.md`
- `mail_template.md`
- `contributing.md`(开发环境 + 代码规范 + 错误处理 + 测试 + 提交规范 + PR 流程)拆分为:
- `development_environment.md`
- `code_style.md`
- `commit_convention.md`
- `pr_process.md`
- (错误处理与测试内容已独立为 `error_handling_patterns.md``testing_strategy.md`,不再重复)
`docs/src/SUMMARY.md` 已同步更新导航。
### 7. 细粒度文档(参考 pipeline_implicit_parameter.md 风格)
新增 10 篇短文档(12–60 行,聚焦单一功能点,表格为主):
**Vol2 管理员手册**
- `decorator_cheatsheet.md` — 12 个 `@decorator` 语法、作用、示例、语法规则、常见组合
- `prebake_config_reference.md``prebake.yml` 顶层字段、environment/resources/network/bootstrap/dependencies/envvars/cache 完整参考与示例
- `finalize_plugin_reference.md` — 插件类型对比、mail/webhook 内置插件字段、模板变量、最小配置示例
- `exit_code_guide.md` — 9 个退出码对照表、排查命令
- `status_file_format.md``.hbwstatus` JSON Lines 格式、字段说明、读取示例
**Vol3 开发者手册**
- `error_handling_patterns.md` — thiserror/anyhow 选取原则、示例、退出码映射
- `type_system_guide.md` — types/ 设计原则、核心类型速查、serde 定制示例、使用约束
- `testing_strategy.md` — 测试层级对比、单元/异步/集成测试规范、运行命令
- `plugin_system_guide.md` — Plugin trait、内部/外部插件对比、mail/webhook 配置、模板上下文
- `engine_module_guide.md` — engine/ 模块划分、PackageManager trait、cgroup 限制、执行流程
`docs/src/SUMMARY.md` 已同步更新导航。
## 验证结果
- `cargo build -j 6` — ✅ 通过(30 warnings,均为 pre-existing
- `cargo test --lib` — 317 passed, 2 failed(pre-existing git), 3 ignored
- `cargo test --test types_config_integration` — 8 passed
- `cargo test --test bake_pipeline_integration` — 5 passed
- `cargo test --test prebake_config_integration` — 6 passed
- `mdbook build docs/` — ✅ 通过
## 约束遵守情况
- ✅ 未修改任何实现代码(函数体、结构体)
- ✅ 未添加行内/单行注释(所有新增注释均为 `///` docstring 或已移除)
- ✅ 未写 README.md
- ✅ 未运行 cargo fix / cargo clippy --fix
- ✅ 未修改 .toml / .yaml 配置文件
- ✅ 跳过含 `todo!()` / `unimplemented!()` / `// TODO:` 的模块
- ✅ 仅新增测试、docstring、独立文档
- ✅ 编译并行任务数 `-j 6`