DSH Quality

如何为你的仓库建立 DSH 插件评审流程

一刀切禁用不管用,随装随用更糟。一套简短的评审流程能在不把每个新插件都变成一场会的前提下,把有问题的挡在外面。

多数团队最后落在两个位置之一:要么干脆禁用插件,要么谁都能加、没人看。插件评审流程是第三条路,而且比前两条都快。这篇讲新插件落地前要过的插件评审清单、PR 插件闸门放在哪里才不会变成瓶颈,以及一套把安装前审查新插件控制在十分钟而不是排一次会的 DSH 插件审批流程。

为什么禁用会失败,而放开更糟

禁用挡不住插件的使用,只是把它赶到个人机器和临时分支上去 —— 那里没有任何记录,也没有任何人审查。放开是相反的失败:依赖列表在长,审查面跟着长,等到第一次出事,你得在时间压力下审计上百条记录。

  • 禁用:没有记录、没有审查,出事时回答不了「我们现在到底在跑什么」。
  • 放开:记录完整、审查为零,依赖列表没人敢担保。
  • 评审流程:记录存在,且审查的强度与风险匹配。

插件评审清单

控制在八条,按这个顺序。前四条是机械检查,大约四分钟;后四条是判断。

  • 身份:索引上的名字和源仓库一致吗,中间有没有包装层?
  • 新鲜度:看最后发布时间,不是最后提交时间。
  • 安装路径:把安装脚本读一遍。任何运行时拉取的东西都要单独审。
  • 评分:查当前 DSH 评分,更有用的是看它有没有在往下掉。
  • 权限范围:它要的权限或文件访问,比它要干的活大吗?
  • 维护:近三个月 issue 的响应时间。
  • 巴士系数:近六个月有几个人提交过代码?
  • 退出方案:如果下个季度要摘掉它,会断什么?

前四条拦的是供应链问题。后四条决定的是你愿不愿意依赖它一年。

PR 插件闸门放在哪里

PR 插件闸门是 CI 里的一条检查,在 pull request 改动插件清单时触发。它不做拒绝,只打印改了什么、审查者该看什么。有三个合理的落点。

落点能拦住什么成本
提交前钩子PR 还没建就已经发现拼写和名字错误低,本地跑
PR 检查(推荐)每一次清单 diff,附评分与安装脚本摘要低,几秒钟
发布闸门开发者在清单之外、装在机器上的插件高,需要先有机器清单

从 PR 检查开始。它覆盖了几乎所有插件实际会走的那条路,而且它打印的 diff,本来就是人工审查者要手工拼出来的东西。

值得强制执行的阈值

在你还不需要的时候就先把数字定下来,而且别定太多。三档就够了。

档位条件动作
自动通过评分 80 以上、安装脚本打包在内、索引名与仓库名一致免审查直接合并
单人审查评分 60 到 79,或某项机械检查不清楚一次批准,清单附在 PR 上
暂缓评分低于 60、安装脚本里有运行时拉取、或名字不一致需要书面理由加第二次批准
什么都拦的闸门,一个月内就会被关掉。只打印 diff、只问一个问题的闸门活得下来,因为它比它替代的那场争论更便宜。

推行时不惹恼所有人的做法

  • 先让闸门只报告、不拦截,跑两周。在强制之前,先看它本来会标出什么。
  • 用一次提交把现有清单整体批准,让基线干净,之后的每次 diff 才有意义。
  • 把清单放进 PR 模板,别放进一个没人打开的 wiki。
  • 在清单里给每个插件写清一个负责人。负责人轮换是审查走样最常见的原因。
  • 每季度复审一遍,而且只复审评分发生变化的那些。

常见问题

  • 一次审查要多久?二档插件十分钟,其中大部分花在读安装脚本上。
  • 会不会拖慢安装?不会。闸门跑在清单 diff 上,不在开发者机器上。
  • 装在仓库之外、全局的插件怎么办?那是发布闸门那一档,而且先得有机器清单。
  • 移除插件也要审吗?只有当初是三档批准的才需要,因为退出方案只写在那一档里。

先从清单和 PR 检查开始,其余的可以后补。团队层面的做法见 /blog/plugin-supply-chain-security-team-enforcement,单个插件的危险信号列在 /blog/how-to-avoid-risky-dsh-plugins,想先修你手头这份清单的话,/blog/setting-up-a-plugin-allowlist-for-your-dev-team 里有步骤。评分阈值在 /blog/dsh-quality-score-decoded 里讲过,完整插件索引在 /。

plugin review processdsh plugin governanceplugin approval workflowsupply chain reviewplugin review checklistPR plugin gatedsh plugin approval workflowreviewing new plugins before install