Commit Graph

10 Commits

Author SHA1 Message Date
wandering1 038e2cfba3 合并后对齐钩子计数:master 已 18 个,并补记 stages 的真实来源
master 比本分支基线多一个 test-cppcheck 钩子,故"定义数 / CI 报告数"由 17/16
变为 18/17(实测本地跑 --all-files 得 17 条:passed=16 failed=1,那 1 个 failed
是本机 .map 陈旧导致的 mem-numbers,与门禁逻辑无关)。

同时更正一处机制性误述:stages:[commit-msg] 并不在项目配置里,它写在 gitlint
上游的 .pre-commit-hooks.yaml(本机可查证 ~\.cache\pre-commit\repo*\),所以在
.pre-commit-config.yaml 里 grep stages 一无所获、极易误判成"没有限制"。
受影响四处:AGENTS.md、ci.yml 头注释、测试开发标准流程 §9.1、CI配置指南 §6 与
变更记录,另 ci_local.py 文档串。
2026-10-12 13:09:19 +08:00
wandering1 20ee35b76a 修复CI门禁三因:runner掉线致12个job零日志、L0探测回归全灭、gitlint在CI从不执行
1) runner 掉线:run 16~21 共 12 个 job 零日志。gitea-runner v4 的
   daemon 无服务支持、首次 Declare 失败即退出进程,Gitea/机器重启
   一次 CI 就静默停摆;叠加 cancel-in-progress 后症状是"任务凭空
   消失"。新增 scripts/ci_runner_bootstrap.ps1:等 Gitea 就绪 +
   崩溃自拉起看门狗 + 开机计划任务 + -SetEnv 写 MACHINE 级 DTU_*。
2) L0 自 33a4aa4 起在 runner 上必挂:Python 候选被收窄成 PATH python
   (msys64,无 pre-commit) + 仓库 .venv(gitignore),cppcheck 目录兜底
   亦被删,而机器级 DTU_* 从未设置。探测收进 ci_find_python.ps1
   (两 job 共用、可离线自测、恢复机器级安装兜底)。
3) gitlint 声明 stages:[commit-msg],而 --all-files 只跑 pre-commit
   stage → 17 个钩子定义 CI 只报 16 个且全绿。新增
   ci_gitlint_range.ps1 逐条校验本次范围,ci_local.py 增 L0b 段。
另:GITHUB_ENV/PATH/OUTPUT 写入显式 -Encoding ascii(PS 5.1 的
   Out-File -Append 默认 UTF-16LE,会把带 NUL 的行追加进 UTF-8 文件)
2026-10-12 12:39:27 +08:00
wandering1 33a4aa4945 本地工具路径DTU_*环境变量改造落地:10处调用点去硬编码+变量优先解析,本机全链路验证通过,文档同步收口,requirements补pre-commit 2026-10-02 22:14:49 +08:00
wandering1 f3befaed08 CI:补产物存档与结果汇总,明示体积门禁盲区(S3+S14)
CI / L0 静态门禁 (pre-commit) (push) Successful in 58s
CI / L0.5 主机侧单测 (MSVC) (push) Successful in 19s
2026-10-02 11:55:31 +08:00
wandering1 df9a566982 CI:诊断 pre-commit 仅装于用户态导致 SYSTEM 不可见
CI / L0 静态门禁 (pre-commit) (push) Failing after 17s
CI / L0.5 主机侧单测 (MSVC) (push) Successful in 17s
第五次运行(run#5)L0 仍失败,但错误信息已指向真因:
自检步骤 3 个候选解释器(msys64 / .venv / anaconda3)全部探测失败。

根因(已实测定位):本机 pre-commit 装在
  C:\Users\Administrator\AppData\Roaming\Python\Python312\site-packages
即 Administrator 的【用户态 user-site】。runner 以 SYSTEM 运行,其
%APPDATA% = C:\Windows\system32\config\systemprofile\AppData\Roaming,
根本看不到该目录 → 换任何 python.exe 路径都无效。
(已盘点本机全部 python:anaconda3 3.12.4 / workbuddy 3.13.12 /
 msys64 3.14.5,以 -s 禁用 user-site 后 pre-commit 均为 rc=1。)

本次改动(workflow 侧,配合外部的全局安装):
- 探测改用 `& $py -s -m pre_commit --version`(-s 禁用 user-site),
  只有 SYSTEM 真能用的解释器才被选中
- 后续 install / run 同步加 -s,保持判定一致
- 失败信息明确指向 user-site 不可见 + 给出修复脚本路径
  (install_precommit_global.ps1,装到 anaconda3 全局 site-packages)

真正的修复需管理员执行该脚本(本会话无提权权限,pip --no-user
报 WinError 5 拒绝访问)。装好后 L0 即可通过。
2026-10-02 01:29:55 +08:00
wandering1 48b33921c0 CI:修正 python 探测被 NativeCommandError 中断
CI / L0 静态门禁 (pre-commit) (push) Failing after 17s
CI / L0.5 主机侧单测 (MSVC) (push) Successful in 16s
第四次运行(run#4)L0.5 已 PASS(status=1,MSVC 探测 + 39 单测全过),
L0 仍失败于自检步骤自身的一个 PS 5.1 行为:

  & $c -m pre_commit --version *> $null
  → NativeCommandError,脚本中止

根因:$ErrorActionPreference='Stop' 下,原生命令写 stderr 会被 PS5.1
当成终止性错误(NativeCommandError),即使 *> $null 重定向也无法阻止;
于是第一个候选(msys64 python,无 pre-commit)就把整个 for 循环打断,
根本轮不到 anaconda3。

处置:探测每个候选时临时把 $ErrorActionPreference 降为 'Continue',
用 2>&1 | Out-Null 吞掉输出并取 $LASTEXITCODE,循环后恢复 'Stop'。
已在 WinPS 5.1 本地实测该探测逻辑:
  msys64 rc=1 → .venv rc=1 → anaconda3 rc=0 选中,STEP OK。
2026-10-02 01:24:50 +08:00
wandering1 8e7b22184e CI:按 SYSTEM 账户视角修正 Python / cppcheck 探测
CI / L0 静态门禁 (pre-commit) (push) Failing after 16s
CI / L0.5 主机侧单测 (MSVC) (push) Successful in 16s
第三次运行(run#3)已越过 PS 语法问题,环境自检真正执行,
暴露 runner 真实环境缺陷:

1. cppcheck 只在【用户级 PATH】,SYSTEM 账户看不到 →
   报 runner missing cppcheck。已在自检步骤加回落到
   C:\Program Files\Cppcheck 并写入 GITHUB_PATH。

2. 更隐蔽:SYSTEM 的 python 解析到 C:\msys64\ucrt64\bin\python.exe
   (3.14.5),而该解释器【没有 pre-commit】(AGENTS.md 亦明令
   不得用它跑依赖第三方库的脚本)。若不修,自检通过后 L0 会在
   pre-commit 步骤炸。
   处置:在自检步骤按 scripts/ci_local.py 同一探测序
   (PATH python -> .venv -> anaconda3)挑出真正装了 pre-commit
   的解释器,导出 PYTHON 环境变量供后续步骤使用。
   L0.5 是独立 job(GITHUB_ENV 不跨 job),同法就地选一个可用
   python(主机侧单测为纯标准库,任意 python3 均可,已用 msys64
   python 实测 39/39 PASS)。

附带:run 块保持纯 ASCII(上次修正),全部 shell=powershell。
2026-10-02 01:21:10 +08:00
wandering1 e241fea801 CI:run 脚本改纯 ASCII(PS5.1 按 GBK 解码临时 ps1)
CI / L0 静态门禁 (pre-commit) (push) Failing after 17s
CI / L0.5 主机侧单测 (MSVC) (push) Successful in 16s
第二次 CI 运行(run#2)仍失败,但失败点前移:
  pwsh 问题已修(环境自检步骤确实由 Windows PowerShell 5.1 执行)
  新错误:TerminatorExpectedAtEndOfString @ 含中文那一行
根因:runner 把每个 run: 块写入临时 .ps1(无 BOM)交 PS5.1 执行,
      PS5.1 按 GBK/CP936 解码 → UTF-8 中文字节与相邻引号错位 →
      字符串缺少终止符(报错行号即含中文行,极易误判)。
与 AGENTS.md「字符串字面量必须纯 ASCII」同源。

处置:所有 run: 块内改为纯 ASCII(提示语改英文),中文仅保留在
YAML 的 name:/注释(Gitea 按 UTF-8 读、不喂 PowerShell,安全)。
workflow 头部补该坑说明。已用脚本核验 run: 块内零非 ASCII。
2026-10-02 01:17:24 +08:00
wandering1 09e45573c8 CI:修正 workflow 的 shell 为 powershell(pwsh 不存在)
CI / L0 静态门禁 (pre-commit) (push) Failing after 17s
CI / L0.5 主机侧单测 (MSVC) (push) Failing after 16s
首次 CI 运行(run#1)两个 job 均失败于同一处:
  Cannot find: pwsh in PATH
根因:workflow 用 shell: pwsh(PowerShell 7,非 Windows 自带),
而 runner 所在机器只有 Windows PowerShell 5.1。

改为 shell: powershell(7 处)。已核验脚本无 PS7 独有语法
(无 ?? / ?: / && / || / -Parallel),PS 5.1 完全兼容。
workflow 头部补该坑说明,防止将来误改回 pwsh。

注:本次 CI 已验证 actions/checkout@v4 可从本实例正常拉取并
成功检出 v2-on-ui,action 拉取链路无需调整。
2026-10-02 01:11:45 +08:00
wandering1 e90486524d CI:Gitea Actions 落地 L0+L0.5(补 T-6)
新增 .gitea/workflows/ci.yml:push/PR 触发两个 Windows job——
l0-gates 跑 pre-commit --all-files(无 Keil .map 时自适应跳过 mem-numbers),
l05-host-unit-tests 遍历 test/host/**/run_unit_test.py(缺 MSVC 则告警降级跳过)。
刻意不跑 @build(需 Keil 授权);L1/L2/L3 需真机+ST-LINK,不上 CI。

新增 scripts/ci_local.py:本地跑与 CI 等价的门禁(自动选用装了 pre-commit
的解释器;.map 自适应;退出码 0/1/2 与 CI 对齐),供提交前自查与 runner 就绪前过渡。

文档同步:测试开发标准流程 §9(CI 章节)/§1/§4.1、待处理内容 T-6 销项、
项目部署环境要求 §2.11(runner 前置)、pre-commit 使用说明 §1、scripts/README.md、AGENTS.md。

验证:scripts/ci_local.py rc=0(L0 14 钩子全过 + L0.5 39/39)。
2026-10-01 10:19:38 +08:00