扩缩产品组装和配置

项目负责人:aaronwood@google.com 领域:构建、开发者

问题陈述

产品 由 git 的 代码库只有在完成所有软件的编译步骤后,才能“在树内”执行该操作。

产品配置在多个维度(_eng_eng_arrested_user_userdebug、LSDi 等)方面不断激增,因此我们能够为开发者、测试人员和客户所需的每项配置命名。

产品所有者和开发者仍无法轻松表达他们希望在任何给定时间构建/运行的组合。

其中大多数定义都是由于以下维度的组合扩展:

  • 即将发货的基础商品
  • 组件版本:稳定版, 最新, 开发者
  • 商品类型:engeng_arresteduserdebuguser

通过使用指向其他软件包中组件的显式软件包网址,组件拓扑本身会在设备上的 fuchsia-pkg:// 命名空间内晶化,因为每个软件包的完整网址会直接列在其父级的 Cml 中:

  • root.cml
  • core.cml

如需更改用于实现某些协议的软件包的组件,必须更改某些其他软件包的内容,以引用该不同的软件包网址。

Fuchsia 开发者和发布团队必须在树中管理合作伙伴的所有产品,而树外产品所有者不可能按照自己的时间表发布或更新产品。这给 Fuchsia 组织带来了巨大的负载,增加了产品所有者的阻力。

解决方案声明

为了解决这个问题,我们提议创建一组可以在树外运行的工具,它们将汇编和配置的概念结合到同一进程的几个部分:

  • 汇编过程就是指定:

    • 应该使用哪些软件
    • 它们为何彼此关联(单个组件的拓扑)
    • 如何配置它们
    • 何时可以重新配置(以及由谁重新配置)
  • 配置的目的在于提供:

    • 每个组件正常运行所需的数据
    • 产品的 CFv1 sysmgr 配置
    • 产品的整体 CFv2 拓扑
    • 内核启动参数

这些是同一流程的两部分:如何为给定产品组装和配置 Fuchsia。

为了实现对 Fuchsia 的受控使用和配置,我们提议引入“子组件”的概念。每个子组件在拓扑片段中定义了一组软件和文件,其中包含配置点和值,并且明确文档说明了在组装过程中可以修改哪些配置。

完成后:

  • Fuchsia 平台定义了一些子组件,供产品在执行这种树外组装时选择想要组装的平台行为
    • 例如,包含 omaha-client (userdebug/user build) 的软件交付堆栈子组件与使用 system-update-checker (eng build) 的软件交付堆栈子组件是有区别的。
  • 客户产品可以完全在树外组装,而无需直接使用 fuchsia.git
  • 您可以利用同一组已编译的软件组件组装多个产品变体。

依赖项

将客户产品迁移到使用子组件。这需要咨询 yaar@ 和其他利益相关方,确保我们正确捕获他们的信息。

将 Fuchsia 平台迁移到使用子组件。这需要咨询各个子系统团队,确保我们正确捕获了正确的变体。

若要创建树外映像,某些工具(fvm、blobfs、minfs、zbi、avbtool)需要移植到可在树外使用的格式(用于链接到 Rust 的静态库,或完全移植到 Rust)。

风险和缓解措施

主要风险如下:

  • 新工具不会产生与现有工具相同的输出

    • 缓解措施:在 CI/CQ 中并行运行二者,验证新工具是否产生了相同的输出,然后改为使用新工具。
  • In-Tree 和 Out-Out 工具中的功能可能有所不同

    • 缓解措施:将外部工具用作树内工具,因此我们没有两套工具需要维护。
  • 子组件架构设计可以完善。

    • 缓解措施:所有架构都将进行版本控制,明确表示希望在此过程中对其进行修改,同时专注于实用解决方案,而不是完美的系统建模。
  • 迁移工作量较大(产品和平台)

    • 缓解:可以分阶段完成,从成套组件/标签开始,一直到完全定义的子组件。
    • 缓解:实现计划的核心是采用可持续测量的方法,