From 65d52571de57246f4e651f1d35af27531bd5efb5 Mon Sep 17 00:00:00 2001 From: Zhengchen Tao Date: Sat, 2 May 2026 21:18:39 +0800 Subject: [PATCH] =?UTF-8?q?build/deploy=20workflow=20=E5=8A=A0=20concurren?= =?UTF-8?q?cy=20cancel-in-progress?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 并发组 = workflow name + ref。同分支连续 push 时: - 新 run 入组发现已有 in-progress run → 立即取消旧的,新的开跑 - 最终只构建 + 部署最新代码,省 CI 时间 - 不同分支的 build/deploy 互不干扰(虽然当前只 custom 用) - build 与 deploy 是两个独立 workflow name,互不影响(build 跑时 deploy 不会被取消,反之亦然) CLAUDE.md 同步加"并发取消策略"段说明该行为。 --- .gitea/workflows/build-image.yml | 8 ++++++++ .gitea/workflows/deploy.yml | 7 +++++++ CLAUDE.md | 6 ++++-- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/.gitea/workflows/build-image.yml b/.gitea/workflows/build-image.yml index 5b2bf7eb..b143aed1 100644 --- a/.gitea/workflows/build-image.yml +++ b/.gitea/workflows/build-image.yml @@ -26,6 +26,14 @@ on: required: false default: '' +# 并发控制:同一分支的连续 push 只跑最新的,旧 in-progress run 会被取消 +# 例:连续 3 次 push,第 1 次 build 跑了 30s,第 2 次开始 → 取消第 1,第 2 跑; +# 期间第 3 次又来 → 取消第 2,第 3 跑。最后只构建出最新代码,省 CI 时间。 +# group 包含 ref 是为了不同分支的 build 互不干扰(虽然当前只有 custom 用) +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: build: runs-on: ubuntu-latest diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 044b9c69..526085e3 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -9,6 +9,13 @@ on: # 手动触发:保留作为应急通道(重新部署当前镜像 / 跑临时脚本) workflow_dispatch: +# 并发控制:连续多次 build 完成时,最新那次的 deploy 会取消旧的 in-progress +# deploy。避免老镜像被 docker compose up -d 临时切换到、又立即被新镜像覆盖 +# 的窗口期,保证 ezbookkeeping 容器最终运行的是最新代码 +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: deploy: runs-on: ubuntu-latest diff --git a/CLAUDE.md b/CLAUDE.md index 376ad7f6..b165cf7b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -74,10 +74,12 @@ git.zhengchentao.win/dev/ezbookkeeping (origin,本地唯一 remote) 日常 feature commit 流程(全自动 CD): 1. 在 custom 上改代码 → commit → push -2. **自动触发 build**(除非只改了 `**.md` / `.gitengine` / `LICENSE` / `screenshot/**`) -3. build 成功 → **自动触发 deploy**(跑 repo Variables 里的 `CUSTOM_DEPLOY_SCRIPTS`) +2. **自动触发 build**(除非只改了 `**.md` / `.gitignore` / `LICENSE` / `screenshot/**`) +3. build 成功 → **自动触发 deploy**(内联在 deploy.yml 里:clone nas-infra → docker compose pull → up -d) 4. 整条 push → build → deploy 链路无人工介入 +**并发取消策略**:build-image.yml 与 deploy.yml 都设了 `concurrency.cancel-in-progress: true`,连续多次 push 时**只构建+部署最新那一次**,中间的 in-progress run 自动取消。例:连续 3 次 push 间隔 30 秒,第 1 次 build 跑到 30%、第 2 次到来取消它、第 3 次又取消第 2,最终只 build + deploy 第 3 次的代码。省 CI 时间又保证最终一致性。 + 如果想跳过 build/deploy(例如手动多次 push 调试),commit 时只改文档相关文件即可(落在 paths-ignore 范围内)。如果想强制重打某个旧 commit,去 Actions UI 手动触发 `Build Docker Image`,填要打包的 branch / tag。如果想只重新部署当前镜像(不重新 build),手动触发 `Deploy Docker Image` workflow。 **为什么 rebase 不 merge**:个人项目,无团队协作语义要保留,线性历史更清爽。