feat:完善ai devops相关文档 #4

Merged
mengning merged 6 commits from feature_sgx into main 2025-12-16 07:01:06 +00:00
16 changed files with 183 additions and 25 deletions
Showing only changes of commit e1322c97cf - Show all commits

View File

@@ -0,0 +1,52 @@
apiVersion: application.devstar.cn/v1
kind: Application
metadata:
name: mengningsoftware
namespace: web-servers
labels:
app.kubernetes.io/component: web-server
app.kubernetes.io/managed-by: devstar
app.kubernetes.io/name: mengningsoftware
spec:
environment:
NGINX_VERSION: "1.24.0"
expose: true
networkPolicy:
gateway:
enabled: true
hosts:
- "mengning.com.cn"
ports:
- name: http
number: 80
protocol: HTTP
- name: https
number: 443
protocol: HTTPS
tls:
- hosts:
- "mengning.com.cn"
minProtocolVersion: "TLSv1_2"
mode: SIMPLE
secretName: mengningsoftware-tls
secretNamespace: istio-system
replicas: 2
resources:
cpu: "500m"
memory: "512Mi"
service:
enabled: true
type: ClusterIP
ports:
- name: http
port: 80
protocol: TCP
targetPort: http
template:
type: stateless
image: ${DOCKER_REGISTRY_ADDRESS}/${DOCKER_REPOSITORY_ARTIFACT}:${DOCKER_IMAGE_TAG}
ports:
- name: http
port: 80
protocol: TCP

View File

@@ -37,12 +37,18 @@ jobs:
- name: 登录 Docker Registry 并推送镜像
run: |
echo "${{ secrets.DOCKER_REGISTRY_PASSWORD }}" | docker login -u ${{ secrets.DOCKER_REGISTRY_USERNAME }} ${{ vars.DOCKER_REGISTRY_ADDRESS }} --password-stdin
docker tag devstar-docs:${{ gitea.sha }} ${{ vars.DOCKER_REGISTRY_ADDRESS }}/devstar/devstar-studio-docs:${{ gitea.sha }}
docker tag devstar-docs:${{ gitea.sha }} ${{ vars.DOCKER_REGISTRY_ADDRESS }}/devstar/devstar-studio-docs:latest
docker push ${{ vars.DOCKER_REGISTRY_ADDRESS }}/devstar/devstar-studio-docs:${{ gitea.sha }}
docker push ${{ vars.DOCKER_REGISTRY_ADDRESS }}/devstar/devstar-studio-docs:latest
docker tag devstar-docs:${{ gitea.sha }} ${{ vars.DOCKER_REGISTRY_ADDRESS }}/${{ vars.DOCKER_REPOSITORY_ARTIFACT}}:${{ gitea.sha }}
docker tag devstar-docs:${{ gitea.sha }} ${{ vars.DOCKER_REGISTRY_ADDRESS }}/${{ vars.DOCKER_REPOSITORY_ARTIFACT}}:latest
docker push ${{ vars.DOCKER_REGISTRY_ADDRESS }}/${{ vars.DOCKER_REPOSITORY_ARTIFACT}}:${{ gitea.sha }}
docker push ${{ vars.DOCKER_REGISTRY_ADDRESS }}/${{ vars.DOCKER_REPOSITORY_ARTIFACT}}:latest
- name: 📝 Update mengning.com.cn
- name: 📝 Update mengning.com.cn(通过删除/创建 Application CRD
env:
DOCKER_REGISTRY_ADDRESS: ${{ vars.DOCKER_REGISTRY_ADDRESS }}
DOCKER_REPOSITORY_ARTIFACT: ${{ vars.DOCKER_REPOSITORY_ARTIFACT }}
DOCKER_IMAGE_TAG: ${{ gitea.sha }}
TLS_CERTIFICATE: ${{ secrets.TLS_CERTIFICATE }}
TLS_PRIVATE_KEY: ${{ secrets.TLS_PRIVATE_KEY }}
run: |
curl -LO https://mirrors.ustc.edu.cn/kubernetes/core%3A/stable%3A/v1.28/deb/amd64/kubectl_1.28.0-1.1_amd64.deb
sudo dpkg -i kubectl_1.28.0-1.1_amd64.deb
@@ -50,4 +56,24 @@ jobs:
kubectl config set-credentials token-user --token=${{ secrets.K8S_TOKEN }}
kubectl config set-context remote-context --cluster=remote-cluster --user=token-user
kubectl config use-context remote-context
kubectl set image deployment/devstar-docs-app devstar-docs=${{ vars.DOCKER_REGISTRY_ADDRESS }}/devstar/devstar-studio-docs:latest -n app
# 创建或更新 TLS Secret
# Secret 名称: mengningsoftware-tls
echo "$TLS_CERTIFICATE" > /tmp/tls.crt
echo "$TLS_PRIVATE_KEY" > /tmp/tls.key
kubectl create secret tls mengningsoftware-tls \
--cert=/tmp/tls.crt \
--key=/tmp/tls.key \
-n istio-system \
--dry-run=client -o yaml | kubectl apply -f -
rm -f /tmp/tls.crt /tmp/tls.key
# 替换 Application YAML 中的镜像地址变量并应用
sed "s|\${DOCKER_REGISTRY_ADDRESS}|${DOCKER_REGISTRY_ADDRESS}|g; s|\${DOCKER_REPOSITORY_ARTIFACT}|${DOCKER_REPOSITORY_ARTIFACT}|g; s|\${DOCKER_IMAGE_TAG}|${DOCKER_IMAGE_TAG}|g" \
.gitea/workflows/application.yaml > /tmp/application-crd.yaml
# 删除旧的 Application CRD如果存在忽略错误
kubectl delete application mengningsoftware -n web-servers --ignore-not-found=true || true
# 创建新的 Application CRD
kubectl apply -f /tmp/application-crd.yaml

View File

@@ -1,66 +1,123 @@
# 以AOSP14项目为例ShareBuild分布式编译详细配置方法
## ShareBuild的适用场景
## 编译环境准备
在同一局域网内工作的小型团队,ShareBuild以P2P共享架构将空闲算力贡献给团队其他成员从而为每个团队成员提供编译加速效果。
## ShareBuild QuickStart
* 同一个局域网内的A、B、C等所有节点上安装ninja2:
### 安装 Sharebuild
* 参与编译的同一个局域网内的A、B、C等所有节点上安装ninja2和sharebuild:
```
wget -c https://raw.githubusercontent.com/ninja-cloudbuild/ninja2/refs/heads/main/install.sh && chmod +x install.sh && sudo ./install.sh
```
* 启用ShareBuild的前置要求
* 确保所有节点上均安装配置好了项目的编译环境即所有节点上均能采用ninja成功单机编译项目。
1. 所有节点上均安装配置好了项目编译环境即所有节点上均能采用ninja成功单机编译项目。
<!--
### 安装AOSP项目编译环境
2. 选择任一节点上作为项目开发环境,项目中使用.devcontainer/devcontainer.json 配置了image镜像示例如下依次镜像创建的开发容器中能采用ninja成功单机编译项目。
* 参与编译的同一个局域网内的A、B、C等所有节点上安装编译环境依赖:
```bash
# 安装核心开发工具和库
sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
# 安装Android 14所需的Java环境
sudo apt-get install openjdk-17-jdk
# 确保Python 3环境正确安装
sudo apt-get install python3 python3-pip
```
### 下载 AOSP 源码并执行单机编译
* 选择任一节点作为客户端节点下载AOSP14源码:
```bash
mkdir ~/bin && curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo && chmod a+x ~/bin/repo
export PATH=~/bin:$PATH
repo init --depth=1 --partial-clone -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-14.0.0_r2
repo sync -j16
cd android-14.0.0_r2
source build/envsetup.sh # 初始化环境
lunch aosp_arm-eng # 选择目标配置
make # 执行单机编译,编译成功后可以看到:
```
{
"name": "DevContainer",
"image": "devstar.cn/devstar/DevContainer:latest" # 仅作示例,务必使用您已安装配置好项目编译环境的容器镜像!
}
```
> 注意以上两种方式二选一即可第2种方式省掉了在其他节点上安装配置项目编译环境但是首次ShareBuild模式分布式编译时其他节点会自动下载项目编译环境的容器镜像。
-->
[19:20:05.430], pending/wanted: 4, ready: 1, running: 0
* 选择任一节点上作为项目开发环境开启ShareBuild模式然后进行分布式编译。
#### build completed successfully (02:26:51 (hh:mm:ss)) ####
real 146m51.385s
user 1327m35.812s
sys 78m2.153s
root@lab1:/home/lab1/android-14.0.0_r2#
```
### 配置AOSP项目开启ShareBuild模式
* 将.sharebuild.yml 复制到 AOSP 根目录
```
cd android-14.0.0_r2
cp /etc/ninja2/aosp14/.sharebuild.yml ./
```
* 进入AOSP14项目根目录替换 AOSP 内部 ninja 为 android_ninja
```
cp /usr/bin/android_ninja prebuilts/build-tools/linux-x86/bin/ninja
```
* 开启ShareBuild模式然后进行分布式编译。
项目根目录下创建ninja2.conf 文件如下即可开启ShareBuild模式
```
sharebuid:true
```
这时使用ninja编译将自动进入ShareBuild模式分布式编译项目。
> 如果直接使用ninja命令编译项目也可以加上-s参数表示启用ShareBuild模式示例如下
* 在项目根目录下执行分布式编译
```bash
su # 切换到 root 关闭沙箱
source build/envsetup.sh # 初始化环境
lunch aosp_arm-eng # 选择目标配置
make # 执行分布式编译,编译成功后可以看到:
```
ninja -s -r `realpath ../` #启动分布式编译,注意-r 指定项目根目录
ninja -t clean #清除编译产物
````
* 对一些特殊项目的补充说明
除以上常规的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 ./
[ShareBuild] Command will be executed REMOTELY
[ShareBuild] ----------------------------------------
[100% 130093/130093] Target vbmeta image: out/target/product/generic/vbmeta.img
stdout: , stderr:
[16:34:34.063], pending/wanted: 5, ready: 2, running: 0
#### build completed successfully (01:42:17 (hh:mm:ss)) ####
real 102m16.362s
user 1074m56.673s
sys 64m22.863s
root@lab1:/home/lab1/android-14.0.0_r2#
```
* 服务端节点sharebuild部分日志
```
{"severity":"INFO","timestamp":"2025-11-24T16:34:38.988708686+08:00","caller":"service/sharebuild_proxy.go:448","message":"Successfully cl
eared environment on executor","component":"proxy","executor":"id:\"12D3KoowBsw2Lrs7FwKkmgrmRt3MYQgNzLa82vjK8tve8gQ95KTk\"ip:\"192.168.1.
12\" port:39077 "}
{"severity":"INFO","timestamp":"2025-11-24T16:34:38.99059505+08:00","caller":"runner/project_runner.go:463","message":"ProjectRunner free.
.. ","component":"runner", "ReceivedtaskCount":0,"PreemptedTaskCount":33291}
[worker-17]Stopping worker
[worker-24]Stopping worker
```
然后就可以单机编译一样使用make命令来分布式编译Android开源项目AOSP
<!--
## 使用ShareBuild编译鸿蒙开源项目OpenHarmony
todo
-->
```
make clean # 清除编译目标文件
rm -r out # 清除编译产物
```
## 版权声明
Copyright @ Mengning Software

View File

@@ -3,10 +3,49 @@
大型项目过长的编译耗时给开发、调试、测试和CI/CD都带来延迟缩短大型项目的编译时间是分布式编译系统的主要目标。
- 使用分布式编译系统编译项目可以利用计算机集群提高编译效率,缩短项目编译时间。
- 在实际开发时,同一个团队有大量编译任务是相同的,分布式编译缓存可以避免重复编译,从而节约算力消耗并进一步缩短项目编译时间。
- 在实际开发时,同一个团队有大量编译任务是相同的,分布式编译缓存可以避免重复编译,从而节约算力消耗并进一步缩短项目编译时间。
## 分布式编译技术相关工作综述
当前国内外已有多种分布式编译系统和技术如Distcc[8]、 CCache[9]、Bazel[10]、CodeArts Build[11]以及YADCC[12]等。
Distcc是一款经典的分布式编译工具采用客户端/服务器的工作模式用户使用客户端程序启动编译任务客户端会分析项目代码并在本地完成预处理工作然后选择一台远程计算机将文件发送至服务器服务器进程处理收到的编译任务并将结果返回至客户端。Distcc 的缺点在于其负载均衡算法过于简单,其无法感知各个远程计算机的负载情况,任务分发的依据主要与远程主机在本地环境变量中的次序相关,远程主机名越靠前,得到的编译任务越多,但是当存在某个远程主机的性能过差的情况,整体编译效率将会显著下降。
CCacheCompiler Cache是一款编译缓存工具支持GCC、Clang、MSVCMicrosoft Visual C++等编译器。其原理是将源代码文件的编译结果保存在文件缓存中在后续编译过程中再次使用到对应文件且该文件无变动时可直接从缓存中获取编译结果。CCache的效果类似于Make的缓存功能不同的是Make是根据源文件的时间戳来实现缓存而CCache是按文件内容实现缓存通过计算文件内容的哈希值来标识该缓存文件。有了编译缓存CCache的支持软件项目能够在无入侵不影响现有业务代码对开发人员透明的前提下提高编译效率。CCache的缺点是只能实现本地机器的缓存共享无法对多个远程计算机提供编译缓存服务。
Bazel是Google内部编译工具Blaze的开源实现同时支持多种编程语言。其采用的客户端/服务器模式可以将任务方便地扩展到多台服务器上进行分布式编译。Bazel的编译指令采用了类似Python的Starlark语言[13]作为领域特定语言DSL[14]domain special language而且支持细粒度的编译产物管理使得项目互相引用变得十分简单。虽然Bazel 拥有执行速度快、跨平台、可扩展等优点但Bazel 运行的前提条件是需要开发人员手动编写依赖描述文件即BUILD文件。这样也就意味着在代码规模稍大的项目中引入Bazel需要消耗时间精力编写BUILD文件对于非Bazel项目极其不友好。
华为云CodeArts Build已经可以支持华为6万研发人员进行软件开发工作和软件高效集成每日编译任务量达到77万次并提供24.8万台服务器进行集中的弹性调度。但CodeArts Build是专为华为云平台设计的因此它的使用会对华为云服务的依赖性较高同时由于其非开源用户无法直接了解该系统的具体实现细节和内部工作原理对后续的优化和维护工作带来不便。
腾讯YADCCYet Another Distributed C/C++ Compiler是腾讯云推出的一款基于分布式架构的C/C++ 编译器。它采用了分布式编译技术和增量编译技术可以快速地编译大型C/C++项目并支持多种编译选项和优化级别。除了分布式编译外YADCC还提供分布式编译缓存、调度预取优化、并发控制等服务。但由于YADCC的调度器是全局共享的所有请求均由调度节点统一分配因此集群在高负载时会阻塞新请求导致用户无法正常使用服务。而且YADCC主要用于C/C++项目,因为使用范围有限。
结合国内外现状可以发现大多数分布式编译系统都是针对C/C++相关项目对于像Android开源项目、开源鸿蒙等复杂的多语言大型项目的支持能力不足。
## CloudBuild/ShareBuild分布式编译系统
CloudBuild/ShareBuild分布式编译系统实现了基于Ninja的高效分布式编译实验表明采用本分布式编译系统后AOSP项目的编译时间降低了57.4%LLVM项目降低了72.4%OpenCV项目降低了71.6%,因此本系统可以大幅缩短编译时间,加快项目迭代速度。
![alt text](/public/compile/promotional-graphic-cloudbuild.jpg)
## 参考链接
- [1] Google. Android开源项目[EB/OL]. https://source.android.google.cn,2021.
- [2] Evan Martin. The ninja build system[EB/OL]. 2022. https://ninja-build.org/manual.html.
- [3] 王淼. 面向多核处理器的并行编译及优化关键技术研究[D]. 长沙: 国防科学技术大学, 2010.
- [4] 崔洋洋. 分布式计算综合实验平台的设计与实现[D]. 西安电子科技大学, 2021.
- [5] 童亚拉. 分布式编译的方法和系统研究[J]. 计算机技术与发展, 2010, 20(5): 79-8.
- [6] 张朝滨. 基于Ninja的分布式编译系统[D]. 中山大学, 2015.
- [7] Nacke, Kai. Learn llvm 12: A beginners guide to learning llvm compiler tools and core libraries with c++[M]. Packt Publishing Ltd, 2021: 30 - 34.
- [8] Matev, Rosen. Fast distributed compilation and testing of large c++ projects[C]//EPJ Web of Conferences. USA: EDP Sciences, 2020: 3-5.
- [9] Joel Rosdahl. Ccache—a fast c/c++ compiler cache[EB/OL]. 2023. h-ttps://ccache.dev.
- [10] Google. Bazel官方文档[EB/OL]. 2022. https://bazel.build/start/baz-elintro.
- [11] HuaWei. 编译构建 CodeArts Build[EB/OL]. https://www.huaweicloud.com/product/cloudbuild.html,2023.
- [12] Tencent. Yadcc 分布式C++编译器[EB/OL]. 2022. https://github.com/Tencent/yadcc.
- [13] Google. Starlark language[EB/OL]. 2022. https://bazel.build/rules/language.
- [14] 廖万斌, 曹云峰, 王新尧. 面向复杂系统需求分析的 DSL 构建[J]. 系统工程与电子技术, 2022, 44(11): 3443-3454.
- [15] Jing, Shimin, Zheng, Xin, Chen, Zhengwen. Review and investigation of merkle trees technical principles and related application fields[C/OL]//2021 International Conference on Artificial Intelligen-ce, Big Data and Algorithms (CAIBDA). Xian, China: IEEE, 2021: 86-90. DOI:10.1109/CAIBDA53561.2021.00026.
- [16] Rawal, Bharat S, Kumar, Lingampally Shiva AND Maganti, Sriram AND Godha, Varun. Comparative study of sha-256 optimization techniques[C]//2022 IEEE World AI IoT Congress (AIIoT). Seattle, WA, USA: IEEE, 2022: 387-392.