修复bootstrap注册崩溃:StartWhenAvailable属任务设置而非触发器
现场:用户以管理员跑 -SetEnv -StartNow 时脚本抛 SetValueInvocationException(触发器上没有 StartWhenAvailable 属性), 而它是在"已注销旧任务、尚未注册新任务"之间抛的,等于把 runner 任务删没了。 - StartWhenAvailable 改设到 settings(MSFT_TaskSettings 继承属性, CIM 属性列表里看不见但可直接赋值,实测 StartWhenAvailable=True) - 任务对象改由 New-WatchdogTaskPlan 统一构建,先构建、后注销旧任务 - Register-ScheduledTask 失败时显式告警"旧任务已删、CI 裸奔"并 exit 1 - 新增 -DryRun:免管理员即可全量校验 action/trigger/settings - -Status 增补上次运行时间与返回码,并提示"非管理员看不见任务" 同时更正根因:旧计划任务其实一直存在(非管理员会话看不见,先前误判为 "从未注册"),但它跑的是单次 run_runner.cmd——daemon 属"正常退出"而非 "失败",计划任务的失败重启根本接不到,必须靠看门狗循环重拉。
This commit is contained in:
+28
-1
@@ -180,6 +180,14 @@ cache:
|
||||
> (16~20 = `cancelled`、21 = 长期 `queued`)——症状看起来是"任务凭空消失",而不是"任务失败",
|
||||
> 极难从 UI 反推根因。
|
||||
|
||||
> 🔴 **为什么"已经有计划任务"仍然会死**(2026-10-11 实测,别以为注册过就安全):
|
||||
> 旧任务跑的是 `run_runner.cmd`,里面是**单次** `gitea-runner.exe daemon ...`(无循环、无重启语义)。
|
||||
> 开机时 Gitea 往往还没起来 → daemon 首次 Declare 失败**立刻退出** → 任务"成功结束" →
|
||||
> **计划任务认为一切正常,永远不会再拉**。日志里 10-09 18:50 连续三次
|
||||
> `Starting runner daemon` + 三次 Declare 失败,就是三次"起了就死、死了没人管"。
|
||||
> 所以必须换成**看门狗**(等就绪 + 循环重拉),单靠计划任务的"失败重启"救不了
|
||||
> ——daemon 是"正常退出",不是"失败"。
|
||||
|
||||
**正确做法:一条命令装好"等 Gitea 就绪 + 崩溃自拉起 + 开机自启"**(管理员权限,仓库根目录):
|
||||
|
||||
```powershell
|
||||
@@ -194,13 +202,30 @@ powershell -ExecutionPolicy Bypass -File scripts\ci_runner_bootstrap.ps1 -SetEnv
|
||||
| ② 看门狗启动器 | 生成 `D:\Docker\act_runner\run_runner_watchdog.ps1`:先轮询 `<GiteaUrl>/api/v1/version` 直到 Gitea 应答,再起 `daemon`;daemon 退出 → 记日志 → 10s 后重拉,**永不放弃** |
|
||||
| ③ 计划任务 | `GiteaActionsRunner`:开机 +1 分钟触发、以 **SYSTEM** + 最高权限运行、**运行时限=不限**、失败每 1 分钟重启(×999)、不允许多实例 |
|
||||
|
||||
**先干跑,再真装**(不需要管理员,把 action/trigger/settings 全构建一遍并打印,什么都不写):
|
||||
|
||||
```powershell
|
||||
powershell -ExecutionPolicy Bypass -File scripts\ci_runner_bootstrap.ps1 -DryRun
|
||||
```
|
||||
|
||||
随时体检(只读,不改任何东西):
|
||||
|
||||
```powershell
|
||||
powershell -ExecutionPolicy Bypass -File scripts\ci_runner_bootstrap.ps1 -Status
|
||||
```
|
||||
|
||||
输出会告诉你:计划任务是否存在、daemon 是否在跑、Gitea 是否可达、三个机器级变量是否已设。
|
||||
输出会告诉你:计划任务是否存在(含上次运行时间与返回码)、daemon 是否在跑、Gitea 是否可达、
|
||||
三个机器级变量是否已设。
|
||||
|
||||
> ⚠️ **`-Status` 要用管理员跑**:非管理员会话**不一定看得见** `GiteaActionsRunner`
|
||||
> (本次排障就被这一点误导过一次,以为任务从未注册)。脚本在非管理员下会额外提示这一点。
|
||||
|
||||
> 🔴 **改这个脚本时守住两条**(都是踩出来的):
|
||||
> ① `StartWhenAvailable` 是**任务设置**属性(`MSFT_TaskSettings`,被 `MSFT_TaskSettings3` 继承),
|
||||
> **触发器上没有这个属性**——写 `$trigger.StartWhenAvailable` 会抛 `SetValueInvocationException`
|
||||
> 中断脚本(实测,且 CIM 属性列表里看不到它,只能直接赋值);
|
||||
> ② **必须"先构建全部对象、后注销旧任务"**——早期版本先 `Unregister` 再构建,一旦构建阶段抛异常,
|
||||
> 旧任务已被删、新任务没建成,CI 直接裸奔。
|
||||
|
||||
注册成功后,回到 **仓库 → Settings → Actions → Runners**,应看到 `win-stm32-ci`
|
||||
状态为 **Idle / 绿色**。
|
||||
@@ -443,6 +468,8 @@ github.com 会在 checkout 步骤卡住/失败。三种处置:
|
||||
|
||||
| 日期 | 变更 |
|
||||
|---|---|
|
||||
| 2026-10-11 | **bootstrap 自身修复**:`StartWhenAvailable` 误设到**触发器**上(该属性属**任务设置**,触发器没有)→ 脚本在"已注销旧任务、尚未注册新任务"之间抛 `SetValueInvocationException`,把 runner 任务删没了。现改为①先构建 action/trigger/settings、**后**注销旧任务,②`Register-ScheduledTask` 失败时显式告警"旧任务已删、CI 裸奔",③新增 **`-DryRun`**(免管理员即可全量校验任务对象),④`-Status` 在非管理员下额外提示"看不见任务 ≠ 任务不存在"。同时更正根因:旧任务其实存在,但跑的是**单次** `daemon`——daemon 属"正常退出"而非"失败",计划任务的失败重启**救不到**它,必须用看门狗循环重拉 |
|
||||
|---|---|
|
||||
| 2026-10-11 | **修"很多任务不执行"(runner 静默停摆)+ 补 gitlint 门禁**:① §2.4 重写——`gitea-runner` v4 的 `daemon` **无服务支持、首次 Declare 失败即退出进程**(日志实证),Gitea/机器重启一次 CI 就停摆,**run 16~21 共 12 个 job 零日志**(`cancelled`/`queued`,叠加 `cancel-in-progress` 后表现为"任务凭空消失"而非失败);新增 **`scripts/ci_runner_bootstrap.ps1`**(等 Gitea 就绪 + 崩溃自拉起的看门狗 + 开机计划任务 + `-SetEnv` 写机器级 `DTU_*` + `-Status` 只读体检)。② §3.1 重写——SYSTEM 可见性三重坑(PATH python 是 msys64 无 pre-commit / 用户级 site 对 SYSTEM 不可见 / `.venv` 已 gitignore)是 run 14~15 L0 全灭根因(`33a4aa4` 把候选收窄成这两个、又删了 cppcheck 目录兜底,而机器级 `DTU_*` 从未设置);探测收进 **`scripts/ci_find_python.ps1`**(两 job 共用、可离线自测、失败列出全部候选)并恢复机器级安装兜底。③ 新增 **gitlint 提交信息门禁**:钩子定义 **17** 个而 CI 只报 **16** 个,缺的正是声明 `stages: [commit-msg]` 的 gitlint(`--all-files` 跑不到,且表现为全绿 → 长期无人发现)→ **`scripts/ci_gitlint_range.ps1`** 逐条校验本次 push/PR 范围(消息文件须写在仓库内 + UTF-8 无 BOM)。④ `GITHUB_ENV/PATH/OUTPUT` 写入统一显式 `-Encoding ascii`(PS 5.1 `Out-File -Append` 默认 **UTF-16LE**,实测落盘 `42 00 42 00 42 00 3D 00 31 00`)。§5 清单 8→10 条、§6 排障表 +5 行、§7 维护项重写 |
|
||||
|---|---|
|
||||
| 2026-10-02 | **S3 + S14**:新增 §0.0「CI 不覆盖的体积门禁」醒目声明;新增 §4.4「产物存档与结果汇总」(零依赖 `Tee-Object` + `$GITHUB_STEP_SUMMARY` + `::notice::` 汇总行,不用 `actions/upload-artifact`;记录 `$ErrorActionPreference='Stop'` 与 `2>&1 \| Tee-Object` 的陷阱及处置)。§5 验证清单(7→8 条)与 §6 排障表同步更新 |
|
||||
|
||||
Reference in New Issue
Block a user