diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index bad7f2e..653202e 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -151,9 +151,10 @@ test(pytest 数据层) → nas-deploy(推 NAS 后端+前端 dist+restart 容器) ``` nas-verify 全绿 = NAS test 已自动部署+验证通过。**VPS 不再自动推**(Gitea 无 environment approval gate;且要 NAS 验证通过才推 prod 的隔离)。 -**推 VPS prod(nas-verify 绿后,单独触发 vps-deploy.yml,两种方式)**: -- **人工**:Gitea → Actions → `vps-deploy.yml` → Run workflow,填 `sha`(nas-verify notice 输出的 commit) -- **agent**:调 dispatch API(basic auth,凭证走 Mac osxkeychain):`curl -u admin:*** -X POST http://192.168.2.154:3000/api/v1/repos/sanguo/sanguo_vnpy_v2/actions/workflows/vps-deploy.yml/dispatches -d '{"ref":"master","inputs":{"sha":""}}'` +**推 VPS prod(nas-verify 绿 + 用户确认,缺一不可;2026-08-14 起带口令闸门)**: +- **前置铁律**:agent dispatch 的前提 = nas-verify 绿 **+ 用户本人 NAS 验收通过** + 报「待推 VPS」清单(commit 号/内容)给用户,**用户在对话中原话说「推vps」**。不得代填/推断/沿用旧授权(2026-08-14 曾两次违规自行 dispatch,用户严肃指正)。 +- **人工**:Gitea → Actions → `vps-deploy.yml` → Run workflow,填 `sha`(nas-verify notice 输出的 commit)+ `confirm=推vps` +- **agent**(仅当用户原话说了「推vps」):调 dispatch API(basic auth,凭证走 Mac osxkeychain):`curl -u admin:*** -X POST http://192.168.2.154:3000/api/v1/repos/sanguo/sanguo_vnpy_v2/actions/workflows/vps-deploy.yml/dispatches -H 'Content-Type: application/json' -d '{"ref":"master","inputs":{"sha":"","confirm":"推vps"}}'`;口令不符 workflow 第一步直接 fail (⚠️ MCP 的 claude_dev token 对仓库无 write 权限,dispatch 会 403;agent 走 Mac git credential / basic auth) vps-deploy checkout 你传的 SHA(= NAS 验证过的 commit)→ `promote --target vps` → verify_unified_e2e。**严格版本一致**。 diff --git a/.gitea/workflows/vps-deploy.yml b/.gitea/workflows/vps-deploy.yml index 3fa8ba3..2deea0a 100644 --- a/.gitea/workflows/vps-deploy.yml +++ b/.gitea/workflows/vps-deploy.yml @@ -5,10 +5,10 @@ name: VPS Deploy # 严格版本一致: 接收 sha input, checkout 该 commit(= NAS 验证通过的那个), 部署到 VPS。 # 不会部署 nas-verify 未验证过的代码。 # -# 触发方式: -# 人工: Gitea → Actions → vps-deploy.yml → Run workflow → 填 sha(NAS 验证通过的 commit) -# agent: MCP dispatch_workflow workflow_id=vps-deploy.yml ref=master inputs={sha:} -# 或 curl POST /api/v1/repos/sanguo/sanguo_vnpy_v2/actions/workflows/vps-deploy.yml/dispatches +# 触发方式(2026-08-14 起带口令闸门,见 inputs.confirm): +# 人工: Gitea → Actions → vps-deploy.yml → Run workflow → 填 sha + confirm=推vps +# agent: 仅当用户在对话中原话说了「推vps」才可 dispatch,confirm 必须填 推vps; +# 口令不符第一步直接 fail。不得代填/推断/沿用旧授权。 on: workflow_dispatch: inputs: @@ -16,6 +16,10 @@ on: description: "NAS 验证通过的 commit SHA(完整 40 位, ci-cd 的 nas-verify 输出)" required: true type: string + confirm: + description: "部署确认口令: 只有用户在对话中说了「推vps」才可填(用户原话,agent 不得代填/推断)" + required: true + type: string jobs: vps: @@ -23,7 +27,15 @@ jobs: env: HOME: /Users/chufeng steps: - - name: checkout 指定 commit(= NAS 验证通过的版本) + - name: 口令闸门(用户没说「推vps」就不许部署) + run: | + if [ "${{ inputs.confirm }}" != "推vps" ]; then + echo "❌ 口令不符——部署未获用户确认,退出。" + exit 1 + fi + echo "✅ 口令确认,继续部署。" + + - name: checkout 指定 commit(= NAS 验证过的版本) env: TOKEN: ${{ github.token }} run: |