Skip to content

[r2cn] 在Orion Service 中确定Buck2的构建Targets #1728

@benjamin-747

Description

@benjamin-747

[任务] 在Orion Service 中确定Buck2的构建范围

[任务分值] 60 分

[背景描述]

Mega 当前采用 Monorepo + Buck2 的方式来管理和构建大规模代码仓库。
在 Monorepo 中,不同业务模块、服务、工具、基础库(如 common / base / util / runtime 等)共存在同一个仓库内,并通过 Buck2 target 建立依赖关系。

在现有实现中,当发生代码变更(如 CL / MR / push)时,系统会:

  1. 根据文件变更列表定位 BUCK 文件;
  2. 以 BUCK 文件所在目录作为构建根;
  3. 触发该目录及其下所有 target 的构建。

这种方式在基础库(common / base / util 等)变更时存在明显问题:

  • 基础库通常被大量模块依赖;
  • 仅根据 BUCK 文件路径,构建范围会扩大到整个子树;
  • 实际上很多 target 并不直接或间接依赖该变更;
  • 导致:
    • 构建任务数激增;
    • 构建耗时显著增加;
    • 资源浪费;
    • 影响 CI / 构建队列吞吐。

本质问题在于当前构建范围推导是“基于目录”的,而不是“基于依赖图(dependency graph)”

[需求描述]

  1. 输入:精确的代码变更集合

系统已有或需要提供:

  • 变更的文件列表(来自 CL / push)
  • 每个文件的路径
  • 文件类型(源代码 / BUCK / 配置)
  1. 从文件 → owning target 的映射

需要支持:

  • 根据变更文件,找到其所属的 Buck2 target
  • 例如:

src/foo/bar.cc → //src/foo:foo_lib

实现方式可选:

  • Buck2 提供的 buck2 targets --show-output / buck2 query
  • 预生成文件 → target 索引(缓存)
  1. 构建依赖分析(核心能力)

在基础库变更时,需要:

  • 找到 直接受影响的 target
  • 通过 Buck2 依赖图,向上查找:
    • 所有 直接依赖
    • 所有 间接依赖
  • 生成最小构建集合(transitive dependents)
changed files
  ↓
owning targets
  ↓
reverse dependency graph
  ↓
affected targets
  1. 支持不同构建策略(可选)

构建策略需要可配置:

  • Direct only:只构建直接 owning target
  • Transitive:构建所有依赖该 target 的上游
  • Scope limited:只构建同 project / same path 下的依赖
  • Fallback:当分析失败时回退到目录级构建(保证正确性)
  1. 构建结果与 Buck2 调用集成

最终需要输出:
• 一组精确的 Buck2 target 列表:buck2 build //src/foo:foo_lib //src/app:app_bin
• 而不是:buck2 build //src/foo/...
并将该结果传递给现有的构建触发流程(Orion )。

  1. 性能与缓存要求(可选)

由于 Monorepo 规模大:

  • 依赖分析不能每次全量扫描
  • 需要缓存:
    • target → deps
    • file → owning targets
  • 支持:
    • 构建前增量分析
    • Buck graph 变更时自动失效
  1. 可观测性与调试(可选)

需要:

  • 在构建详情中展示:
    • 哪些文件触发了构建
    • 哪些 target 被选中
    • 为什么被选中(依赖链路)
  • 方便开发者理解构建范围

[代码标准]

  1. 所有 PR 提交必须签署 Signed-off-by 和 使用 GPG 签名,即提交代码时(使用 git commit 命令时)至少使用 -s -S 两个参数,参考 Contributing Guide
  2. 所有 PR 提交必须通过 GitHub Actions 自动化测试,提交 PR 后请关注 GitHub Actions 结果;
  3. 代码注释均需要使用英文;

[PR 提交地址] 提交到 mega 仓库的 main 分支 `` 目录;

[开发指导]

  1. 认领任务参考 r2cn 开源实习计划 - 任务认领与确认;

[导师及邮箱] 请申请此题目的同学使用邮件联系导师,或加入到 R2CN Discord 后在 #p-meta 频道和导师交流。

  1. Quanyi Ma genedna@gmail.com
  2. Tianxing Ye yetianxing2014@gmail.com

[备注]

  1. 认领实习任务的同学,必须完成测试任务和注册流程,请参考: r2cn 开源实习计划 - 测试任务r2cn 开源实习计划 - 学生注册与审核

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions