Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d484aa963a |
@@ -1,52 +0,0 @@
|
||||
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
|
||||
|
||||
@@ -37,18 +37,12 @@ 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 }}/${{ 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
|
||||
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
|
||||
|
||||
- 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 }}
|
||||
- name: 📝 Update mengning.com.cn
|
||||
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
|
||||
@@ -56,24 +50,4 @@ 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
|
||||
|
||||
# 创建或更新 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
|
||||
kubectl set image deployment/devstar-docs-app devstar-docs=${{ vars.DOCKER_REGISTRY_ADDRESS }}/devstar/devstar-studio-docs:latest -n app
|
||||
@@ -94,37 +94,137 @@ function sidebarDevStar(): DefaultTheme.SidebarItem[] {
|
||||
]
|
||||
} as any,
|
||||
{
|
||||
text: '使用',
|
||||
collapsible: true, // 使整个组可折叠
|
||||
collapsed: false, // 默认展开
|
||||
items: [
|
||||
{ text: '快速入门AI+', link: 'src/devstar/usage/quick-start-with-ai' },
|
||||
{
|
||||
text: 'CI/CD工作流Actions',
|
||||
collapsible: true, // 使整个组可折叠
|
||||
collapsed: false, // 默认展开
|
||||
items: [
|
||||
{ text: 'Overview', link: 'src/devstar/actions/overview' },
|
||||
{ text: '快速入门', link: 'src/devstar/actions/quickstart' },
|
||||
]
|
||||
},
|
||||
{
|
||||
text: '开发容器DevContainer',
|
||||
collapsible: true, // 使整个组可折叠
|
||||
collapsed: false, // 默认展开
|
||||
items: [
|
||||
{ text: 'Overview', link: 'src/devstar/devcontainer/overview' },
|
||||
{ text: '快速入门', link: 'src/devstar/devcontainer/quickstart' },
|
||||
]
|
||||
},
|
||||
]
|
||||
} as any,
|
||||
{
|
||||
text: '更多帮助',
|
||||
text: '管理',
|
||||
collapsible: true, // 使整个组可折叠
|
||||
collapsed: true, // 默认展开
|
||||
items: [
|
||||
{ text: 'Gitea常见问题', link: 'https://docs.gitea.com/zh-cn/help/faq' },
|
||||
{ text: '命令行', link: 'https://docs.gitea.com/zh-cn/administration/command-line' },
|
||||
{ text: '认证', link: 'https://docs.gitea.com/zh-cn/administration/authentication' },
|
||||
{ text: '环境变量清单', link: 'https://docs.gitea.com/zh-cn/administration/environment-variables' },
|
||||
{ text: '备份与恢复', link: 'https://docs.gitea.com/zh-cn/administration/backup-and-restore' },
|
||||
{ text: 'Email设置', link: 'https://docs.gitea.com/zh-cn/administration/email-setup' },
|
||||
{ text: 'Git LFS设置', link: 'https://docs.gitea.com/zh-cn/administration/git-lfs-setup' },
|
||||
{ text: 'HTTPS配置', link: 'https://docs.gitea.com/zh-cn/administration/https-setup' },
|
||||
{ text: '设置Fail2ban', link: 'https://docs.gitea.com/zh-cn/administration/fail2ban-setup' },
|
||||
{ text: '反向代理', link: 'https://docs.gitea.com/zh-cn/administration/reverse-proxies' },
|
||||
{ text: '嵌入资源提取工具', link: 'https://docs.gitea.com/zh-cn/administration/cmd-embedded' },
|
||||
{ text: '配置说明', link: 'https://docs.gitea.com/zh-cn/administration/config-cheat-sheet' },
|
||||
{ text: '日志配置', link: 'https://docs.gitea.com/zh-cn/administration/logging-config' },
|
||||
{ text: '邮件模板', link: 'https://docs.gitea.com/zh-cn/administration/mail-templates' },
|
||||
{ text: '仓库索引器', link: 'https://docs.gitea.com/zh-cn/administration/repo-indexer' },
|
||||
{ text: 'GPG提交签名', link: 'https://docs.gitea.com/zh-cn/administration/signing' },
|
||||
{ text: '外部渲染器', link: 'https://docs.gitea.com/zh-cn/administration/external-renderers' },
|
||||
{ text: '搜索引擎索引', link: 'https://docs.gitea.com/zh-cn/administration/search-engines-indexation' },
|
||||
{ text: '自定义Gitea配置', link: 'https://docs.gitea.com/zh-cn/administration/customizing-gitea' },
|
||||
{ text: '添加法律页面', link: 'https://docs.gitea.com/zh-cn/administration/adding-legal-pages' }
|
||||
]
|
||||
} as any,
|
||||
{
|
||||
text: '使用',
|
||||
collapsible: true, // 使整个组可折叠
|
||||
collapsed: true, // 默认展开
|
||||
items: [
|
||||
{ text: 'devcontainer', link: 'src/devstar/usage/quick-start-with-ai' },
|
||||
{
|
||||
text: 'Actions',
|
||||
collapsible: true, // 使整个组可折叠
|
||||
collapsed: false, // 默认展开
|
||||
items: [
|
||||
{ text: 'Overview', link: 'https://docs.gitea.com/zh-cn/usage/actions/overview' },
|
||||
{ text: '快速入门', link: 'https://docs.gitea.com/zh-cn/usage/actions/quickstart' },
|
||||
{ text: '与GitHub Actions的对比', link: 'https://docs.gitea.com/zh-cn/usage/actions/comparison' },
|
||||
{ text: 'Act Runner', link: 'https://docs.gitea.com/zh-cn/usage/actions/act-runner' },
|
||||
{ text: '变量', link: 'https://docs.gitea.com/zh-cn/usage/actions/actions-variables' },
|
||||
{ text: 'Gitea Actions设计', link: 'https://docs.gitea.com/zh-cn/usage/actions/design' },
|
||||
{ text: '密钥管理', link: 'https://docs.gitea.com/zh-cn/usage/actions/secrets' },
|
||||
{ text: 'Gitea Actions常见问题解答', link: 'https://docs.gitea.com/zh-cn/usage/actions/faq' },
|
||||
{ text: 'Badge', link: 'https://docs.gitea.com/zh-cn/usage/actions/badge' }
|
||||
]
|
||||
},
|
||||
{
|
||||
text: '软件包',
|
||||
collapsible: true, // 使整个组可折叠
|
||||
collapsed: true, // 默认展开
|
||||
items: [
|
||||
{ text: '软件包注册表', link: 'https://docs.gitea.com/zh-cn/usage/packages/overview' },
|
||||
{ text: 'Alpine 软件包注册表', link: 'https://docs.gitea.com/zh-cn/usage/packages/alpine' },
|
||||
{ text: 'Arch package registry', link: 'https://docs.gitea.com/zh-cn/usage/packages/arch' },
|
||||
{ text: 'Cargo 软件包注册表', link: 'https://docs.gitea.com/zh-cn/usage/packages/cargo' },
|
||||
{ text: 'Chef 软件包注册表', link: 'https://docs.gitea.com/zh-cn/usage/packages/chef' },
|
||||
{ text: '存储', link: 'https://docs.gitea.com/zh-cn/usage/packages/storage' },
|
||||
{ text: 'Composer 软件包注册表', link: 'https://docs.gitea.com/zh-cn/usage/packages/composer' },
|
||||
{ text: 'Conan 软件包注册表', link: 'https://docs.gitea.com/zh-cn/usage/packages/conan' },
|
||||
{ text: 'Conda 软件包注册表', link: 'https://docs.gitea.com/zh-cn/usage/packages/conda' },
|
||||
{ text: '容器注册表', link: 'https://docs.gitea.com/zh-cn/usage/packages/container' },
|
||||
{ text: 'CRAN 软件包注册表', link: 'https://docs.gitea.com/zh-cn/usage/packages/cran' },
|
||||
{ text: 'Go 软件包注册表', link: 'https://docs.gitea.com/zh-cn/usage/packages/go' },
|
||||
{ text: 'Helm Chart 注册表', link: 'https://docs.gitea.com/zh-cn/usage/packages/helm' },
|
||||
{ text: 'Maven 软件包注册表', link: 'https://docs.gitea.com/zh-cn/usage/packages/maven' },
|
||||
{ text: 'NPM Package Registry', link: 'https://docs.gitea.com/zh-cn/usage/packages/npm' },
|
||||
{ text: 'NuGet 软件包注册表', link: 'https://docs.gitea.com/zh-cn/usage/packages/nuget' },
|
||||
{ text: 'Pub 软件包注册表', link: 'https://docs.gitea.com/zh-cn/usage/packages/pub' },
|
||||
{ text: 'PyPI 软件包注册表', link: 'https://docs.gitea.com/zh-cn/usage/packages/pypi' },
|
||||
{ text: 'RPM 软件包注册表', link: 'https://docs.gitea.com/zh-cn/usage/packages/packages/rpm' },
|
||||
{ text: 'RubyGems 软件包注册表', link: 'https://docs.gitea.com/zh-cn/usage/packages/rubygems' },
|
||||
{ text: 'Swift 软件包注册表', link: 'https://docs.gitea.com/zh-cn/usage/packages/swift' },
|
||||
{ text: 'Vagrant 软件包注册表', link: 'https://docs.gitea.com/zh-cn/usage/packages/vagrant' },
|
||||
{ text: '通用软件包注册表', link: 'https://docs.gitea.com/zh-cn/usage/packages/generic' },
|
||||
{ text: 'Debian 软件包注册表', link: 'https://docs.gitea.com/zh-cn/usage/packages/debian' }
|
||||
]
|
||||
},
|
||||
{ text: 'AGit', link: 'https://docs.gitea.com/zh-cn/usage/agit' },
|
||||
{ text: '个人资料 README', link: 'https://docs.gitea.com/zh-cn/usage/profile-readme' },
|
||||
{ text: 'Blame File View', link: 'https://docs.gitea.com/zh-cn/usage/blame' },
|
||||
{ text: '邮件接收', link: 'https://docs.gitea.com/zh-cn/usage/incoming-email' },
|
||||
{ text: '标签', link: 'https://docs.gitea.com/zh-cn/usage/labels' },
|
||||
{ text: '合并请求', link: 'https://docs.gitea.com/zh-cn/usage/pull-request' },
|
||||
{ text: '权限', link: 'https://docs.gitea.com/zh-cn/usage/permissions' },
|
||||
{ text: '模板仓库', link: 'https://docs.gitea.com/zh-cn/usage/template-repositories' },
|
||||
{ text: '从模板创建工单与合并请求', link: 'https://docs.gitea.com/zh-cn/usage/issue-pull-request-templates' },
|
||||
{ text: '自动链接引用', link: 'https://docs.gitea.com/zh-cn/usage/automatically-linked-references' },
|
||||
{ text: '合并消息模板', link: 'https://docs.gitea.com/zh-cn/usage/merge-message-template' },
|
||||
{ text: '推送', link: 'https://docs.gitea.com/zh-cn/usage/push' },
|
||||
{ text: 'Blocking a user', link: 'https://docs.gitea.com/zh-cn/usage/blocking-user' },
|
||||
{ text: '克隆过滤器 (部分克隆)', link: 'https://docs.gitea.com/zh-cn/usage/clone-filters' },
|
||||
{ text: 'Code Owners', link: 'https://docs.gitea.com/zh-cn/usage/code-owners' },
|
||||
{ text: 'Webhooks', link: 'https://docs.gitea.com/zh-cn/usage/webhooks' },
|
||||
{ text: 'Migration', link: 'https://docs.gitea.com/zh-cn/usage/migration' },
|
||||
{ text: '受保护的标签', link: 'https://docs.gitea.com/zh-cn/usage/protected-tags' },
|
||||
{ text: '仓库镜像', link: 'https://docs.gitea.com/zh-cn/usage/repo-mirror' },
|
||||
{ text: 'Markdown', link: 'https://docs.gitea.com/zh-cn/usage/markdown' },
|
||||
{ text: 'Multi-factor Authentication (MFA)', link: 'https://docs.gitea.com/zh-cn/usage/multi-factor-authentication' }
|
||||
]
|
||||
} as any,
|
||||
{
|
||||
text: '开发',
|
||||
collapsible: true, // 使整个组可折叠
|
||||
collapsed: true, // 默认展开
|
||||
items: [
|
||||
{ text: '玩转 Gitea', link: 'https://docs.gitea.com/zh-cn/development/hacking-on-gitea' },
|
||||
{ text: 'API 使用指南', link: 'https://docs.gitea.com/zh-cn/development/api-usage' },
|
||||
{ text: 'OAuth2 提供者', link: 'https://docs.gitea.com/zh-cn/development/oauth2-provider' },
|
||||
{ text: '迁移接口', link: 'https://docs.gitea.com/zh-cn/development/migrations-interfaces' },
|
||||
{ text: '集成', link: 'https://docs.gitea.com/zh-cn/development/integrations' }
|
||||
]
|
||||
} as any,
|
||||
{
|
||||
text: '贡献',
|
||||
collapsible: true, // 使整个组可折叠
|
||||
collapsed: true, // 默认展开
|
||||
items: [
|
||||
{ text: '后端开发指南', link: 'https://docs.gitea.com/zh-cn/contributing/guidelines-backend' },
|
||||
{ text: '前端开发指南', link: 'https://docs.gitea.com/zh-cn/contributing/guidelines-frontend' },
|
||||
{ text: '重构指南', link: 'https://docs.gitea.com/zh-cn/contributing/guidelines-refactoring' },
|
||||
{ text: '本地化', link: 'https://docs.gitea.com/zh-cn/contributing/localization' }
|
||||
]
|
||||
} as any,
|
||||
{
|
||||
text: '帮助',
|
||||
collapsible: true, // 使整个组可折叠
|
||||
collapsed: true, // 默认展开
|
||||
items: [
|
||||
{ text: '常见问题', link: 'https://docs.gitea.com/zh-cn/help/faq' },
|
||||
{ text: '支持选项', link: 'https://docs.gitea.com/zh-cn/help/support' },
|
||||
]
|
||||
} as any,
|
||||
]
|
||||
@@ -171,11 +271,11 @@ function sidebarCompiling(): DefaultTheme.SidebarItem[] {
|
||||
link: '/src/compile/why-distributed-compiling'
|
||||
},
|
||||
{
|
||||
text: 'CloudBuild分布式编译',
|
||||
text: 'CloudBuild',
|
||||
link: '/src/compile/cloudbuild'
|
||||
},
|
||||
{
|
||||
text: 'ShareBuild共享编译',
|
||||
text: 'ShareBuild',
|
||||
link: '/src/compile/sharebuild'
|
||||
},
|
||||
]
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
# CloudBuild私有云分布式编译系统
|
||||
|
||||
## CloudBuild的适用场景
|
||||
|
||||
对于大型开发团队,CloudBuild私有云分布式编译系统不仅可以通过分布式编译加速项目编译过程,而且有大量编译任务是相同的,分布式编译缓存可以避免重复编译,从而节约算力消耗,并进一步缩短项目编译时间。
|
||||
|
||||
## CloudBuild QuickStart
|
||||
|
||||
todo
|
||||
# 分布式编译系统CloudBuild
|
||||

|
||||
## 为什么需要分布式编译?
|
||||
- 大型项目过长的编译耗时将会给开发、测试和调试都带来延迟,所以缩短大型项目的编译时间的分布式编译系统有重要意义
|
||||
- 使用分布式编译系统编译项目可以利用计算机集群提高编译效率,缩短项目编译时间
|
||||
- 在实际开发时,同一个团队大量的编译任务时相同的。CloudBuild提供的编译缓存可以避免重复上传和重复编译,从而进一步加快编译效率
|
||||
|
||||
## 总体架构
|
||||
### 系统总体架构
|
||||

|
||||
- Ninja:客户端,该机器上需要保存有完整的待编译项目源代码。
|
||||
|
||||
@@ -1,24 +1,80 @@
|
||||
# 编译加速
|
||||
|
||||
|
||||
## 分布式编译
|
||||
## 分布式编译技术
|
||||
|
||||

|
||||
|
||||
- [为什么需要分布式编译?](/src/compile/why-distributed-compiling)
|
||||
- [CloudBuild私有云分布式编译系统](/src/compile/cloudbuild)
|
||||
- [ShareBuild分布式共享编译工作站](/src/compile/sharebuild)
|
||||
- [以AOSP14项目为例ShareBuild分布式编译详细配置方法](/src/compile/sharebuild-aosp14.md)
|
||||
- 大型项目过长的编译耗时将会给开发、测试和调试都带来延迟,所以缩短大型项目的编译时间的分布式编译系统有重要意义
|
||||
- 使用分布式编译系统编译项目可以利用计算机集群提高编译效率,缩短项目编译时间
|
||||
- 在实际开发时,同一个团队大量的编译任务时相同的。CloudBuild提供的编译缓存可以避免重复上传和重复编译,从而进一步加快编译效率
|
||||
|
||||
### CloudBuild
|
||||

|
||||
- Ninja:客户端,该机器上需要保存有完整的待编译项目源代码。
|
||||
- Action Cache:服务端缓存,主要保存编译任务的执行结果。
|
||||
- CAS Cache:服务端缓存,主要保存客户端上传的依赖文件,编译结果文件。
|
||||
- Scheduler:任务调度器,将编译任务id分发到各个编译节点。
|
||||
- Redis:主要存储具体的编译任务供编译节点领取执行,也可存储Action Cache和 CAS Cache中的内容加速编译。
|
||||
- MySQL:主要存储编译过程中的任务统计信息。
|
||||
- Executor:各个编译节点
|
||||
|
||||
## AI编译器
|
||||
### ShareBuild
|
||||

|
||||
CloudBuild主程序分为三个部分:Client、Server、Executor。
|
||||
- Client:运行在客户端,和用户对接,用于生成待执行的远程编译任务, 同时也作为本地编译节点执行本地任务。
|
||||
- Server:运行在主服务器,主要用于连接各个编译节点,以及 将客户端上传的编译任务调度到与其连接的各个编译节点上。
|
||||
- Executor:运行在编译节点,负责接收并执行编译任务,是编译任务真正执行的地方。
|
||||
|
||||
todo
|
||||
### 系统分层结构
|
||||

|
||||
|
||||
## PGO/LTO编译性能优化
|
||||
|
||||
todo
|
||||
## 运行原理与流程
|
||||
|
||||
### 分布式编译原理
|
||||

|
||||
|
||||
### CloudBuild客户端
|
||||
CloudBuild客户端基于Ninja改造,有下面这些优势
|
||||
- 兼容使用Ninja编译的项目
|
||||
- 使用远程执行的方式提高编译时并发度
|
||||
- 使用编译缓存减少需要编译的任务数量
|
||||
|
||||
### CloudBuild服务端
|
||||
- 使用远程执行的方法提高编译时并发度,实现了任务分发至远程节点同步执行
|
||||
- 使用分布式任务调度提高任务调度效率和计算节点资源利用率,避免集中式调度的任务阻塞问题
|
||||
- 使用编译缓存结合内容寻址存储技术减少网络传输量、避免重复上传与重复编译
|
||||
|
||||
### CloudBuild优势
|
||||
- 低成本:组成executor的机器不需要使用专门的高性能计算型机器,可使用多个平价的空闲机器
|
||||
- 高效:CloudBuild实现分布式编译的功能,相比单机大大提升并发度
|
||||
- 兼容Ninja:CloudBuild客户端基于Ninja改造,对于使用Ninja构建和可以转换为Ninja构建的项目不用额外修改构建清单
|
||||
|
||||
### CloudBuild执行流程
|
||||
- 客户端: 生成远程任务->生成任务依赖->发送任务与依赖
|
||||
- 服务端:检查任务缓存->检查依赖完整性->调度任务
|
||||
- 编译结点:还原文件目录->还原文件目录->返回编译结果
|
||||
|
||||
## AOSP和LLVM上的应用
|
||||
### LLVM上的应用效果
|
||||

|
||||
### AOSP上的应用效果
|
||||

|
||||
### CloudBuild硬件资源利用率
|
||||
4核CPU利用率:
|
||||

|
||||
8核CPU利用率:
|
||||

|
||||
16核CPU利用率:
|
||||

|
||||
|
||||
## CloudBuild使用方法
|
||||
### CloudBuild安装
|
||||

|
||||
CloudBuild项目地址:https://gitee.com/cloudbuild888/cloudbuild.git
|
||||
### CloudBuild分布式编译
|
||||

|
||||
LLVM项目地址:https://gitee.com/mirrors/LLVM.git
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,125 +0,0 @@
|
||||
# 以AOSP14项目为例ShareBuild分布式编译详细配置方法
|
||||
|
||||
## 编译环境准备
|
||||
|
||||
### 安装 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
|
||||
```
|
||||
|
||||
* 确保所有节点上均安装配置好了项目的编译环境,即所有节点上均能采用ninja成功单机编译项目。
|
||||
|
||||
### 安装AOSP项目编译环境
|
||||
|
||||
* 参与编译的同一个局域网内的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 # 执行单机编译,编译成功后可以看到:
|
||||
|
||||
```
|
||||
```
|
||||
[19:20:05.430], pending/wanted: 4, ready: 1, running: 0
|
||||
|
||||
|
||||
#### 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
|
||||
```
|
||||
|
||||
* 在项目根目录下执行分布式编译
|
||||
|
||||
```bash
|
||||
su # 切换到 root 关闭沙箱
|
||||
source build/envsetup.sh # 初始化环境
|
||||
lunch aosp_arm-eng # 选择目标配置
|
||||
make # 执行分布式编译,编译成功后可以看到:
|
||||
```
|
||||
* 客户端节点:
|
||||
```
|
||||
[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 clean # 清除编译目标文件
|
||||
rm -r out # 清除编译产物
|
||||
```
|
||||
## 版权声明
|
||||
|
||||
Copyright @ Mengning Software
|
||||
|
||||
梦宁软件(江苏)有限公司 版权所有
|
||||
@@ -1,74 +1,79 @@
|
||||
# ShareBuild分布式共享编译工作站
|
||||
|
||||
## ShareBuild的适用场景
|
||||
|
||||
在同一局域网内工作的小型团队,ShareBuild以P2P共享架构将空闲算力贡献给团队其他成员,从而为每个团队成员提供编译加速效果。
|
||||
|
||||
## ShareBuild QuickStart
|
||||
|
||||
* 同一个局域网内的A、B、C等所有节点上安装ninja2:
|
||||
|
||||
```
|
||||
wget -c https://raw.githubusercontent.com/ninja-cloudbuild/ninja2/refs/heads/main/install.sh && chmod +x install.sh && sudo ./install.sh
|
||||
```
|
||||
|
||||
* 启用ShareBuild的前置要求
|
||||
|
||||
1. 所有节点上均安装配置好了项目的编译环境,即所有节点上均能采用ninja成功单机编译项目。
|
||||
<!--
|
||||
|
||||
2. 选择任一节点上作为项目开发环境,项目中使用.devcontainer/devcontainer.json 配置了image镜像(示例如下),依次镜像创建的开发容器中能采用ninja成功单机编译项目。
|
||||
|
||||
```
|
||||
{
|
||||
"name": "DevContainer",
|
||||
"image": "devstar.cn/devstar/DevContainer:latest" # 仅作示例,务必使用您已安装配置好项目编译环境的容器镜像!
|
||||
}
|
||||
```
|
||||
> 注意:以上两种方式二选一即可,第2种方式省掉了在其他节点上安装配置项目编译环境,但是首次ShareBuild模式分布式编译时其他节点会自动下载项目编译环境的容器镜像。
|
||||
-->
|
||||
|
||||
* 选择任一节点上作为项目开发环境,开启ShareBuild模式,然后进行分布式编译。
|
||||
|
||||
项目根目录下创建ninja2.conf 文件如下即可开启ShareBuild模式:
|
||||
```
|
||||
sharebuid:true
|
||||
```
|
||||
这时使用ninja编译将自动进入ShareBuild模式分布式编译项目。
|
||||
|
||||
> 如果直接使用ninja命令编译项目,也可以加上-s参数表示启用ShareBuild模式,示例如下:
|
||||
```
|
||||
ninja -s -r `realpath ../` #启动分布式编译,注意-r 指定项目根目录
|
||||
ninja -t clean #清除编译产物
|
||||
````
|
||||
|
||||
* 对一些特殊项目的补充说明
|
||||
|
||||
除以上常规的ShareBuild配置外,对于一些特殊项目需要做一些额外的配置,补充说明如下:
|
||||
|
||||
## 使用ShareBuild编译Android开源项目(AOSP)
|
||||
|
||||
除按照以上方法准备好编译环境和开启ShareBuild模式外,以AOSP14项目为例([详细的配置方法](/src/compile/sharebuild-aosp14.md)),还需要替换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
|
||||
-->
|
||||
|
||||
## 参考链接
|
||||
|
||||
* [以AOSP14项目为例ShareBuild分布式编译详细配置方法](/src/compile/sharebuild-aosp14.md)
|
||||
|
||||
## 版权声明
|
||||
|
||||
Copyright @ Mengning Software
|
||||
|
||||
梦宁软件(江苏)有限公司 版权所有
|
||||
# 分布式编译系统ShareBuild
|
||||

|
||||
## 为什么需要分布式编译?
|
||||
- 大型项目过长的编译耗时将会给开发、测试和调试都带来延迟,所以缩短大型项目的编译时间的分布式编译系统有重要意义
|
||||
- 使用分布式编译系统编译项目可以利用计算机集群提高编译效率,缩短项目编译时间
|
||||
- 在实际开发时,同一个团队大量的编译任务时相同的。CloudBuild提供的编译缓存可以避免重复上传和重复编译,从而进一步加快编译效率
|
||||
|
||||
## 总体架构
|
||||
### 系统总体架构
|
||||

|
||||
- Ninja:客户端,该机器上需要保存有完整的待编译项目源代码。
|
||||
- Action Cache:服务端缓存,主要保存编译任务的执行结果。
|
||||
- CAS Cache:服务端缓存,主要保存客户端上传的依赖文件,编译结果文件。
|
||||
- Scheduler:任务调度器,将编译任务id分发到各个编译节点。
|
||||
- Redis:主要存储具体的编译任务供编译节点领取执行,也可存储Action Cache和 CAS Cache中的内容加速编译。
|
||||
- MySQL:主要存储编译过程中的任务统计信息。
|
||||
- Executor:各个编译节点
|
||||
|
||||
### 部署示意图
|
||||

|
||||
CloudBuild主程序分为三个部分:Client、Server、Executor。
|
||||
- Client:运行在客户端,和用户对接,用于生成待执行的远程编译任务, 同时也作为本地编译节点执行本地任务。
|
||||
- Server:运行在主服务器,主要用于连接各个编译节点,以及 将客户端上传的编译任务调度到与其连接的各个编译节点上。
|
||||
- Executor:运行在编译节点,负责接收并执行编译任务,是编译任务真正执行的地方。
|
||||
|
||||
### 系统分层结构
|
||||

|
||||
|
||||
## 运行原理与流程
|
||||
|
||||
### 分布式编译原理
|
||||

|
||||
|
||||
### CloudBuild客户端
|
||||
CloudBuild客户端基于Ninja改造,有下面这些优势
|
||||
- 兼容使用Ninja编译的项目
|
||||
- 使用远程执行的方式提高编译时并发度
|
||||
- 使用编译缓存减少需要编译的任务数量
|
||||
|
||||
### CloudBuild服务端
|
||||
- 使用远程执行的方法提高编译时并发度,实现了任务分发至远程节点同步执行
|
||||
- 使用分布式任务调度提高任务调度效率和计算节点资源利用率,避免集中式调度的任务阻塞问题
|
||||
- 使用编译缓存结合内容寻址存储技术减少网络传输量、避免重复上传与重复编译
|
||||
|
||||
### CloudBuild优势
|
||||
- 低成本:组成executor的机器不需要使用专门的高性能计算型机器,可使用多个平价的空闲机器
|
||||
- 高效:CloudBuild实现分布式编译的功能,相比单机大大提升并发度
|
||||
- 兼容Ninja:CloudBuild客户端基于Ninja改造,对于使用Ninja构建和可以转换为Ninja构建的项目不用额外修改构建清单
|
||||
|
||||
### CloudBuild执行流程
|
||||
- 客户端: 生成远程任务->生成任务依赖->发送任务与依赖
|
||||
- 服务端:检查任务缓存->检查依赖完整性->调度任务
|
||||
- 编译结点:还原文件目录->还原文件目录->返回编译结果
|
||||
|
||||
## AOSP和LLVM上的应用
|
||||
### LLVM上的应用效果
|
||||

|
||||
### AOSP上的应用效果
|
||||

|
||||
### CloudBuild硬件资源利用率
|
||||
4核CPU利用率:
|
||||

|
||||
8核CPU利用率:
|
||||

|
||||
16核CPU利用率:
|
||||

|
||||
|
||||
## CloudBuild使用方法
|
||||
### CloudBuild安装
|
||||

|
||||
CloudBuild项目地址:https://gitee.com/cloudbuild888/cloudbuild.git
|
||||
### CloudBuild分布式编译
|
||||

|
||||
LLVM项目地址:https://gitee.com/mirrors/LLVM.git
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,52 +1,78 @@
|
||||
# 为什么需要分布式编译?
|
||||
|
||||
大型项目过长的编译耗时给开发、调试、测试和CI/CD都带来延迟,缩短大型项目的编译时间是分布式编译系统的主要目标。
|
||||
|
||||
- 使用分布式编译系统编译项目可以利用计算机集群提高编译效率,缩短项目编译时间。
|
||||
- 在实际开发时,同一个团队有大量编译任务是相同的,分布式编译缓存可以避免重复编译,从而节约算力消耗,并进一步缩短项目编译时间。
|
||||
|
||||
## 分布式编译技术相关工作综述
|
||||
|
||||
当前,国内外已有多种分布式编译系统和技术,如Distcc[8]、 CCache[9]、Bazel[10]、CodeArts Build[11]以及YADCC[12]等。
|
||||
|
||||
Distcc是一款经典的分布式编译工具,采用客户端/服务器的工作模式,用户使用客户端程序启动编译任务,客户端会分析项目代码并在本地完成预处理工作,然后选择一台远程计算机,将文件发送至服务器,服务器进程处理收到的编译任务并将结果返回至客户端。Distcc 的缺点在于其负载均衡算法过于简单,其无法感知各个远程计算机的负载情况,任务分发的依据主要与远程主机在本地环境变量中的次序相关,远程主机名越靠前,得到的编译任务越多,但是当存在某个远程主机的性能过差的情况,整体编译效率将会显著下降。
|
||||
|
||||
CCache(Compiler Cache)是一款编译缓存工具,支持GCC、Clang、MSVC(Microsoft 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是专为华为云平台设计的,因此它的使用会对华为云服务的依赖性较高,同时由于其非开源,用户无法直接了解该系统的具体实现细节和内部工作原理,对后续的优化和维护工作带来不便。
|
||||
|
||||
腾讯YADCC(Yet 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%,因此本系统可以大幅缩短编译时间,加快项目迭代速度。
|
||||
|
||||

|
||||
|
||||
## 参考链接
|
||||
|
||||
- [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 beginner’s 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 tree’s technical principles and related application fields[C/OL]//2021 International Conference on Artificial Intelligen-ce, Big Data and Algorithms (CAIBDA). Xi’an, 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.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# 为什么需要分布式编译?
|
||||
|
||||
- 大型项目过长的编译耗时将会给开发、测试和调试都带来延迟,所以缩短大型项目的编译时间的分布式编译系统有重要意义
|
||||
- 使用分布式编译系统编译项目可以利用计算机集群提高编译效率,缩短项目编译时间
|
||||
- 在实际开发时,同一个团队大量的编译任务时相同的。CloudBuild提供的编译缓存可以避免重复上传和重复编译,从而进一步加快编译效率
|
||||
|
||||
## 总体架构
|
||||
### 系统总体架构
|
||||

|
||||
- Ninja:客户端,该机器上需要保存有完整的待编译项目源代码。
|
||||
- Action Cache:服务端缓存,主要保存编译任务的执行结果。
|
||||
- CAS Cache:服务端缓存,主要保存客户端上传的依赖文件,编译结果文件。
|
||||
- Scheduler:任务调度器,将编译任务id分发到各个编译节点。
|
||||
- Redis:主要存储具体的编译任务供编译节点领取执行,也可存储Action Cache和 CAS Cache中的内容加速编译。
|
||||
- MySQL:主要存储编译过程中的任务统计信息。
|
||||
- Executor:各个编译节点
|
||||
|
||||
### 部署示意图
|
||||

|
||||
CloudBuild主程序分为三个部分:Client、Server、Executor。
|
||||
- Client:运行在客户端,和用户对接,用于生成待执行的远程编译任务, 同时也作为本地编译节点执行本地任务。
|
||||
- Server:运行在主服务器,主要用于连接各个编译节点,以及 将客户端上传的编译任务调度到与其连接的各个编译节点上。
|
||||
- Executor:运行在编译节点,负责接收并执行编译任务,是编译任务真正执行的地方。
|
||||
|
||||
### 系统分层结构
|
||||

|
||||
|
||||
## 运行原理与流程
|
||||
|
||||
### 分布式编译原理
|
||||

|
||||
|
||||
### CloudBuild客户端
|
||||
CloudBuild客户端基于Ninja改造,有下面这些优势
|
||||
- 兼容使用Ninja编译的项目
|
||||
- 使用远程执行的方式提高编译时并发度
|
||||
- 使用编译缓存减少需要编译的任务数量
|
||||
|
||||
### CloudBuild服务端
|
||||
- 使用远程执行的方法提高编译时并发度,实现了任务分发至远程节点同步执行
|
||||
- 使用分布式任务调度提高任务调度效率和计算节点资源利用率,避免集中式调度的任务阻塞问题
|
||||
- 使用编译缓存结合内容寻址存储技术减少网络传输量、避免重复上传与重复编译
|
||||
|
||||
### CloudBuild优势
|
||||
- 低成本:组成executor的机器不需要使用专门的高性能计算型机器,可使用多个平价的空闲机器
|
||||
- 高效:CloudBuild实现分布式编译的功能,相比单机大大提升并发度
|
||||
- 兼容Ninja:CloudBuild客户端基于Ninja改造,对于使用Ninja构建和可以转换为Ninja构建的项目不用额外修改构建清单
|
||||
|
||||
### CloudBuild执行流程
|
||||
- 客户端: 生成远程任务->生成任务依赖->发送任务与依赖
|
||||
- 服务端:检查任务缓存->检查依赖完整性->调度任务
|
||||
- 编译结点:还原文件目录->还原文件目录->返回编译结果
|
||||
|
||||
## AOSP和LLVM上的应用
|
||||
### LLVM上的应用效果
|
||||

|
||||
### AOSP上的应用效果
|
||||

|
||||
### CloudBuild硬件资源利用率
|
||||
4核CPU利用率:
|
||||

|
||||
8核CPU利用率:
|
||||

|
||||
16核CPU利用率:
|
||||

|
||||
|
||||
## CloudBuild使用方法
|
||||
### CloudBuild安装
|
||||

|
||||
CloudBuild项目地址:https://gitee.com/cloudbuild888/cloudbuild.git
|
||||
### CloudBuild分布式编译
|
||||

|
||||
LLVM项目地址:https://gitee.com/mirrors/LLVM.git
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,53 +0,0 @@
|
||||
# DevStar CI/CD工作流 Actions Overview
|
||||
|
||||
DevStar基于Gitea Actions开发了开箱即用的CI/CD工作流解决方案, 兼容Github Actions生态系统。
|
||||
|
||||
> - 本站中Actions是指DevStar开箱即用的CI/CD工作流解决方案,从不同方面兼容Gitea Actions和Github Actions。
|
||||
> - 本站中actions/action是指Actions要使用的脚本/插件,比如"actions/checkout@v4" 或 "kekxv/AiReviewPR@v0.0.6"。
|
||||
|
||||
## Actions的安装配置方法
|
||||
|
||||
- DevStar安装过程中会默认启动一个全局的Actions Runner;
|
||||
- 一键启动Actions Runner
|
||||
|
||||
在项目设置、用户设置、组织设置和后台管理中,如果当前用户有创建Actions Runner的权限,可在工作流Actions板块下点击【创建新运行器】,找到【一键启动运行器】可以创建相应作用范围的Actions Runner。
|
||||
|
||||
- 手工启动Actions Runner
|
||||
|
||||
在项目设置、用户设置、组织设置和后台管理中,可以在工作流Actions板块下点击【创建新运行器】,可以复制Registration Token。
|
||||
|
||||
> 不同位置复制的Registration Token创建的Actions Runner有不同的作用范围。
|
||||
|
||||
```
|
||||
$ docker run --name devstar-runner -d -v /var/run/docker.sock:/var/run/docker.sock \
|
||||
-e GITEA_INSTANCE_URL=${YOUR_DEVSTAR_URL} \
|
||||
-e GITEA_RUNNER_REGISTRATION_TOKEN=${YOUR_DEVSTAR_RUNNER_REGISTRATION_TOKEN} \
|
||||
devstar.cn/devstar/act_runner:latest
|
||||
```
|
||||
|
||||
## 使用actions短链接的好处
|
||||
|
||||
在DevStar CI/CD工作流配置文件中(如.gitea/workflows/ci-cd.yaml)使用不包含域名的actions/action短链接,DevStar会智能判断当前平台上是否有相同名称的仓库或镜像仓库,如有则使用当前平台的仓库,没有则默认使用github.com上的仓库。
|
||||
|
||||
```
|
||||
- name: 🔍 Check out repository code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: AI Review code
|
||||
uses: kekxv/AiReviewPR@v0.0.6
|
||||
|
||||
- name: Report Test Results
|
||||
if: always() && github.event_name == 'pull_request'
|
||||
uses: actions/github-script@v6
|
||||
```
|
||||
|
||||
> 类似以上actions/action短链接仓库,如果在当前DevStar平台上创建相应的镜像仓库,可以缩短DevStar CI/CD工作流执行时间。
|
||||
|
||||
## 调试CI/CD工作流配置文件脚本
|
||||
|
||||
DevStar已支持在线调试CI/CD工作流配置文件脚本,调试方法如下:
|
||||
|
||||
- 在项目仓库页面点击【工作流/Actions】,然后选择进入某个工作流,右上角【编辑并运行工作流】即可修改脚本再次执行,运行成功后可以直接提交到对应的仓库分支。
|
||||
|
||||
> 本地配置调试CI/CD工作流的方法参加 [GitHub Local Actions](https://sanjulaganepola.github.io/github-local-actions-docs/) and https://nektosact.com/
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
|
||||
# DevStar CI/CD工作流 Actions 快速入门
|
||||
|
||||
@@ -30,106 +30,3 @@ DevStar代码托管平台中项目设置、用户设置和后台管理中都可
|
||||
|
||||
### AI Code Review详解
|
||||
|
||||
## **一、核心工作流程说明**
|
||||
|
||||
AI Code Review 的执行过程如下:
|
||||
|
||||
1. **触发条件**
|
||||
- 当有人新建 PR(pull_request/opened)
|
||||
- 或更新了 PR(pull_request/synchronize)
|
||||
→ 工作流自动开始执行。
|
||||
2. **代码检出(Checkout)**
|
||||
使用 actions/checkout 拉取 PR 的代码差异,为审查准备上下文。
|
||||
3. **调用 AiReviewPR Action**
|
||||
- Action 会读取 PR 的 diff、文件内容与上下文。
|
||||
- 将这些内容组装为审查提示(prompt)。
|
||||
- 调用你配置的大模型(Ollama、OpenAI 兼容接口等)。
|
||||
- 获得模型输出后,自动写入 PR 评论区或输出到日志。
|
||||
4. **输出结果**
|
||||
- 如果 `REVIEW_PULL_REQUEST=true` → 自动在 PR 下评论。
|
||||
- 如果为 false → 只在日志输出,便于本地验证。
|
||||
|
||||
------
|
||||
|
||||
## **二、AiReviewPR 的内部实现机制**
|
||||
|
||||
以下是 Action 的实际工作方式(代码见 GitHub):
|
||||
|
||||
### **1. 自动收集 PR 信息**
|
||||
|
||||
Action 会自动读取:
|
||||
|
||||
- PR 编号、作者、提交信息
|
||||
- diff 内容(新增、删除、修改)
|
||||
- 受影响的文件内容
|
||||
|
||||
### **读取 PR Diff**
|
||||
|
||||
```
|
||||
const diff = await octokit.pulls.get({
|
||||
...github.context.issue,
|
||||
mediaType: { format: "diff" },
|
||||
}).then(r => r.data);
|
||||
```
|
||||
|
||||
### 2. 构建审查 Prompt
|
||||
|
||||
Prompt 会自动包含:
|
||||
|
||||
- 代码变更摘要
|
||||
|
||||
- 修改前/修改后的代码片段
|
||||
|
||||
- 模型需要回答的格式,例如:
|
||||
|
||||
```
|
||||
1. 潜在Bug
|
||||
2. 代码风格问题
|
||||
3. 性能优化
|
||||
4. 安全风险
|
||||
5. 重构建议
|
||||
```
|
||||
|
||||
### **3. 调用大模型 API**
|
||||
|
||||
AiReviewPR 支持任意 OpenAI API 兼容模型,例如:
|
||||
|
||||
- 本地 **Ollama**
|
||||
- OpenAI、DeepSeek、Qwen 公开服务
|
||||
- 私有化模型服务
|
||||
|
||||
只需提供:
|
||||
|
||||
```
|
||||
vars.MODEL
|
||||
vars.OLLAMA_HOST
|
||||
```
|
||||
|
||||
Action 会自动发送:
|
||||
|
||||
```
|
||||
{
|
||||
"model": "qwen2.5:14b",
|
||||
"messages": [
|
||||
{"role": "system", "content": "..."},
|
||||
{"role": "user", "content": "这是PR的代码修改内容..."}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### **4. 返回数据解析**
|
||||
|
||||
Action 提取模型的回答内容,将其转换为 Markdown,并根据配置输出为:
|
||||
|
||||
- GitHub/Gitea PR 评论
|
||||
或
|
||||
- 工作流日志(便于调试)
|
||||
|
||||
### **发布评论**
|
||||
|
||||
```
|
||||
await octokit.issues.createComment({
|
||||
...github.context.issue,
|
||||
body: review,
|
||||
});
|
||||
```
|
||||
@@ -1,4 +1,5 @@
|
||||
|
||||
|
||||
# DevStar AI+ DevOps
|
||||
|
||||
DevStar AI+ DevOps 是一个完整的AI驱动研发平台解决方案,通过集成 DevStar平台、代码大语言模型、Gitea MCP Server和 AI Code Tools(Cursor、Claude Code、iFlow等),为开发者提供智能化研发支撑体系。
|
||||
@@ -14,11 +15,11 @@ wget -c https://devstar.cn/assets/install.sh && chmod +x install.sh && sudo ./in
|
||||
sudo devstar start
|
||||
```
|
||||
|
||||
安装完成后,我们得到DevStar代码托管平台的URL,比如http://172.16.94.26:80 ,之后作为 `GITEA_HOST`(给 MCP Server 用)
|
||||
安装完成后,我们得到DevStar代码托管平台的URL,比如http://172.16.94.26:80
|
||||
|
||||
### 二、Ollama私有部署代码大模型
|
||||
|
||||
> 如您使用第三方API及Token,比如从[智谱AI开放平台](https://bigmodel.cn/usercenter/proj-mgmt/apikeys) 上注册申请并添加新的API Key,可以跳过这一部分。
|
||||
> 如您使用第三方API及Token,比如从http://xxx 注册申请,可以跳过这一部分。
|
||||
|
||||
Ubuntu-20.04下完成安装:
|
||||
```
|
||||
@@ -53,14 +54,7 @@ systemctl daemon-reload
|
||||
systemctl restart ollama
|
||||
```
|
||||
|
||||
**产出**
|
||||
|
||||
- 模型服务地址,例如:`http://172.16.94.26:11434`
|
||||
- 模型名,例如:`qwen2.5-coder:32b`
|
||||
|
||||
**后面用在哪里**
|
||||
|
||||
- CI/CD 里的 AI Code Review(作为 `vars.MODEL` / `vars.OLLAMA_HOST`)
|
||||
安装完成后,我们得到API URL,比如http://172.16.94.26:11434/api/tags model比如qwen2.5-coder:32b token比如TOKEN***************
|
||||
|
||||
### 三、在项目中使用代码大模型
|
||||
|
||||
@@ -89,14 +83,8 @@ jobs:
|
||||
model: ${{ vars.MODEL }}
|
||||
host: ${{ vars.OLLAMA_HOST }}
|
||||
REVIEW_PULL_REQUEST: false
|
||||
//如果用ai token 则需配置
|
||||
//ai_token: ${{ vars.AI_TOKEN }}
|
||||
```
|
||||
然后在 DevStar 平台上您的项目仓库【设置 > 工作流】 里设置变量或密钥:
|
||||
|
||||
- `vars.MODEL`:填入 **第二步中的模型名**,例如 `qwen2.5-coder:32b`
|
||||
- `vars.OLLAMA_HOST`:填入 **第二步中得到的模型服务地址** 例如 `http://172.16.94.26:11434`
|
||||
- `vars.AI_TOKEN`:填入 **第二步中第三方获取的API Key token**
|
||||
DevStar代码托管平台中项目设置、用户设置和后台管理中都可以设置变量vars.MODEL、vars.OLLAMA_HOST等。
|
||||
|
||||
#### 安装配置MCP Server
|
||||
|
||||
@@ -130,7 +118,7 @@ jobs:
|
||||
"docker.gitea.com/gitea-mcp-server"
|
||||
],
|
||||
"env": {
|
||||
"GITEA_HOST": "<Your Gitea Host>",
|
||||
"GITEA_HOST": "http://172.16.94.26",
|
||||
"GITEA_ACCESS_TOKEN": "${input:gitea_token}"
|
||||
}
|
||||
}
|
||||
@@ -138,34 +126,19 @@ jobs:
|
||||
}
|
||||
```
|
||||
|
||||
`GITEA_HOST`:**第一步中得到的 DevStar 代码托管平台地址**
|
||||
#### 配置AI IDE/CLI使用私有大模型及MCP Server
|
||||
|
||||
`gitea_token`:来自 DevStar / Gitea 的「个人访问令牌」
|
||||
* Copilot,点击提示框里的“管理模型”,选择ollama;将mcp配置添加到 .vscode/mcp.json下
|
||||
|
||||
获取方式:
|
||||
* Cursor,不支持私有模型,需要本地部署后做代理;点击Cursor Settings -> Tools & MCP
|
||||
|
||||
1. 登录 DevStar 平台 (`GITEA_HOST` 对应的网站)
|
||||
2. 进入:右上角用户 【设置 > 应用】中
|
||||
3. 点击「生成新的令牌」,命名令牌并给予仓库读取等必要权限
|
||||
4. 复制生成的一串字符串,这就是你的 `gitea_token`
|
||||
-> New MCP Server 将mcp配置添加到mcp.json中
|
||||
|
||||
#### 配置 AI IDE/CLI 使用 LLM 及 MCP Server
|
||||
|
||||
- **LLM**
|
||||
- 使用第三方 API/云端模型(OpenAI/Anthropic/Azure/Gemini)
|
||||
- **Cursor**:在模型设置中选择对应 Provider,配置 **API Key / Base URL / Model**
|
||||
- **Continue**:Add Chat model 选择对应 Provider,配置 **API Key / Base URL / Model**
|
||||
- **Copilot**:在“管理模型”中选择 **Copilot 支持的云端模型**(若需使用自带 Key 的第三方,一般用 Cursor/Continue 接入更直接)
|
||||
- 使用本地/私有部署(Ollama / 内网 LLM)
|
||||
- **Copilot**:在“管理模型”中选择 **ollama**
|
||||
- **Continue**:Add Chat model → Provider 选择 **ollama**
|
||||
- **Cursor**:若 LLM 在内网且 Cursor 不支持直连,需要做**反向代理/企业网关**提供公网可访问的 **Base URL** 再接入
|
||||
- **MCP Server(与 LLM 选择无关)**
|
||||
- **Copilot(VS Code)**:将 MCP 配置添加到 **.vscode/mcp.json**
|
||||
- **Cursor**:Cursor Settings → Tools & MCP → New MCP Server,将 MCP 配置写入 **mcp.json**
|
||||
- **Continue**:Settings → Tools → MCP Servers 配置 YAML ,或复用 Cursor 的 MCP 配置:将 **mcp.json** 放到 **.continue/mcpServers/mcp.json**
|
||||
* Continue,点击Add Chat model,Provider选择ollama;设置->Tools->MCP Servers配置yaml文件
|
||||
|
||||
也可以将cursor的json文件放到.continue/mcpServers/mcp.json中
|
||||
|
||||
* ...
|
||||
|
||||
## 🚀 DevStar AI+ DevOps演示
|
||||
|
||||
@@ -173,35 +146,35 @@ jobs:
|
||||
|
||||
### 创建一个项目
|
||||
|
||||
点击右上角创建仓库->DevStar模板中选择Devstar.cn/template/ai-develops
|
||||
使用ai-develops项目模板创建项目
|
||||
|
||||

|
||||

|
||||
|
||||
在项目中创建一个issue
|
||||
配置mcp.json的GITEA_HOST和GITEA_ACCESS_TOKEN
|
||||
|
||||

|
||||

|
||||
|
||||
### AI生成代码
|
||||
|
||||
1.请在 Gitea 仓库 owner/repo 中读取 issue #1,帮我用自己的话总结问题、预期行为,并给出一个简单的解决思路。
|
||||

|
||||
|
||||
2.请根据你对 issue #的理解实现这个功能
|
||||
|
||||
3.请为这次修复 issue #1 的改动补充或更新测试代码,遵循项目的现有测试风格,并说明每个测试在验证什么行为。
|
||||
|
||||

|
||||

|
||||
|
||||
### 提交PR
|
||||
|
||||
1.请使用 Gitea MCP 为 issue #1创建一个新分支(如 fix/issue-1),将本次所有相关修改提交为一个清晰的 commit
|
||||

|
||||
|
||||
2.请使用 Gitea MCP 从你刚才创建的分支向 main 分支发起一个 PR,标题中包含 “#1”,描述中简要说明问题、解决方案、主要改动和测试情况,并把 PR 的链接或编号发给我。
|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
### AI Code Review
|
||||
|
||||

|
||||
设置工作流相关变量
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 100 KiB After Width: | Height: | Size: 100 KiB |
@@ -1,4 +0,0 @@
|
||||
# DevStar DevContainer Overview
|
||||
|
||||
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
|
||||
# DevStar DevContainer 快速入门
|
||||
|
||||
|
Before Width: | Height: | Size: 121 KiB After Width: | Height: | Size: 121 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 45 KiB |
@@ -1,3 +1,4 @@
|
||||
|
||||
# MCP Server
|
||||
|
||||
### 快速安装配置MCP Server
|
||||
@@ -10,6 +11,7 @@
|
||||
|
||||
```
|
||||
{
|
||||
"mcp": {
|
||||
"inputs": [
|
||||
{
|
||||
"type": "promptString",
|
||||
@@ -32,32 +34,18 @@
|
||||
"docker.gitea.com/gitea-mcp-server"
|
||||
],
|
||||
"env": {
|
||||
"GITEA_HOST": "<Your Gitea Host>",
|
||||
"GITEA_HOST": "--host http://172.16.94.26",
|
||||
"GITEA_ACCESS_TOKEN": "${input:gitea_token}"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### MCP Server使用注意事项
|
||||
|
||||
#### Copilot(VS Code)
|
||||
|
||||
- 配置放在 `.vscode/mcp.json`。重启 VS Code → Copilot 自动加载。
|
||||
- [官方文档](https://vscode.js.cn/docs/copilot/customization/mcp-servers)
|
||||
|
||||
|
||||
|
||||
#### Cursor
|
||||
|
||||
- 配置放在 `.cursor/mcp.json` 或 `.vscode/mcp.json`。
|
||||
- 打开 Cursor → 会提示“检测到 MCP Server”。点 Enable 即可。
|
||||
- [官方文档](https://cursor.com/cn/docs/context/mcp)
|
||||
|
||||
|
||||
|
||||
#### Continue
|
||||
|
||||
- 配置放在 `.continue/mcpServers/mcp.json`
|
||||
- [官方文档](https://docs.continue.dev/customize/deep-dives/mcp)
|
||||
* Copilot,简要文字描述,不要上太多图,可以提供官方配置链接
|
||||
* Cursor
|
||||
* Continue
|
||||
* ...
|
||||
|
||||
|
Before Width: | Height: | Size: 115 KiB After Width: | Height: | Size: 115 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
BIN
src/devstar/pr.png
Normal file
|
After Width: | Height: | Size: 160 KiB |
BIN
src/devstar/review.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 68 KiB |
|
Before Width: | Height: | Size: 240 KiB |
|
Before Width: | Height: | Size: 62 KiB |
|
Before Width: | Height: | Size: 326 KiB |
|
Before Width: | Height: | Size: 214 KiB |
BIN
src/devstar/template.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 65 KiB |