76611a2f65039c6da174e89ae35df07100f7a804(base,v1.0.106 tag) → abe48b17b7acb5b7030bb21607ef4ca46a2a80f8(head,v1.0.107)v1.0.107| 文件 | 类型 | 摘要 |
|---|---|---|
.gitea/workflows/build.yml | CI 工作流 | 3 job → 2 job(build-check/docker 合并为单 job build-push;deploy 依赖它);新增宿主编译步骤;docker build 改 docker buildx build + 本地缓存 + push 重试;deploy 改为轮询确认镜像切换 + 版本探活 |
Dockerfile | 镜像定义 | 删除 stage-1 builder 段(容器内编译废弃);COPY --from=builder → 直接 COPY 宿主编译产物;新增注释说明版本注入改由 CI -ldflags 完成 |
AGENTS.md | 文档 | 追加 v1.0.106 上线记录(A 方案发版经过:tag 路失败 → 手动构建上路) |
docs/变更审计日志-2026-09.md | 文档 | 追加 A-34 审计条目(v1.0.106 发版实测证据链) |
结论:这是一次基础设施改动,逻辑上等价于“把镜像内的 Go 编译挪到 CI runner 上执行”,运行镜像内容(二进制)不变。
codescan.issues_diff(base → head):修复 0 条 / 新增 0 条(两版本质量无差异)。codescan.quality_list(head):共 777 条既有问题,全部集中在 browserworker/*.mjs 脚本(高耦合 / 圈复杂度 / 嵌套深度 / 行长 / 重复块等),与本次改动无关,本次未新增也未修复。注:本次改动落在 YAML / Dockerfile / Markdown,不属于代码质量引擎的静态分析面,因此新增问题为 0 属预期。
.gitea/workflows/build.ymlbuild-check(go test/build)与 docker(build+push)各 checkout/装依赖一次,编译跑 2 遍;现合并为 build-push,注释给出实测收益(2:39 → 3:56~5:14 的反向论证,说明“拆两 job 反而更慢”)——设计合理。Build release binaries (host):在 runner 上执行 5 条 CGO_ENABLED=0 GOOS=linux go build -trimpath -ldflags="-s -w ...",产出 server/importharvest/coalbackfill/metricimport/healthcheck 到仓库根,再交给 Dockerfile COPY。版本注入 -X main.BuildVersion=${{ gitea.ref_name }} … 与代码一致(已核 main.go 声明了 BuildVersion/BuildTime/GitCommit 三个符号,见下)。docker buildx build --cache-from/--cache-to type=local + push 3 次重试:失败会打印完整 build log 并 exit $RC,不再假绿。upgrade 后轮询 containers/search(18×5s=90s)直到容器 running 且 imageName 命中本次镜像,修复了“发完请求就算成功”的假绿;末段探活校验 version 与 tag 一致。go vet、go build ./...、go mod download、-race 独立步——前两者并入 Quality gate (vet + test), 仍在 test 中保留。DockerfileFROM golang:1.25-alpine AS builder 整段与 --build-arg BUILD_VERSION/BUILD_TIME/GIT_COMMIT,直接 COPY server ./server 等 5 个宿主产物。mcr.microsoft.com/playwright:v1.62.1-noble 保留;entrypoint.sh、HEALTHCHECK /api/v1/health、/app/data 挂载点均未变。main.go 声明 var (BuildVersion = "dev"; BuildTime; GitCommit) 并 buildinfo.Set(...),buildinfo.Info() 输出键为 version;/api/v1/health 经 HealthCheck 把 buildinfo.Info() 合并进 Data → 响应为 {success, message, data:{status,version,...}}。data = d.get('data') if isinstance(d.get('data'),dict) else d; ver = data.get('version') or data.get('build_version') → 能正确取到 version,tag 匹配校验成立。✅严重度为本报告的人工判定,非引擎评级。
AGENTS.md / 审计 A-34 明确记录 —— tag v1.0.106 的 CI run 1351 失败在 脚本语法(bash -n / node --check) 步,归因于 3 个 Linux 环境特有的历史遗留失败(credentials.test.mjs 9 通过/1 失败、ui-harvest.test.mjs ERR_MODULE_NOT_FOUND、trusted-browser.test.sh 6 通过/3 失败),并与 v1.0.100(run 1184)同点失败互证。credentials.test.mjs / ui-harvest.test.mjs / trusted-browser.test.sh)。只要 runner 上有 node(cxy-ubuntu 有),这 3 个失败会让整个 job 在“质量门之前的脚本语法步”即失败 → 镜像不构建 → deploy 被 skip。Dockerfile 依赖构建上下文里已存在的根目录二进制,且不再消费 --build-arg。而 AGENTS.md/审计 A-34 记录的手动发版命令仍是 docker build --build-arg BUILD_VERSION=... -t … . —— 该命令现在会以 COPY failed: file not found: server(--build-arg 被静默忽略)失败。docs/CI_CD_SETUP.md 未在本次同步:§1 仍描述旧的三 job 结构(go test && go build、Docker Build & Push、go build ./...),§2 仍写“三 job 全绿 = 升级完成”“curl -f”,与 head 的 2 job(build-push + deploy)、curl -s+JSON code 校验、以及“宿主编译”形态均不符。docs/CI_CD_SETUP.md(§1/§2/§6)与 AGENTS/审计中的手动构建命令(补一步宿主编译或改走 docker buildx build 且先产出二进制),避免下一位维护者照旧文档操作即翻车。docker buildx build … -t "$IMAGE:$TAG" . 未带 --load(也未 --push)。若 runner 的 buildx 默认 builder 是 docker-container 驱动,镜像只进 BuildKit 缓存、不在本地 docker images,随后的 docker tag / docker push 会以 “No such image” 失败。--cache-to type=local,dest=… 的可用性依驱动而定;一旦 cache 导出报错,该错误未被容错包裹(set +e 只对 push 重试生效,但 build 命令本身 RC=${PIPESTATUS[0]} 会非零)→ 直接判定构建失败。docker(默认会 load),或显式加 --load;对 --cache-to 的兼容性做一次真机验证。actions/cache 步骤安排在 Build & Push 之前:若该 action 在步骤内(而非 post-job)保存,则 build 步骤写入 /tmp/docker-cache 的新缓存永远不会被保存(每次回到同一初始缓存)。hashFiles('Dockerfile','go.sum'),但新形态下 Go 编译已移到宿主,docker 层不再依赖 go.sum,该键维度意义不大。COPY server(含构建时间注入的字节会变)使最后一层每次必然失效,buildx 本地缓存收益有限。actions/cache 的保存时机;缓存键可简化为仅 Dockerfile(或去掉)。.dockerignore 未排除这些文件名(已核,符合 COPY 需要);但副作用是:若本地存在陈旧/异架构的 server 等产物,会被原样打进镜像。CI 为干净 checkout,无此问题。main.go 顶部仍写“由 Dockerfile 的 -X … 注入”、buildinfo 注释同;AGENTS.md v1.0.106 条目仍说“Dockerfile 一直在传 -X”。如今版本注入已迁至 CI go build -ldflags,建议顺手更新。curl -f 改为 curl -s + JSON code 解析:功能等价(HTTP 错误/非 JSON 体由 || {…; exit 1;} 兜住),仅属行为微调,无明显缺陷。main.BuildVersion ↔ buildinfo.Info().version ↔ /health ↔ CI 探活)已核验自洽。docs/CI_CD_SETUP.md 均未同步,照旧文档操作会直接失败。脚本语法 步是否通过;② 在本机确认 docker buildx 默认驱动能 load 镜像且 type=local 缓存可用;③ 同步 docs/CI_CD_SETUP.md。-race