From bdc8e6d82aacf5c691f6a659acf2c4d14e01cc55 Mon Sep 17 00:00:00 2001 From: Blizzard Date: Fri, 17 Jul 2026 14:31:24 +0800 Subject: [PATCH] =?UTF-8?q?ci:=20=E6=94=B9=E4=B8=BA=E9=83=A8=E7=BD=B2?= =?UTF-8?q?=E6=9C=BA=E6=9E=84=E5=BB=BA=E6=96=B9=E6=A1=88=EF=BC=8C=E9=80=82?= =?UTF-8?q?=E9=85=8D=20docker=20=E6=A8=A1=E5=BC=8F=20runner?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - runner 不再 host 模式跑 docker build(原 host runner 缺 node/docker 无法执行) - 新流程:runner 打包源码 → scp 到 132 → 132 上 docker build + compose up - runner 只需 catthehacker 镜像(node/git/sshpass),docker 能力下沉到 132 - deploy/README 补 runner docker 模式部署命令(挂 sock + 持久化 /data) Co-Authored-By: Claude Opus 4.8 --- .gitea/workflows/deploy.yml | 47 ++++++++++++++++++------------------- deploy/README.md | 26 +++++++++++++++----- 2 files changed, 43 insertions(+), 30 deletions(-) diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index cb76319..bea7efc 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -7,7 +7,6 @@ on: workflow_dispatch: env: - IMAGE: sundynix-site:latest REMOTE_DIR: /home/workspace/sundynix-site jobs: @@ -17,21 +16,18 @@ jobs: - name: 检出代码 uses: actions/checkout@v4 - - name: 构建镜像 - run: docker build -t "$IMAGE" . - - - name: 导出镜像为压缩包 - run: docker save "$IMAGE" | gzip > image.tar.gz - - name: 安装 ssh 工具 run: | if command -v apt-get >/dev/null; then apt-get update && apt-get install -y sshpass openssh-client - elif command -v apk >/dev/null; then - apk add --no-cache sshpass openssh-client + else + apk add --no-cache sshpass openssh-client tar fi - - name: 传输镜像与 compose 到部署机 + - name: 打包源码 + run: tar czf /tmp/src.tar.gz --exclude=./.git --exclude=node_modules . + + - name: 传输源码到部署机 env: SSHPASS: ${{ secrets.DEPLOY_PASSWORD }} run: | @@ -39,20 +35,23 @@ jobs: U="${{ secrets.DEPLOY_USER }}" sshpass -e ssh -o StrictHostKeyChecking=no "$U@$H" "mkdir -p $REMOTE_DIR" sshpass -e scp -o StrictHostKeyChecking=no \ - image.tar.gz docker-compose.yml "$U@$H:$REMOTE_DIR/" + /tmp/src.tar.gz docker-compose.yml "$U@$H:$REMOTE_DIR/" - - name: 部署机加载镜像并重启 + - name: 部署机构建并重启 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 && \ - gunzip -c image.tar.gz | docker load && \ - rm -f image.tar.gz && \ - docker compose up -d && \ - docker image prune -f" + sshpass -e ssh -o StrictHostKeyChecking=no "$U@$H" ' + set -e + cd /home/workspace/sundynix-site + rm -rf build && mkdir build + tar xzf src.tar.gz -C build + docker build -t sundynix-site:latest build + docker compose up -d + rm -rf build src.tar.gz + docker image prune -f' - name: 健康检查 env: @@ -60,9 +59,9 @@ jobs: run: | H="${{ secrets.DEPLOY_HOST }}" U="${{ secrets.DEPLOY_USER }}" - sshpass -e ssh -o StrictHostKeyChecking=no "$U@$H" "\ - for i in \$(seq 1 15); do \ - wget -qO- http://127.0.0.1:8090/api/healthz && exit 0; \ - sleep 2; \ - done; \ - echo '健康检查失败'; docker logs --tail 50 sundynix-site; exit 1" + sshpass -e ssh -o StrictHostKeyChecking=no "$U@$H" ' + for i in $(seq 1 20); do + curl -sf http://127.0.0.1:8090/api/healthz && exit 0 + sleep 3 + done + echo "健康检查失败"; docker logs --tail 50 sundynix-site; exit 1' diff --git a/deploy/README.md b/deploy/README.md index 1fc4ec1..ea88882 100644 --- a/deploy/README.md +++ b/deploy/README.md @@ -6,11 +6,11 @@ push/merge main ─▶ Gitea(192.168.100.125:3000) │ 触发 .gitea/workflows/deploy.yml ▼ - act_runner(192.168.100.128) - │ docker build → save → scp + act_runner(192.168.100.128, docker 模式) + │ 打包源码 → scp ▼ 部署机(192.168.100.132) /home/workspace/sundynix-site - │ docker load → compose up → 容器 :8090 + │ docker build → compose up → 容器 :8090 │ │ 连 │ MySQL(192.168.100.127:3307) ▼ @@ -39,10 +39,24 @@ vi .env # 改 admin 密码、JWT 密钥 `.env` 关键项见 [.env.production.example](../.env.production.example)。数据库指向内网 `192.168.100.127:3307/sundynix_site`(库不存在会自动建表 + 种子)。 -### 3. act_runner 128 要求 +### 3. act_runner 128 要求(docker 模式,非 host) -- 能访问 docker daemon(`docker build/save` 可用) -- 能 ssh 到 132(workflow 用 sshpass 走密码) +runner 必须用 **docker 模式** + 挂 docker.sock + 持久化 /data,标签用带 node 的镜像: + +```bash +docker run -d --name act_runner --restart unless-stopped \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v /root/act_runner_data:/data \ + -e GITEA_INSTANCE_URL=http://192.168.100.125:3000 \ + -e GITEA_RUNNER_REGISTRATION_TOKEN=<在 gitea 运行器页创建新运行器获取> \ + -e GITEA_RUNNER_NAME=Auto-CICD \ + -e "GITEA_RUNNER_LABELS=ubuntu-latest:docker://catthehacker/ubuntu:act-22.04" \ + gitea/act_runner:0.6.1 +``` + +- job 在 catthehacker 镜像里跑(含 node/git/apt,checkout 与 sshpass 可用) +- 真正的 `docker build` 在 132 上执行,128 只需能 ssh 到 132 +- 部署机 132 需装 docker + compose 插件 ### 4. 公网服务器 nginx