主要观点:采用单体仓库直接对应着组织在 CI 基础设施上的巨大投资,因为没有开箱即用的开源解决方案适用于单体仓库。传统上每个仓库有一个管道,对于单体仓库很不灵活。作者开发了一个在 Jenkins 中的 CI 框架,可为单体仓库中的每个包(包含BUILD
文件的目录)创建管道,能检测 PR/提交中的更改并触发相关包的管道,还讨论了性能方面,如将 40GB 单体仓库的首次运行有用代码时间降至<2 分钟等。
关键信息:
- 单体仓库与传统多仓库在 CI 方面的差异及挑战。
- Jenkins 中开发的单体仓库 CI 框架及其功能。
- Bazel 在工程工作流中的使用及相关问题(如下载整个仓库、IDE 集成等)。
- 单体仓库带来的真正持续集成优势及当前 CI 负担加重的问题。
- 优化运行阶段和设置阶段以提高性能的方法(如利用 Bazel 的缓存、优化克隆和分析等)。
- 对于不同缓存(Repository Cache、Action Cache)的配置和使用。
- 单体仓库中每个包应有独立管道的理念及实现方法(如通过 Jenkins 实现根据更改触发相应管道)。
重要细节:
- 传统每个仓库一个管道的方式在单体仓库中极不灵活,作者开发的框架可按需触发管道。
- Bazel 工作流中存在诸多问题,如下载整个仓库、IDE 集成困难等。
- 单体仓库能实现真正的持续集成,但会使 CI 负担加重,如 Jenkins 初始设置未准备好应对。
- 利用 Bazel 的缓存(Repository Cache、Action Cache)可优化运行阶段,减少不必要的测试运行。
- 优化设置阶段可通过减少 git 克隆和 bazel 启动时间来提高性能,如使用
ws
函数指定克隆位置、利用EXECUTOR_NUMBER
避免并行作业冲突等。 - 对于不同类型的更改(PR、长运行分支等),获取更改集的方法不同。
- 通过 Bazel 查询找到受更改影响的包,并触发相应的下游管道,采用特定的 Jenkins 结构和命名约定来实现。
- 还介绍了一些简单的 git 加速技巧,如使用参考存储库、设置 LFS 存储位置、部分和浅层克隆等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。