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:
+35
-21
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user