test(ci): 第1刀 可移植 SQL 扫描硬闸 + 五支柱 PR 自检模板
执行机制四道闸 → 闸4(CI 硬闸) + 评审兜底落地: - ci/scan-portable-sql.sh:扫 server Go 运行时查询禁用 MySQL 专属构造 (UTC_TIMESTAMP/UTC_DATE/NOW()/FIELD(/ON DUPLICATE KEY/IFNULL), 豁免方言层 dialect*.go / _test.go / 注释行;当前 152 文件 0 违规 - ci.yml:新增 portable-sql-scan job;push 触发路径补 server/** - .gitea/PULL_REQUEST_TEMPLATE.md:可测试性五支柱 + 测试 + 红线自检清单 - 守支柱 3(纯逻辑/IO 分离·双库可移植),见 docs/dev-conventions.html Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,23 @@
|
||||
## 改动说明
|
||||
|
||||
<!-- 一句话:这个 PR 做了什么、为什么。关联 issue/todo 写在这里。 -->
|
||||
|
||||
## 可测试性五支柱自检
|
||||
|
||||
<!-- 规范见 docs/dev-conventions.html。逐条勾选;不适用标 N/A 并一句话说明。 -->
|
||||
|
||||
- [ ] **支柱 1 · 接缝即接口**:新增的外部依赖(原生隧道 / HTTP / 子进程 / 存储 / 时钟 / 随机)藏在接口之后、可注入,未在业务层直接 `new` 或调静态单例
|
||||
- [ ] **支柱 2 · 契约单源**:跨边界数据(stats 字段 / HTTP JSON / proto / 设计 token)改动有单一来源,两端从它生成或校验(未两端各写)
|
||||
- [ ] **支柱 3 · 纯逻辑/IO 分离**:计算/状态机是纯函数;Go SQL 走 `dialect.*`、时间 Go 端算(可移植 SQL 扫描通过)
|
||||
- [ ] **支柱 4 · 错误是值**:错误带类型/码、可断言;无空 `catch` / 只打日志不返回
|
||||
- [ ] **支柱 5 · 可观测**:新增关键状态/事件有可程序读取的出口(stream / 结构化日志 / 接口)
|
||||
|
||||
## 测试
|
||||
|
||||
- [ ] 新增/改动逻辑有对应测试(L1 单元 / L2 集成·交互;数值型补 L1,真链路补 L4)
|
||||
- [ ] 本地通过:`flutter analyze && flutter test`(客户端) / `go test ./...`(服务端)
|
||||
- [ ] 涉及 UI:golden 基线已按需更新(`flutter test --update-goldens`)
|
||||
|
||||
## 红线
|
||||
|
||||
- [ ] 产品文案无红线词,用「加速 / 隐私保护 / 无日志」口径(脱敏扫描通过)
|
||||
+15
-1
@@ -1,6 +1,6 @@
|
||||
name: ci-pangolin
|
||||
|
||||
# 触发条件:deploy/ 或 design/ 或 client/ 或 ci/ 变更时,以及所有向 main 的 PR
|
||||
# 触发条件:deploy/ 或 design/ 或 client/ 或 server/ 或 ci/ 变更时,以及所有向 main 的 PR
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
@@ -8,6 +8,7 @@ on:
|
||||
- 'deploy/**'
|
||||
- 'design/**'
|
||||
- 'client/**'
|
||||
- 'server/**'
|
||||
- 'ci/**'
|
||||
- '.gitea/workflows/ci.yml'
|
||||
pull_request:
|
||||
@@ -77,3 +78,16 @@ jobs:
|
||||
-v "$PWD/client:/app" -w /app \
|
||||
ghcr.io/cirruslabs/flutter:stable \
|
||||
bash -c "flutter pub get && flutter analyze && flutter test test/unit test/widget"
|
||||
|
||||
# ── Job 5: Portable SQL Scan (支柱 3:双库可移植)─────────────────────────
|
||||
# server Go 运行时查询不得含 MySQL 专属构造(同一份 SQL 要跑 mysql 与 sqlite)。
|
||||
# 规则与豁免见 ci/scan-portable-sql.sh 头注 + docs/dev-conventions.html 支柱 3。
|
||||
portable-sql-scan:
|
||||
name: Portable SQL — 可移植性 (mysql/sqlite)
|
||||
runs-on: nas
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: scan server Go runtime SQL for MySQL-specific constructs
|
||||
run: bash ci/scan-portable-sql.sh
|
||||
|
||||
Reference in New Issue
Block a user