ci(gitea): 改为 runner 构建镜像 + save/scp(照 sundynix-site 模式)

之前写成 rsync 源码到 132 本地 build,需要 132 上有全套源码。改回 sundynix-site 的做法:
runner(128) 构建 4 个应用镜像 → docker save 打包 → scp 镜像包 + compose 到 132 →
132 docker load + docker compose up -d --no-build(用预构建镜像,不在 132 上 build)。
于是 132 上只有 docker-compose.yml + .env(+ 临时镜像包),没有源码。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Blizzard
2026-07-18 15:17:50 +08:00
parent da0d964054
commit 05b66399f9
+35 -21
View File
@@ -1,8 +1,9 @@
name: deploy-132
# 只认 main(含 PR 合并入 main)。runner 在 128,应用部署到 132
# runner 检出 → rsync 仓库到 132 → 在 132 本地 docker compose up -d --build → 健康检查。
# 132 构建、132 运行:不把 4 个大镜像塞去 128 构建(128 是基础设施机)。
# 只认 main(含 PR 合并入 main)。照 sundynix-site 的模式
# runner(128) 构建 4 个应用镜像 → docker save 打包 → scp 镜像包 + compose 到 132
# 132 docker load + docker compose up -d(用预构建镜像,不在 132 上 build)。
# 于是 132 上只有 compose + .env(+ 临时镜像包),没有源码。
on:
push:
branches: [main]
@@ -18,41 +19,54 @@ jobs:
- name: 检出代码
uses: actions/checkout@v4
- name: 安装 ssh / rsync 工具
- name: 构建 4 个应用镜像(在 runner 上)
run: |
# gateway/dispatcher/mcp-go 的构建上下文是仓库根(Go replace ../sundynix-shared
# 且 gateway 还要 COPY sundynix-admin/ 构建内嵌前端);mcp-py 上下文是自己的目录。
docker build -f sundynix-gateway/Dockerfile -t sundynix/gateway:latest .
docker build -f sundynix-dispatcher/Dockerfile -t sundynix/dispatcher:latest .
docker build -f sundynix-mcp-go/Dockerfile -t sundynix/mcp-go:latest .
docker build -f sundynix-mcp-py/Dockerfile -t sundynix/mcp-py:latest sundynix-mcp-py
- name: 导出镜像为压缩包
run: |
docker save \
sundynix/gateway:latest sundynix/dispatcher:latest \
sundynix/mcp-go:latest sundynix/mcp-py:latest \
| gzip > images.tar.gz
- name: 安装 ssh 工具
run: |
if command -v apt-get >/dev/null; then
apt-get update && apt-get install -y sshpass openssh-client rsync
apt-get update && apt-get install -y sshpass openssh-client
elif command -v apk >/dev/null; then
apk add --no-cache sshpass openssh-client rsync
apk add --no-cache sshpass openssh-client
fi
- name: rsync 仓库到 132
- name: 传镜像包与 compose 到 132
env:
SSHPASS: ${{ secrets.DEPLOY_PASSWORD }}
run: |
H="${{ secrets.DEPLOY_HOST }}"
U="${{ secrets.DEPLOY_USER }}"
sshpass -e ssh -o StrictHostKeyChecking=no "$U@$H" "mkdir -p $REMOTE_DIR"
# 同步源码;排除本地产物与密钥(132 上的 .env 由你手工放置,绝不被覆盖/删除)。
sshpass -e rsync -az --delete \
--exclude '.git' \
--exclude 'node_modules' \
--exclude '**/node_modules' \
--exclude '**/dist' \
--exclude '.env' \
--exclude '**/.env' \
-e "ssh -o StrictHostKeyChecking=no" \
./ "$U@$H:$REMOTE_DIR/"
# 只送两样:镜像包 + compose 文件。132 上的 .env 由你手工预放,绝不覆盖。
sshpass -e ssh -o StrictHostKeyChecking=no "$U@$H" "mkdir -p $REMOTE_DIR/deploy/132-app"
sshpass -e scp -o StrictHostKeyChecking=no images.tar.gz "$U@$H:$REMOTE_DIR/"
sshpass -e scp -o StrictHostKeyChecking=no \
deploy/132-app/docker-compose.yml "$U@$H:$REMOTE_DIR/deploy/132-app/"
- name: 132 本地构建并起服务
- name: 132 加载镜像并起服务
env:
SSHPASS: ${{ secrets.DEPLOY_PASSWORD }}
run: |
H="${{ secrets.DEPLOY_HOST }}"
U="${{ secrets.DEPLOY_USER }}"
sshpass -e ssh -o StrictHostKeyChecking=no "$U@$H" "\
cd $REMOTE_DIR/deploy/132-app && \
docker compose up -d --build && \
cd $REMOTE_DIR && \
gunzip -c images.tar.gz | docker load && \
rm -f images.tar.gz && \
cd deploy/132-app && \
docker compose up -d --no-build && \
docker image prune -f"
- name: 健康检查(gateway :3000/healthz