From 05b66399f9a7738584c4592613f98ea849135c1d Mon Sep 17 00:00:00 2001 From: Blizzard Date: Sat, 18 Jul 2026 15:17:50 +0800 Subject: [PATCH] =?UTF-8?q?ci(gitea):=20=E6=94=B9=E4=B8=BA=20runner=20?= =?UTF-8?q?=E6=9E=84=E5=BB=BA=E9=95=9C=E5=83=8F=20+=20save/scp=EF=BC=88?= =?UTF-8?q?=E7=85=A7=20sundynix-site=20=E6=A8=A1=E5=BC=8F=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 之前写成 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 --- .gitea/workflows/deploy.yml | 56 +++++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 21 deletions(-) diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 7a9d000..dc23599 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -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)