dsh-ci-diet:定位 GitHub Actions 浪费的 runner 时间并生成可审阅的 YAML 补丁

前言

在 DSH 里做仓库级自动化时,CI 成本往往藏在 workflow 细节里:同一 PR 被新提交 supersede 仍重复跑、矩阵过大、缺少 timeout-minutes、产物保留过久。人工翻 Actions 账单和 YAML 很难系统对照「实际跑了多久」与「规则上能否安全改一行配置」。

CI Diet(npm 包名 dsh-ci-diet)把静态 workflow 解析与可选的只读执行历史对齐,输出带证据等级与覆盖状态的发现项,并对部分规则生成字节级 YAML 补丁;改什么由你在 CLI 里显式 approve 后再 apply,不自动提交或推远端。下面介绍插件定位、能力与典型用法。

这是什么

  • 名称与归属:社区插件 0disoft/dsh-ci-diet,维护者 0disoft;在 SkillHub 目录 分类为「联网工具」。
  • 一句话:读取当前工作区的 workflow YAML,可选通过只读 gh api 拉取执行历史,报告 runner 时间花在哪里,并对符合条件的项给出小而可 review 的 YAML 修改建议。
  • 状态:README 标明 alpha,npm 已发布 dsh-ci-diet@0.2.0;合约、分析引擎、补丁引擎、CLI、DSH 插件工具与自包含 HTML 报告已实现并测试,DSH Web 端界面仍开放中。
  • 许可证:MIT。

核心功能

输入与对比方式

  1. 当前工作树中的 workflow YAML。
  2. 可选:用只读方式同步的 GitHub Actions 执行历史(需 gh 与联网;无网络时仍可做静态扫描)。

每条发现带有证据等级(observed、inferred、static)以及按规则的覆盖状态。

规则集(v0.1 计划内)

规则 发现内容 v0.1 中的处理
CD001 较新提交已 supersede 的 PR 运行 补丁:concurrency
CD002 重叠触发器 仅说明
CD003 仅文档变更仍跑重检查 仅说明
CD004 过大矩阵 仅说明
CD005 Job 无 timeout-minutes 补丁:timeout-minutes
CD008 产物保留过久 补丁:retention-days

规则集刻意保持较小;未通过真实仓库质量门的规则不会默认启用。README 注明 CD003、CD005 已实现但默认关闭(见 ADR-13)。

成本数字如何呈现

报告区分四类数值,不混用:

字段 含义
observedRunnerSeconds 运行记录中的实际秒数
modeledRoundedMinutes 按计费方式向上取整的 per-job 分钟
listPriceUsd 按快照标价换算的美元
actualBilledUsd 在无法证明前恒为 null

报告内嵌所用定价快照(含内容哈希),便于复算;快照无法校验时不会产出报告。

明确不做的事

  • 不 commit、push、开 PR、合并;不触发 workflow、不取消运行中的 job、不删产物或缓存。
  • 不改分支保护;对 GitHub 无写权限,历史访问只读。
  • 不用 LLM 判断 job 是否浪费。
  • 补丁是对现有 YAML 的字节范围编辑;需你 review diff、显式 approve 后再写入工作区。

安装与启用

全局安装 npm 包(也可不全局安装,用 npx dsh-ci-diet 跑同一 CLI;DSH 插件只需 profile 中有该包):

npm install --global dsh-ci-diet
dsh plugin --profile web add dsh-ci-diet

插件会添加一条默认禁用的 loader 项;只有需要同步执行历史时,再启用 networkEnabled。

环境要求(来自 README):

  • Node ^22.19.0 || >=24.0.0
  • gh CLI:可选,仅用于执行历史
  • DSH >=0.2.1-rc.2 <0.3.0-0 || >=0.2.2-rc.1 <0.3.0-0:可选,仅用于插件工具

安装前请自行查看仓库源码与 MIT 许可证;插件以当前 DSH 进程权限运行,启用联网前应确认 gh 与网络策略符合团队要求。

典型用法

扫描与同步

先静态扫描(无网络):

ci-diet scan --cwd .

需要结合本 checkout 的 Actions 历史时:

ci-diet sync --network

生成计划、审批与应用

对可打补丁的发现生成计划(示例针对 CD001):

ci-diet plan --rule CD001 --workflow .github/workflows/ci.yml \
             --claims ci-only,replace-safe

plan 在发现不可补丁、覆盖不允许写入、或规则依赖的策略快照过期时会拒绝写入。CD005 需要 --job 与 --minutes;CD008 需要 --job、--step,以及 --claims artifact-purpose:temporary,consumer-min-days:7。未经显式 approve 不会应用任何修改:

ci-diet approve --plan <planId> --confirm <digest tail>
ci-diet apply --plan <planId>

apply 只改写计划中的字节范围。需要回滚时:

ci-diet revert --change <changeId>

阅读报告与诊断

ci-diet report
ci-diet report --format html --out report.html
ci-diet diagnose
ci-diet prune

HTML 报告自包含(内联 CSS、无脚本、无外链),只读;审批留在 CLI(摘要与 nonce 校验)。diagnose 说明 job 名与 workflow 键的归因及采集覆盖;--require-complete 在任一轴不完整时以退出码 3 结束。CLI、HTML 与 DSH 工具文案支持含简体中文在内的多种语言,可通过 --lang 等机制选择;存储的报告以英文为主,展示时再翻译。

适用场景与注意

适合:已在用 GitHub Actions、希望用规则化证据找出明显浪费(如 superseded PR 运行、缺超时、产物保留过长),并愿意以「小 diff + 人工 approve」方式改本地 YAML 的团队或 DSH 智能体流程。

注意:

  • 部分规则默认仅解释、不自动出补丁;默认关闭的规则需等质量门通过后再开。
  • 联网历史依赖 gh 与只读 API;静态扫描不依赖网络。
  • 社区目录 SkillHub 与 DeepSeek / 幻方无官方从属关系;DSH 生态是「一切皆插件」,本包是其中面向 CI 成本与 workflow 卫生的一项联网类工具。

结尾

经过上面的步骤,你可以在 DSH profile 中挂上 dsh-ci-diet,用 ci-diet scan / sync 对照账单与 YAML,再对 CD001、CD005、CD008 等可补丁项走 plan → approve → apply 的闭环,且始终不自动改远端仓库。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜