更新 src/compile/sharebuild.md

This commit is contained in:
2025-12-04 06:05:48 +00:00
parent c3fc09ece7
commit dcd05056db

View File

@@ -1,79 +1,64 @@
# 分布式编译系统ShareBuild # ShareBuild分布式共享编译工作站
![alt text](/public/compile/promotional-graphic-cloudbuild.jpg)
## 为什么需要分布式编译?
- 大型项目过长的编译耗时将会给开发、测试和调试都带来延迟,所以缩短大型项目的编译时间的分布式编译系统有重要意义
- 使用分布式编译系统编译项目可以利用计算机集群提高编译效率,缩短项目编译时间
- 在实际开发时同一个团队大量的编译任务时相同的。CloudBuild提供的编译缓存可以避免重复上传和重复编译从而进一步加快编译效率
## 总体架构 ## ShareBuild的适用场景
### 系统总体架构
![alt text](/public/compile/architecture.png)
- Ninja客户端该机器上需要保存有完整的待编译项目源代码。
- Action Cache服务端缓存主要保存编译任务的执行结果。
- CAS Cache服务端缓存主要保存客户端上传的依赖文件编译结果文件。
- Scheduler任务调度器将编译任务id分发到各个编译节点。
- Redis主要存储具体的编译任务供编译节点领取执行也可存储Action Cache和 CAS Cache中的内容加速编译。
- MySQL主要存储编译过程中的任务统计信息。
- Executor各个编译节点
### 部署示意图 在同一局域网内工作的小型团队ShareBuild以P2P共享架构将空闲算力贡献给团队其他成员从而为每个团队成员提供编译加速效果。
![alt text](/public/compile/system-diagram.png)
CloudBuild主程序分为三个部分Client、Server、Executor。
- Client运行在客户端和用户对接用于生成待执行的远程编译任务 同时也作为本地编译节点执行本地任务。
- Server运行在主服务器主要用于连接各个编译节点以及 将客户端上传的编译任务调度到与其连接的各个编译节点上。
- Executor运行在编译节点负责接收并执行编译任务是编译任务真正执行的地方。
### 系统分层结构 ## ShareBuild QuickStart
![alt text](/public/compile/layered-system-architecture.png)
## 运行原理与流程 * 同一个局域网内的A、B、C等所有节点上安装ninja2:
### 分布式编译原理 ```
![alt text](/public/compile/compiler-principles.png) wget -c https://raw.githubusercontent.com/ninja-cloudbuild/ninja2/refs/heads/main/install.sh && chmod +x install.sh && sudo ./install.sh
```
### CloudBuild客户端 * 启用ShareBuild的前置要求二选一即可
CloudBuild客户端基于Ninja改造有下面这些优势
- 兼容使用Ninja编译的项目
- 使用远程执行的方式提高编译时并发度
- 使用编译缓存减少需要编译的任务数量
### CloudBuild服务端 1. 所有节点上均安装配置好了项目的编译环境即所有节点上均能采用ninja成功单机编译项目。
- 使用远程执行的方法提高编译时并发度,实现了任务分发至远程节点同步执行 2. 选择任一节点上作为项目开发环境,项目中使用.devcontainer/devcontainer.json 配置了image镜像示例如下依次镜像创建的开发容器中能采用ninja成功单机编译项目。
- 使用分布式任务调度提高任务调度效率和计算节点资源利用率,避免集中式调度的任务阻塞问题
- 使用编译缓存结合内容寻址存储技术减少网络传输量、避免重复上传与重复编译
### CloudBuild优势 ```
- 低成本组成executor的机器不需要使用专门的高性能计算型机器可使用多个平价的空闲机器 {
- 高效CloudBuild实现分布式编译的功能相比单机大大提升并发度 "name": "DevContainer",
- 兼容NinjaCloudBuild客户端基于Ninja改造对于使用Ninja构建和可以转换为Ninja构建的项目不用额外修改构建清单 "image": "devstar.cn/devstar/DevContainer:latest" # 仅作示例,务必使用您已安装配置好项目编译环境的容器镜像!
}
```
### CloudBuild执行流程 * 选择任一节点上作为项目开发环境开启ShareBuild模式然后进行分布式编译。
- 客户端: 生成远程任务->生成任务依赖->发送任务与依赖
- 服务端:检查任务缓存->检查依赖完整性->调度任务
- 编译结点:还原文件目录->还原文件目录->返回编译结果
## AOSP和LLVM上的应用 项目根目录下创建ninja2.conf 文件如下即可开启ShareBuild模式
### LLVM上的应用效果 ```
![alt text](/public/compile/table1.png) sharebuid:true
### AOSP上的应用效果 ```
![alt text](/public/compile/table2.png) 这时使用ninja编译将自动进入ShareBuild模式分布式编译项目。
### CloudBuild硬件资源利用率
4核CPU利用率:
![alt text](/public/compile/CPU-utilization-4.png)
8核CPU利用率:
![alt text](/public/compile/CPU-utilization-8.png)
16核CPU利用率:
![alt text](/public/compile/CPU-utilization-16.png)
## CloudBuild使用方法 > 如果直接使用ninja命令编译项目也可以加上-s参数表示启用ShareBuild模式示例如下
### CloudBuild安装 ```
![alt text](/public/compile/cloudbuild-installation.png) ninja -s -r `realpath ../` #启动分布式编译,注意-r 指定项目根目录
CloudBuild项目地址https://gitee.com/cloudbuild888/cloudbuild.git ninja -t clean #清除编译产物
### CloudBuild分布式编译 ````
![alt text](/public/compile/cloudbuild-distributed-compilation.png)
LLVM项目地址https://gitee.com/mirrors/LLVM.git
* 对一些特殊项目的补充说明
除以上常规的ShareBuild配置外对于一些特殊项目需要做一些额外的配置补充说明如下
## 使用ShareBuild编译Android开源项目AOSP
除按照以上方法准备好编译环境和开启ShareBuild模式外以AOSP14项目为例还需要替换ninja和准备.sharebuild.yml来过滤掉一些无法远程编译的命令具体操作如下
```
cp /usr/bin/android_ninja prebuilts/build-tools/linux-x86/bin/ninja
cp /etc/ninja2/aosp14/.sharebuild.yml ./
```
然后就可以单机编译一样使用make命令来分布式编译Android开源项目AOSP
## 使用ShareBuild编译鸿蒙开源项目OpenHarmony
todo
## 版权声明
Copyright @ Mengning Software
梦宁软件(江苏)有限公司 版权所有