-
Notifications
You must be signed in to change notification settings - Fork 118
Open
Description
[任务] 在Orion Service 中确定Buck2的构建范围
[任务分值] 60 分
[背景描述]
Mega 当前采用 Monorepo + Buck2 的方式来管理和构建大规模代码仓库。
在 Monorepo 中,不同业务模块、服务、工具、基础库(如 common / base / util / runtime 等)共存在同一个仓库内,并通过 Buck2 target 建立依赖关系。
在现有实现中,当发生代码变更(如 CL / MR / push)时,系统会:
- 根据文件变更列表定位 BUCK 文件;
- 以 BUCK 文件所在目录作为构建根;
- 触发该目录及其下所有 target 的构建。
这种方式在基础库(common / base / util 等)变更时存在明显问题:
- 基础库通常被大量模块依赖;
- 仅根据 BUCK 文件路径,构建范围会扩大到整个子树;
- 实际上很多 target 并不直接或间接依赖该变更;
- 导致:
- 构建任务数激增;
- 构建耗时显著增加;
- 资源浪费;
- 影响 CI / 构建队列吞吐。
本质问题在于当前构建范围推导是“基于目录”的,而不是“基于依赖图(dependency graph)”
[需求描述]
- 输入:精确的代码变更集合
系统已有或需要提供:
- 变更的文件列表(来自 CL / push)
- 每个文件的路径
- 文件类型(源代码 / BUCK / 配置)
- 从文件 → owning target 的映射
需要支持:
- 根据变更文件,找到其所属的 Buck2 target
- 例如:
src/foo/bar.cc → //src/foo:foo_lib
实现方式可选:
- Buck2 提供的 buck2 targets --show-output / buck2 query
- 预生成文件 → target 索引(缓存)
- 构建依赖分析(核心能力)
在基础库变更时,需要:
- 找到 直接受影响的 target
- 通过 Buck2 依赖图,向上查找:
- 所有 直接依赖
- 所有 间接依赖
- 生成最小构建集合(transitive dependents)
changed files
↓
owning targets
↓
reverse dependency graph
↓
affected targets
- 支持不同构建策略(可选)
构建策略需要可配置:
- Direct only:只构建直接 owning target
- Transitive:构建所有依赖该 target 的上游
- Scope limited:只构建同 project / same path 下的依赖
- Fallback:当分析失败时回退到目录级构建(保证正确性)
- 构建结果与 Buck2 调用集成
最终需要输出:
• 一组精确的 Buck2 target 列表:buck2 build //src/foo:foo_lib //src/app:app_bin
• 而不是:buck2 build //src/foo/...
并将该结果传递给现有的构建触发流程(Orion )。
- 性能与缓存要求(可选)
由于 Monorepo 规模大:
- 依赖分析不能每次全量扫描
- 需要缓存:
- target → deps
- file → owning targets
- 支持:
- 构建前增量分析
- Buck graph 变更时自动失效
- 可观测性与调试(可选)
需要:
- 在构建详情中展示:
- 哪些文件触发了构建
- 哪些 target 被选中
- 为什么被选中(依赖链路)
- 方便开发者理解构建范围
[代码标准]
- 所有 PR 提交必须签署
Signed-off-by和 使用GPG签名,即提交代码时(使用git commit命令时)至少使用-s -S两个参数,参考 Contributing Guide; - 所有 PR 提交必须通过
GitHub Actions自动化测试,提交 PR 后请关注GitHub Actions结果; - 代码注释均需要使用英文;
[PR 提交地址] 提交到 mega 仓库的 main 分支 `` 目录;
[开发指导]
- 认领任务参考 r2cn 开源实习计划 - 任务认领与确认;
[导师及邮箱] 请申请此题目的同学使用邮件联系导师,或加入到 R2CN Discord 后在 #p-meta 频道和导师交流。
- Quanyi Ma genedna@gmail.com
- Tianxing Ye yetianxing2014@gmail.com
[备注]
- 认领实习任务的同学,必须完成测试任务和注册流程,请参考: r2cn 开源实习计划 - 测试任务 和 r2cn 开源实习计划 - 学生注册与审核