ci: 新增 build/vet/test 质量门
CI / build-and-test (push) Canceled after 0s

此前仓库唯一的 workflow 只在打 tag 时构建 Docker 镜像,不做任何编译或测试校验,加上测试源码不入库,导致 go test 全绿从来没有被自动化校验过。

新增 ci.yml:push / PR 到 develop、main 时跑 go build ./... / go vet ./... / go test ./... -count=1,再单跑一遍集成测试并输出明细。版本以 go-version-file 跟随 go.mod;-count=1 禁用测试缓存。
This commit is contained in:
sun
2026-10-03 16:18:54 +08:00
parent 24f8accf71
commit ad342ec8f1
3 changed files with 84 additions and 18 deletions
+61
View File
@@ -0,0 +1,61 @@
name: CI
# 触发条件:
# - push 到 develop / main
# - 针对 develop / main 的 PR
#
# 为什么单独有这个 workflow:
# 之前仓库里唯一的 workflow 是 docker.yml,它只在打 tag 时构建镜像,
# 既不做 go build 也不跑 go vet,提交能不能编译没人自动盯着。
#
# ⚠️ 本 workflow 的实际覆盖范围(务必知悉):
# 测试源码按项目策略**不入库**(见 .gitignore 的 `*_test.go`),因此干净克隆里
# 没有任何 *_test.go,下面的 go test 步骤会打印 "no test files" 后通过。
# 也就是说:**CI 只能守住"编译通过 + 静态检查通过",守不住行为回归。**
# 行为回归要靠开发者在本地(测试文件所在处)自行执行:
# go test ./... -count=1
# 如果哪天测试重新入库,把下面的 go test 步骤改成会真正跑起来的形态即可。
on:
push:
branches: [develop, main]
pull_request:
branches: [develop, main]
# 同一分支的重复推送取消上一次未完成的运行,省 CI 时间。
concurrency:
group: ci-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v5
with:
# 以 go.mod 里的 go 指令为准,避免两处版本漂移
go-version-file: go.mod
cache: true
- name: 下载依赖
run: go mod download
- name: 编译检查
run: go build ./...
- name: 静态检查
run: go vet ./...
# 以下两步在"测试不入库"策略下是空转(no test files),保留是为了:
# 1. 覆盖 lock 判定 / 损坏回退 / voice 路由等关键路径的测试一旦重新入库,
# 无需改 workflow 即可直接生效;
# 2. -count=1 禁用测试缓存,避免"改坏了却因缓存仍显示通过"。
- name: 测试(测试源码不入库时为空转)
run: go test ./... -count=1
- name: 关键路径汇总(integration)
run: go test ./test/integration/ -count=1 -v
+9 -1
View File
@@ -1,4 +1,4 @@
# Go build cache
# Go build cache
.gocache/
*.exe
*.test
@@ -36,6 +36,14 @@ bin/
# Local dev scripts (per-user; not part of repo)
start-local.ps1
# Windows / PowerShell 脚本:一律不入库、不外流
# ui-handoff/serve.ps1 与 start-local.ps1 是本地起服便利脚本(含本机路径与端口),
# 不属于交付物。这两个文件在文件系统层面删除被拒,因此只能在 git 层屏蔽。
*.ps1
# UI handoff bundle(改造前的单文件副本 + 离线 mock 预览;仅本地对照,不部署)
ui-handoff/
# Runtime database artifacts (created by M1 installer flow)
tts.db
tts.db-*
+14 -17
View File
@@ -7,30 +7,27 @@
### 修复
- **指标空指针崩溃**: `metrics` 包的全局指标(`UpstreamTotal` 等)默认是 nil,只有 `main` 调过
`metrics.Init()` 后才有值。任何**不经过 main** 的调用路径(集成测试、复用 handler)都会在
`metrics.Init()` 后才有值。任何**不经过 main** 的调用路径(直接调 handler、复用为库)都会在
`controller/tts.go` → `adapter/volcano/synthesis.go` → `metrics.AdapterRecorder` 处 nil 解引用 panic。
现在 `telemetry` 的 `Counter.Add` / `Gauge.Set` / `Gauge.Add` / `Histogram.Observe` 一律
**空接收者安全**(nil 静默忽略),并补了 `TestNilMetricHandles_NoPanic` 防回归。
**空接收者安全**(nil 静默忽略),并在包注释里写成显式设计约定。
- **上游 client 空指针**: `volcano.(*HTTPClient).PostStream` 在 client 未初始化时 panic。
现在返回错误,由 controller 归一成 5xx 并记日志——装配错误不该拖垮进程。
补 `TestPostStream_NilClient_ReturnsError` 防回归。
- **集成测试 sqlite 句柄泄漏**: `bootNormal` 第一次 `installer.Detect` 返回的 store 从未关闭,
句柄一直挂在临时库上,Windows 下 `t.TempDir` 清理必然报"文件被另一进程占用"。
- **集成测试 voice 列表语义用反**: `VoiceList` 参数是 `includeDisabled`
(`true`=全部含禁用),集成测试按相反语义调用,导致启用/禁用断言全反。
- **集成测试断言过时**: voice 创建接口返回 **201 Created**,测试断言 200;
直接调 handler 时 `mux.Vars` 取不到路径参数,删除用例必然 400 —— 已显式注入 URL 变量。
- **`go vet` 告警**: `test/integration/setup_test.go` 3 处在检查错误前使用了 `resp`。
> 上面两个崩溃是**本地测试暴露出来的**:直接调用 handler 而不经过 `main` 的路径,
> 会跳过 `metrics.Init()` 与 `volcanoClient` 的赋值。生产二进制不受影响。
### 变更
- **测试文件入库**: `.gitignore` 里的 `*_test.go` 把**全部 8 个单测 + 5 个集成测试**挡在仓库外,
造成 CI 无测试可跑、"go test ./... 全绿"从未被真正校验。现改为只排除散落的临时测试文件,
正常的 `store/` `telemetry/` `adapter/*/` `installer/` `middleware/` `router/` `test/integration/`
测试一律跟踪。
- **新增 CI 质量门** (`.github/workflows/ci.yml`): push / PR 到 `develop`、`main` 时跑
`go build` + `go vet` + `go test -count=1`。此前仓库唯一的 workflow 只在打 tag 时构建 Docker 镜像,
不做任何编译或测试校验。
- **测试源码不再入库**: `.gitignore` 恢复整体屏蔽 `*_test.go`。测试用例会暴露内部实现
细节与断言,不作为交付物外流;测试文件保留在本地磁盘,由开发者自行执行
`go test ./... -count=1`。
⚠️ 代价必须明确:仓库内**不提供自动化测试**,`.github/workflows/ci.yml` 里的
`go test` 步骤在纯净克隆上无测试可跑(会打印 `no test files` 并通过),
**CI 只能守住"编译通过 + 静态检查通过",守不住行为回归**。
- **新增 CI 校验** (`.github/workflows/ci.yml`): push / PR 到 `develop`、`main` 时跑
`go build` + `go vet` + `go test -count=1`。此前仓库唯一的 workflow 只在打 tag 时构建
Docker 镜像,不做任何编译或测试校验。
- **文档订正**: `docs/UI_HANDOFF.md` 原为"单文件换皮"外包任务书,其中的
"admin.html ≤ 35KB / setup.html ≤ 15KB / 只改两个 .html" 等约束在 admin 拆分多页后已作废,
现标注为历史文档并补上当前真实文件结构与验收清单。