ci(m266): 按塔判决把 cron 挪到本地凌晨 03:17(cron 是 UTC,写 17 19 * * *),补默认分支边界与证据强度
- cron 从 '17 3 * * *' 改成 '17 19 * * *'(17:19 UTC = 本地 UTC+8 的 03:17), 文件头写死「本地每天 03:17」,不留让读者自己换算的口子 - 文件头第 ① 条写严厉:schedule 只对默认分支生效、跑的是 main 末梢,dev 未合入的内容不在这一轮; 「dev 已经有人天天看着了」是错的(全量矩阵在 dev 上一次都没跑过) - 新增第 ④ 条:定时必须与 push main 分列 concurrency 组,因为取消不是红, 被静默取消的夜间入口会让「昨晚没报错」变成一句假话 - concurrency 注释里把结论降级为「GitHub 文档语义,未在真实 runner 上构造并发验证」 - docs/backend-cjk-evidence-matrix.md:三处 文件:行号 锚点改成作业名 + 步骤名(行号必再腐), 并加一条「锚点不用行号」的说明防复发
This commit is contained in:
1 parent
86746153f9
commit
55f0e9bbf1
2 files changed
+23
-12
No files matched your search
@@ -22,27 +22,32 @@ name: CI
|
|||||||
# 这是**故意的取舍**:抓得住「平台回归 T+1 就能看见」,抓不住「当天的错当天见」。dev 线的快守门
|
# 这是**故意的取舍**:抓得住「平台回归 T+1 就能看见」,抓不住「当天的错当天见」。dev 线的快守门
|
||||||
# (fmt / clippy / guards / gpu 自测)在 dev-guards.yml,那边刻意不上全量 test / build,理由见其头部。
|
# (fmt / clippy / guards / gpu 自测)在 dev-guards.yml,那边刻意不上全量 test / build,理由见其头部。
|
||||||
#
|
#
|
||||||
# schedule 的三条语义边界(省得下次重新查):
|
# schedule 的四条语义边界(省得下次重新查):
|
||||||
# ① 定时只在**默认分支**上生效:cron 跑的是 main 的末梢,dev 上尚未合入的提交不进这一轮
|
# ① 定时只在**默认分支**上生效:cron 跑的是 **main 的末梢**,dev 上尚未合入的内容**不在这一轮里**。
|
||||||
# (这是设计,不是遗漏:dev 的守门在 dev-guards.yml)。且这份文件必须先合进 main,cron 才会
|
# 所以「dev 已经有人天天看着了」这句话是**错的**——dev 线只有 dev-guards.yml 那几道快守门
|
||||||
# 第一次响——合并之前一次都不会跑。
|
# (fmt / clippy / guards / gpu 自测),全量矩阵在 dev 上一次都没跑过。另外这份文件必须先合进
|
||||||
|
# main,cron 才会第一次响:合并之前一次都不会跑。
|
||||||
# ② 失败可见性与 push 一样:`::error::` 注解由 test 作业的 shell 步骤自己产出,不读 event 上下文;
|
# ② 失败可见性与 push 一样:`::error::` 注解由 test 作业的 shell 步骤自己产出,不读 event 上下文;
|
||||||
# 定时任务的失败同样会通知默认分支的维护者。
|
# 定时任务的失败同样会通知默认分支的维护者。
|
||||||
# ③ 逐个 job 核过 `github.event` 依赖:整个文件只有 runtime-smoke-macos 的
|
# ③ 逐个 job 核过 `github.event` 依赖:整个文件只有 runtime-smoke-macos 的
|
||||||
# `if: github.event_name == 'workflow_dispatch'` 看 event,在 schedule 下为假 ⇒ 该 job 跳过
|
# `if: github.event_name == 'workflow_dispatch'` 看 event,在 schedule 下为假 ⇒ 该 job 跳过
|
||||||
# (它本来就只是手动探针,见其注释);其余 job 与矩阵里没有任何 event 表达式,夜间不会空转。
|
# (它本来就只是手动探针,见其注释);其余 job 与矩阵里没有任何 event 表达式,夜间不会空转。
|
||||||
|
# ④ 定时运行必须与 push main **分列到不同的 concurrency 组**:两者的 `github.ref` 都是
|
||||||
|
# `refs/heads/main`,同组 + `cancel-in-progress` 会让它们互相取消 —— 而**取消不是红**。
|
||||||
|
# 一个经常被静默取消的夜间入口比没有更坏:「昨晚没报错」会变成一句假话。所以 group 里带了
|
||||||
|
# event_name(证据强度见 `concurrency:` 上方那几条注释,别当成已在 runner 上实证过)。
|
||||||
#
|
#
|
||||||
# `cron` 一律 UTC:`17 3 * * *` = 每天 03:17 UTC(UTC+8 的 11:17)。分钟刻意避开 :00 / :30
|
# 时间:`cron` 一律 UTC,所以这里写死 `17 19 * * *` = **本地(UTC+8)每天 03:17**。
|
||||||
# ——整点是定时队列最挤的时候。要挪到本地凌晨就把它改成 `17 19 * * *`,其余不用动。
|
# 分钟刻意避开 :00 / :30——整点是 GitHub 定时队列最挤的时候。
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [main]
|
branches: [main]
|
||||||
pull_request:
|
pull_request:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
# 夜间全量矩阵(M266 / T30,理由与取舍见文件头)。cron 是 UTC;17 分避开整点队列。
|
# 夜间全量矩阵(M266 / T30,理由与取舍见文件头):17:19 UTC = 本地 03:17。
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '17 3 * * *'
|
- cron: '17 19 * * *'
|
||||||
|
|
||||||
env:
|
env:
|
||||||
CARGO_TERM_COLOR: always
|
CARGO_TERM_COLOR: always
|
||||||
@@ -51,8 +56,10 @@ env:
|
|||||||
concurrency:
|
concurrency:
|
||||||
# 加了 schedule 之后这一行必须带上 event_name:定时运行落在默认分支上,`github.ref` 同样是
|
# 加了 schedule 之后这一行必须带上 event_name:定时运行落在默认分支上,`github.ref` 同样是
|
||||||
# `refs/heads/main`,与「push main」落进同一个组 ⇒ 配上 cancel-in-progress 就是两者互相掐死
|
# `refs/heads/main`,与「push main」落进同一个组 ⇒ 配上 cancel-in-progress 就是两者互相掐死
|
||||||
# (夜里那轮被白天的推送取消 = 那一夜没有结果,正是本次要填的洞)。带事件名之后:
|
# (夜里那轮被白天的推送取消 = 那一夜没有结果,而取消不是红,正是本次要填的洞)。带事件名之后:
|
||||||
# push↔push 仍按 ref 互斥(原有行为一字未变),定时自成一列,既不会被推送取消,也不去取消推送。
|
# push↔push 仍按 ref 互斥(原有行为一字未变),定时自成一列,既不会被推送取消,也不去取消推送。
|
||||||
|
# 证据强度:以上是 **GitHub 文档语义**(schedule 事件的 ref 是默认分支、取消按 group 判定),
|
||||||
|
# **没有在真实 runner 上构造并发验证过**——本地造不出两个并发 run。别把它当实测结论引用。
|
||||||
group: ci-${{ github.event_name }}-${{ github.ref }}
|
group: ci-${{ github.event_name }}-${{ github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
|||||||
@@ -7,11 +7,15 @@
|
|||||||
|
|
||||||
| 通道 | 位置 | 后端 |
|
| 通道 | 位置 | 后端 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| CI 冒烟截屏 | `.github/workflows/ci.yml:101` | `--software-renderer`(强制 CPU) |
|
| CI 冒烟截屏 | `.github/workflows/ci.yml` 的 `test` 作业「出四张像素守门用的图并写进 $GITHUB_ENV(仅 Windows)」那一步 | `--software-renderer`(强制 CPU) |
|
||||||
| CI 交互冒烟 | `.github/workflows/ci.yml:246`、`:283` | `--software-renderer` |
|
| CI 交互冒烟 | 同上文件的 `runtime-smoke` 作业「在 Xvfb 里跑一帧并截图」、`runtime-smoke-macos` 作业「尝试截图」两步 | `--software-renderer` |
|
||||||
| Linux 容器冒烟 | `packaging/linux-smoke-docker.sh:90` | `--software-renderer` |
|
| Linux 容器冒烟 | `packaging/linux-smoke-docker.sh` 里「2) 跑容器:构建 → xvfb 截图 → 像素判定」那一段的 `xvfb-run` | `--software-renderer` |
|
||||||
| D30 视觉验收(人工,按协议出图) | `DevDocs/PlanDoc/`(视觉验收协议) | 同上(CI 同款命令) |
|
| D30 视觉验收(人工,按协议出图) | `DevDocs/PlanDoc/`(视觉验收协议) | 同上(CI 同款命令) |
|
||||||
|
|
||||||
|
> **锚点一律用「作业名 + 步骤名」,不用 `文件:行号`。** 这三处原来写的是行号,已经腐过一次
|
||||||
|
> (M266 往 ci.yml 文件头加夜间矩阵的注释之后,三处行号全部偏移)。workflow 只会越来越长,
|
||||||
|
> 行号锚点必然再腐;要定位就按上表的名字 `grep` 作业名 / 步骤名。
|
||||||
|
|
||||||
`--renderer=auto`(默认)会挑 wgpu;`--software-renderer` 强制 tiny-skia。CI 走后者是**有意的**:
|
`--renderer=auto`(默认)会挑 wgpu;`--software-renderer` 强制 tiny-skia。CI 走后者是**有意的**:
|
||||||
容器/无 GPU 机器上没有 Vulkan/DX12 设备,硬要 wgpu 会红在一句「adapter 创建失败」上,与皮肤无关。
|
容器/无 GPU 机器上没有 Vulkan/DX12 设备,硬要 wgpu 会红在一句「adapter 创建失败」上,与皮肤无关。
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user