diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 94a2df11..044b9c69 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -2,7 +2,6 @@ name: Deploy Docker Image on: # 自动触发:build-image workflow 成功完成后跑 - # workflow_run 是 cross-workflow 依赖:build 成功 → deploy 自动跟上 workflow_run: workflows: ["Build Docker Image"] types: [completed] @@ -14,19 +13,41 @@ jobs: deploy: runs-on: ubuntu-latest # 只在 build 成功后跑;手动触发时 workflow_run 字段不存在, - # || true 保证手动跑也能继续 + # 第一个条件保证手动跑也能继续 if: ${{ github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success' }} steps: - - name: Execute custom script - # 用 > 覆盖而不是 >> 追加,避免历史脚本累积 + - name: Pull and restart ezbookkeeping + # 部署逻辑直接内联在这。runner 容器挂了 host docker.sock, + # 所以这里 docker 命令直接操作的是宿主机 docker daemon, + # 容器层面相当于 "ssh 到 NAS 跑 docker compose"。 + # + # NAS_INFRA_TOKEN secret 仅在 nas-infra 是私有仓库时需要; + # 公开仓库不设这个 secret 也能拉。 + env: + NAS_INFRA_TOKEN: ${{ secrets.NAS_INFRA_TOKEN }} run: | - cat > deploy.sh <<'EOF' - #!/bin/sh set -e - ${{ vars.CUSTOM_DEPLOY_SCRIPTS }} - EOF - chmod +x deploy.sh - ./deploy.sh + + TMPDIR=$(mktemp -d) + trap 'rm -rf "$TMPDIR"' EXIT + + # 决定 clone URL:有 token 用 token(私有),没有用裸 URL(公开) + if [ -n "$NAS_INFRA_TOKEN" ]; then + CLONE_URL="https://x-access-token:${NAS_INFRA_TOKEN}@git.zhengchentao.win/dev/nas-infra.git" + else + CLONE_URL="https://git.zhengchentao.win/dev/nas-infra.git" + fi + + git clone --depth 1 "$CLONE_URL" "$TMPDIR/nas-infra" + cd "$TMPDIR/nas-infra/ezbookkeeping" + + docker compose pull + docker compose up -d + + # 简单 health:列容器状态 + 输出最近日志 + sleep 3 + docker compose ps + docker compose logs --tail=30 ezbookkeeping - name: Deploy summary if: always() diff --git a/CLAUDE.md b/CLAUDE.md index 31684630..376ad7f6 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -57,7 +57,7 @@ git.zhengchentao.win/dev/ezbookkeeping (origin,本地唯一 remote) |---|---|---|---| | `sync-upstream.yml` | 手动(`workflow_dispatch`,可填 tag) | 服务端把 `dev/main` 强制 reset 到 mirror 上的指定 release tag(默认最新),然后 `push --force-with-lease` + 推 tags | ✅ 在用 | | `build-image.yml` | **自动**(push 到 custom 触发,`paths-ignore` 屏蔽 `**.md` / `.gitignore` / `LICENSE` / `screenshot/**`)+ 手动备选 | checkout 触发分支(push 时即 custom;手动时用 `inputs.branch` 默认 custom)→ 装 buildkit v0.13.2(钉版本)→ 登录 Gitea registry → 构建镜像(带 OCI 标签 source/revision,Gitea 自动关联包到 repo)→ push 到 `git.zhengchentao.win/dev/ezbookkeeping:` 与 `:latest`,`build-args: BUILD_PIPELINE=1` 跳过活 API 测试 | ✅ 在用,是日常发布通道 | -| `deploy.yml` | **自动**(`workflow_run` 在 build-image 成功后跑)+ 手动备选 | 跑 repo Variables 里 `CUSTOM_DEPLOY_SCRIPTS` 这条自定义脚本,含 `set -e` 失败即停 | ✅ 自动 CD,需要先在 Gitea repo 设置 → Actions → Variables 里配 `CUSTOM_DEPLOY_SCRIPTS` 才有实际效果 | +| `deploy.yml` | **自动**(`workflow_run` 在 build-image 成功后跑)+ 手动备选 | clone nas-infra → `docker compose pull && up -d` 重启 ezbookkeeping。脚本内联在 yml 里(早期版本走 `vars.CUSTOM_DEPLOY_SCRIPTS` 是过度设计,2026-05-02 移除)。私有 nas-infra 需要 `secrets.NAS_INFRA_TOKEN`,公开仓库不需要 | ✅ 自动 CD | **已删**:`docker-snapshot.yml`(push main 自动触发,未配 secrets.DOCKER_REPO 永远失败)、`docker-release.yml`(push tag 同样问题)。需要时再从 git 历史 cherry-pick 回来。