diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a9f8391..d6d0425 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,18 +10,50 @@ name: CI # 见 DevDocs/00-踩坑记录-p2.md T7)。历史实现只作源码参考,**没有构建方式**(见 README: # 它的 manifest 整份是 workspace 继承写法,离开 workspace 后连解析都过不了)。 +# ---- 夜间全量矩阵(M266 / T30):为什么是 schedule,而不是 push dev ---- +# 上面那套门禁的前提是「有人往 main 推东西」,而本仓的实际节奏是**日常只推 dev**、main 一个月只在 +# 发版那一刻动一次 ⇒ 全量矩阵一个月跑一次,一次爆 5 个红,全部是早已存在的平台依赖问题。 +# `schedule` 就是补这个缺口的入口:每晚在 main 的末梢上跑一轮,把「平台回归的发现延迟」从一个月 +# 压到一天。 +# +# **不要顺手把它改成 `push: branches: [dev]`。** 本文件的矩阵 = 两个 OS 的 build release + 两个 OS 的 +# test + 两个 OS 的 clippy + fmt + runtime-smoke + update-e2e。挂到 dev 上等于每次提交烧一轮四平台 +# 矩阵,成本与排队都不可接受(dev 白天是开发时间);而 24 小时一轮就足以把平台回归压到 T+1。 +# 这是**故意的取舍**:抓得住「平台回归 T+1 就能看见」,抓不住「当天的错当天见」。dev 线的快守门 +# (fmt / clippy / guards / gpu 自测)在 dev-guards.yml,那边刻意不上全量 test / build,理由见其头部。 +# +# schedule 的三条语义边界(省得下次重新查): +# ① 定时只在**默认分支**上生效:cron 跑的是 main 的末梢,dev 上尚未合入的提交不进这一轮 +# (这是设计,不是遗漏:dev 的守门在 dev-guards.yml)。且这份文件必须先合进 main,cron 才会 +# 第一次响——合并之前一次都不会跑。 +# ② 失败可见性与 push 一样:`::error::` 注解由 test 作业的 shell 步骤自己产出,不读 event 上下文; +# 定时任务的失败同样会通知默认分支的维护者。 +# ③ 逐个 job 核过 `github.event` 依赖:整个文件只有 runtime-smoke-macos 的 +# `if: github.event_name == 'workflow_dispatch'` 看 event,在 schedule 下为假 ⇒ 该 job 跳过 +# (它本来就只是手动探针,见其注释);其余 job 与矩阵里没有任何 event 表达式,夜间不会空转。 +# +# `cron` 一律 UTC:`17 3 * * *` = 每天 03:17 UTC(UTC+8 的 11:17)。分钟刻意避开 :00 / :30 +# ——整点是定时队列最挤的时候。要挪到本地凌晨就把它改成 `17 19 * * *`,其余不用动。 + on: push: branches: [main] pull_request: workflow_dispatch: + # 夜间全量矩阵(M266 / T30,理由与取舍见文件头)。cron 是 UTC;17 分避开整点队列。 + schedule: + - cron: '17 3 * * *' env: CARGO_TERM_COLOR: always RUST_BACKTRACE: 1 concurrency: - group: ci-${{ github.ref }} + # 加了 schedule 之后这一行必须带上 event_name:定时运行落在默认分支上,`github.ref` 同样是 + # `refs/heads/main`,与「push main」落进同一个组 ⇒ 配上 cancel-in-progress 就是两者互相掐死 + # (夜里那轮被白天的推送取消 = 那一夜没有结果,正是本次要填的洞)。带事件名之后: + # push↔push 仍按 ref 互斥(原有行为一字未变),定时自成一列,既不会被推送取消,也不去取消推送。 + group: ci-${{ github.event_name }}-${{ github.ref }} cancel-in-progress: true jobs: