From 64cb7b62ef89cab97887c3d46be8e31e49c7b1bc Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Wed, 26 Aug 2026 08:38:47 -0600 Subject: [PATCH] =?UTF-8?q?ci(=E9=83=A8=E7=BD=B2):=20=E6=89=8B=E5=8A=A8?= =?UTF-8?q?=E8=A7=A6=E5=8F=91=E5=8F=AF=E6=94=BE=E8=A1=8C=E7=A0=B4=E5=9D=8F?= =?UTF-8?q?=E6=80=A7=E8=BF=81=E7=A7=BB=EF=BC=8Cpush=20=E8=A7=A6=E5=8F=91?= =?UTF-8?q?=E6=B0=B8=E8=BF=9C=E4=B8=8D=E6=94=BE=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit deploy.sh 现在会在起栈前跑迁移,但 CI 没法传 OJ2_ALLOW_DESTRUCTIVE, 于是任何破坏性迁移都会让自动部署一直红着,且没有出口。 给 workflow_dispatch 加一个 allow_destructive 布尔 input,经 env: 传到 ssh 命令里。push 触发拿不到 inputs,值恒为空 —— 也就是说**自动部署永远 不会执行 DROP TABLE 之类的迁移**,只会停在闸门上把工作流判红。这是有意的: 那种改动得有人先确认备份,不该由一次 git push 顺带完成。 日常的加索引 / 加列属于非破坏性,CI 部署会照常自动执行,无需干预。 留了一条注释标明必须用 `inputs.` 而不是 `github.event.inputs.`:后者会把 布尔字符串化,没勾选时拿到字符串 "false",那是非空字符串、在 `&&` 里为真, 等于每次手动部署都无条件放行。 验证:本机 YAML 解析通过,确认 inputs 定义挂在 workflow_dispatch 下。 表达式三种情况的语义(勾选 → '1'、未勾选 → ''、push 事件 inputs 为空 → '') 是 GitHub 表达式的既定行为,要真的 push 到 github 才跑得起来。 Co-Authored-By: Claude Opus 5 --- .github/workflows/deploy.yml | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 9ce3163..53628dd 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -21,7 +21,15 @@ on: push: branches: - main + # 手动触发时可以放行破坏性迁移。push 触发拿不到这个 input,值恒为空 —— + # 也就是说**自动部署永远不会执行 DROP TABLE 之类的迁移**,只会停在闸门上把 + # 工作流判红。这是有意的:那种改动得有人先确认备份。 workflow_dispatch: + inputs: + allow_destructive: + description: "放行破坏性迁移(DROP TABLE / DROP COLUMN / ALTER TYPE …)。勾之前先确认已备份数据库。" + type: boolean + default: false permissions: contents: read @@ -100,9 +108,20 @@ jobs: --exclude 'docker/.env*' \ ./ "root@${{ secrets.HOST }}:$REMOTE_DIR/" - # deploy.sh 自检不过 / 容器没起来 / 冒烟发现题目数是 0,都会非零退出, + # deploy.sh 自检不过 / 迁移被拦 / 容器没起来 / 冒烟发现题目数是 0,都会非零退出, # 这一步跟着红,日志里能看到具体是哪一条。 + # + # 迁移在 deploy.sh 里排在起栈之前:非破坏性的(加索引、加列)自动执行; + # 破坏性的会被拦下并退出 4,除非手动触发时勾了 allow_destructive。 + # 走 env: 传而不是把 ${{ }} 直接拼进命令串 —— 值虽然是 GitHub 约束过的布尔, + # 但拼字符串进 shell 的写法不该在这个仓库里留下先例。 + # + # ⚠️ 必须用 `inputs.`,**不能换成 `github.event.inputs.`**。后者把布尔 + # 字符串化,没勾选时拿到的是字符串 "false" —— 那是个非空字符串,在 + # `&&` 里为真,等于每次手动部署都无条件放行破坏性迁移。 - name: 起栈 + env: + ALLOW_DESTRUCTIVE: ${{ inputs.allow_destructive && '1' || '' }} run: | ssh -i ~/.ssh/id_deploy -p "$REMOTE_PORT" "root@${{ secrets.HOST }}" \ - "cd $REMOTE_DIR && docker/deploy.sh --prebuilt" + "cd $REMOTE_DIR && OJ2_ALLOW_DESTRUCTIVE='$ALLOW_DESTRUCTIVE' docker/deploy.sh --prebuilt"