Просмотр исходного кода

docs(ci): 新增 CI 编译闸门待办(方案 B 远端 CI + A 本地 hook,仅 iwintrue/local 编译)+ 任务池 OPS-CI-GATE

Agnes Agent 2 недель назад
Родитель
Сommit
1751bb05e3
2 измененных файлов с 51 добавлено и 0 удалено
  1. 40 0
      docs/2026-10-29-CI编译闸门待办.md
  2. 11 0
      tools/xaf_agent_hub/tasks_backlog.json

+ 40 - 0
docs/2026-10-29-CI编译闸门待办.md

@@ -0,0 +1,40 @@
+# 待办:CI 编译闸门(防红构建进入 cfclub 主线)
+
+> 起草:2026-10-29|选定方案:**B 远端 CI 检查**(互补 A 本地 hook)|编译范围:**仅 iwintrue(远端)与 local(本机)**
+> 来源:T29-B2 合入排查发现 `ee71f7716` 红构建未被拦截即 push 至 `origin/cfclub`
+> 状态:已记入任务池 `OPS-CI-GATE`(pending)|文档随本次提交进入 `origin/cfclub`
+
+## 一、问题背景
+
+- `ee71f7716`(后台 Dashboard 重设计)推送至 `origin/cfclub` 时,`StatsController.java` 含 **4 处 lambda 捕获非 effectively-final 局部变量**的编译错误(`hotArticleList`/`articleDwellList`/`userDwellList`/`productDwellList` 在 `forEach` lambda 内被 `add` 捕获,随后又用 `.subList(0,10)` 重新赋值),任何 JDK 版本均编译失败。
+- 该提交**未经编译即 push**,CI / 流程均未拦截,导致 `origin/cfclub` 在约 4 小时内处于**不可编译**状态,阻断了所有基于主线的构建、部署与后续合入(含 T29-B2)。
+- 根因:缺少"代码进入长期分支前必须通过编译"的强制闸门。
+- 已临时修复:分支 `fix/statscontroller-effectively-final`(提交 `66e9cc2ba`,已并入 `origin/cfclub` @ `60e526602`)。
+
+## 二、选定方案
+
+- **B 远端 CI 检查(主闸门,已选)**:push / PR 触发 `mvn compile` + 单测,红灯禁止合并 / 禁止 fast-forward 到受保护分支。
+- **A 本地 pre-push hook(互补,建议保留)**:`git push` 前自动跑 `mvn -q -DskipTests compile`,红构建根本出不了本机;走 repo 级 `githooks/` + `core.hooksPath githooks`,免每人手动装。
+- **C 分支保护**:`cfclub`(及主要长期分支)设为受保护分支,仅允许经绿灯(A/B)的合并进入;禁止直接 push 红构建。
+
+**编译执行范围(明确约束)**:编译闸门**仅在 `iwintrue`(远端 CI 环境)与 `local`(开发者本机)上执行**,不在其他环境运行。
+
+## 三、验收标准
+
+1. 任一分支在 push / merge 到 `cfclub` 前,`mvn compile`(及前端构建)必须 **0 error**。
+2. 红构建**无法进入** `cfclub`——本地 hook 拦截,或远端 CI 红灯拦截。
+3. 开发者在 `git push` 前能于本机获得明确编译结果,平均自检耗时 < 1 分钟。
+4. 闸门本身不显著拖慢正常 push(建议仅编译、跳过测试;测试交给 CI)。
+
+## 四、落地步骤草案(方案 B 先行,A 互补)
+
+1. **B(远端 CI)**:在 `git.iwintrue.com` 的 CI runner / webhook 上接编译+单测任务,针对 `cfclub` 的 push/PR 触发;红灯禁止合入。
+2. **A(本地 hook)**:编写 `githooks/pre-push`,检测待 push 的 ref 是否涉及 `cfc-backend` 改动,若是则跑 `mvn -q -DskipTests compile`,失败退出 1;仓库根加说明(README / AGENTS.md 一节)启用方式 `git config core.hooksPath githooks`。
+3. **C(分支保护)**:`cfclub` 设为受保护分支。
+4. 验证:人为制造一处编译错误,确认 push 被拒;修复后 push 通过。
+
+## 五、关联记录
+
+- 修复提交:`fix/statscontroller-effectively-final`(`66e9cc2ba`,已并入 `origin/cfclub` @ `60e526602`)
+- 排查日志:`.workbuddy/memory/2026-10-28.md`(18:43 / 22:42 / 00:02 三段)
+- 任务池条目:`OPS-CI-GATE`(pending)

+ 11 - 0
tools/xaf_agent_hub/tasks_backlog.json

@@ -742,5 +742,16 @@
     "dispatched_to": "local-45278",
     "model": "axonhub/deepseek",
     "note": " [2026-10-28 同步保留:本机已拆分为 T19-A,T19-B,T19-C]"
+  },
+  {
+    "id": "OPS-CI-GATE",
+    "title": "CI 编译闸门:防红构建进入 cfclub 主线(方案 B 远端 CI + A 本地 hook,仅 iwintrue/local 编译)",
+    "priority": "P1",
+    "module": "infra",
+    "instance": "",
+    "status": "pending",
+    "spec": "docs/2026-10-29-CI编译闸门待办.md",
+    "prompt": "在 cfclub 主线落地「推送前/CI 编译闸门」,防止红构建(如 ee71f7716 的 StatsController lambda 捕获非 effectively-final 错误)未经编译即进入 origin/cfclub。背景:2026-10-28 T29-B2 合入排查发现 ee71f7716 红构建未被拦截即 push,导致主线约 4 小时不可编译、阻断合入。选定方案:B 远端 CI 检查(主闸门,在 git.iwintrue.com 的 CI runner/webhook 上对 cfclub 的 push/PR 触发 mvn compile + 单测,红灯禁合入)+ 互补 A 本地 pre-push hook(githooks/pre-push 检测 cfc-backend 改动并跑 mvn -DskipTests compile,失败退出 1;启用 git config core.hooksPath githooks)+ C 分支保护(cfclub 设受保护分支)。明确约束:编译闸门仅在 iwintrue(远端 CI)与 local(开发者本机)上执行,不在其他环境运行。验收:cfclub 合入前 mvn compile 0 error;红构建无法进入 cfclub;本机自检 < 1 分钟。详见 docs/2026-10-29-CI编译闸门待办.md。",
+    "note": "2026-10-29 由 T29-B2 合入复盘提出;根因样例 ee71f7716(已临时修复 66e9cc2ba 并入 60e526602)。"
   }
 ]