Renovate Dependency Dashboard 完全指南:依赖状态总览、弃用警告与人工审批工作流
【免费下载链接】renovateHome of the Renovate CLI: Cross-platform Dependency Automation by Mend.io项目地址: https://gitcode.com/GitHub_Trending/re/renovate
依赖更新自动化工具 Renovate 内置了Dependency Dashboard(依赖仪表盘)功能:它在仓库中创建一个动态的 Issue,以 Markdown 复选框(Checkbox)的形式集中展示所有依赖更新的状态,并支持“勾选即触发”的人机交互,例如批准待审批的更新、强制创建受限的 PR、重试出错的分支、批量 Rebase 全部 PR 等。本文基于 Renovate 源码仓库,系统讲解 Dashboard 的开启/关闭方式、内置预设、各区块含义、审批工作流(Approval Workflow)的三种配置粒度,以及它背后的源码实现机制,帮助你读完即可在真实仓库中落地这套“更新可控、状态透明”的依赖治理方案。
一、什么是 Dependency Dashboard
Renovate 的 Dependency Dashboard 是一个由 Renovate 自动创建并持续维护的 Issue。当该功能启用后,Renovate 会在每次运行时更新这个 Issue 的内容,把仓库内所有依赖更新的“待办事项”以结构化 Markdown 形式呈现出来,包括:待批准的更新、受计划(Schedule)限制的更新、受并发/频率限制的更新、出错待重试的更新、被关闭的 PR 等。
该 Issue 的本质是一张可交互的“控制面板”:每一行更新对应一个带<!-- comment -->标记的复选框。用户勾选某个复选框后,Renovate 在下次运行时通过解析 Issue 正文(见 dependency-dashboard.ts 中的parseDashboardIssue与getCheckedBranches)识别用户的意图,并执行对应动作,例如创建 PR、重试、Rebase、取消限流等。因此,Dashboard 不只是“看板”,还是依赖更新的人机交互入口。
在 lib/config/options/index.ts 中,dependencyDashboard的官方描述是:“Whether to create a 'Dependency Dashboard' issue in the repository.”,默认值为false。这意味着默认情况下 Renovate 不会创建 Dashboard,需要显式开启。
二、支持的平台
Dependency Dashboard 依赖一个关键能力:宿主平台必须支持“带动态 Markdown 复选框的 Issue”。因为 Dashboard 的所有交互动作都建立在勾选/取消勾选复选框并让 Renovate 解析的基础上,如果平台不支持 Issue 或不支持在 Issue 中渲染/编辑复选框,该功能就无法工作。
判断你的平台是否支持:参考仓库文档 FAQ:Renovate core features not supported on all platforms。
此外从源码看,部分 Dashboard 的进阶能力对平台有额外要求。例如 CVE 汇总区块、vulnerabilityAlerts配置在 lib/config/options/index.ts 中标注了supportedPlatforms: ['github'],即 OSV 漏洞提醒相关能力目前以 GitHub 平台支持最为完整。
三、如何开启与关闭 Dashboard
3.1 通过预设(Preset)开启
官方推荐通过内置预设:dependencyDashboard开启,只需把它加入extends数组:
{ "extends": ["schedule:automergeDaily", ":dependencyDashboard"] }该预设定义在 lib/config/presets/internal/default.preset.ts:
dependencyDashboard: { dependencyDashboard: true, description: 'Enable Renovate Dependency Dashboard creation.', },值得注意:推荐配置config:recommended本身已经内联了:dependencyDashboard(见 lib/config/presets/internal/config.preset.ts)。也就是说,只要你的配置extends: ["config:recommended"],Dashboard 默认就是开启的。
3.2 直接配置布尔值
不依赖预设,直接设置配置项:
{ "dependencyDashboard": true }该配置项类型为boolean,默认false(见 lib/config/options/index.ts)。
3.3 关闭 Dashboard
添加预设:disableDependencyDashboard,或将dependencyDashboard显式设为false:
{ "extends": ["config:recommended", ":disableDependencyDashboard"] }{ "dependencyDashboard": false }disableDependencyDashboard预设同样定义在 lib/config/presets/internal/default.preset.ts,其作用就是将dependencyDashboard覆盖为false。关闭后,如果之前已经创建过 Dashboard Issue,Renovate 会在下一次运行时通过platform.ensureIssueClosing将其关闭(见 dependency-dashboard.ts 的关闭分支逻辑)。
3.4 自动关闭(Autoclose)
如果希望“没有更新待办时自动关闭 Dashboard”,可组合使用dependencyDashboardAutoclose(默认false):
{ "dependencyDashboard": true, "dependencyDashboardAutoclose": true }从源码看(dependency-dashboard.ts),当dependencyDashboardAutoclose为true,且当前既没有需要处理的分支(branches为空)、也没有弃用/替换类警告时,Renovate 会直接关闭 Dashboard Issue。
四、Dashboard 的核心使用场景
4.1 弃用依赖(Deprecations)与替换(Replacements)警告
Renovate 会在仓库中检测到以下情况时,在 Dashboard 顶部区域醒目地提示:
- 依赖在其注册表(Registry)中被标记为 deprecated(已弃用);
- 存在社区来源的替换包(Replacement),即 Renovate 官方维护的
replacements:all预设所覆盖的替换方案。
提示效果类似于:
The following dependencies are deprecated:
| Datasource | Name | Replacement? |
|---|---|---|
| npm | airbnb-prop-types | |
| npm | left-pad |
其中绿色 "Available" 表示已存在可操作的替换 PR,橙色 "Unavailable" 表示该依赖已弃用但暂无替换方案。
这一区块由 dependency-dashboard.ts 中的逻辑生成:Renovate 遍历所有packageFiles的依赖,检查dep.deprecationMessage以及是否存在updateType === 'replacement'的更新;若替换目标已经在依赖清单中存在(replacementAlreadyExists),则该替换会被判定为“不可操作”(Unavailable)。
4.2 弃用检测(Abandonment detection)
除了注册表显式标记的 deprecated 外,Renovate 还能识别“长期不更新、疑似被弃用”的包。官方提供了abandonments:recommended预设(已自动包含在config:best-practices中),该预设:
- 为所有包设置默认的
abandonmentThreshold,默认值为1 year(即超过一年未发布新版本即标记为可能弃用); - 内置社区维护的覆盖项(Overrides),用于排除那些“看似弃用、实则仍在维护”的包;
- 阻止对真正弃用包的更新,同时允许对发布节奏不规律的包继续更新。
使用方式:
{ "extends": ["abandonments:recommended"] }你还可以贡献/修改覆盖项,对应数据文件为 lib/data/abandonments.json。
当dependencyDashboardReportAbandonment(默认true,见 lib/config/options/index.ts)开启时,Dashboard 会额外生成 “Abandoned Dependencies” 区块,以<details>折叠列表展示被判定为弃用的依赖、其 Datasource、最后更新时间(格式化自mostRecentTimestamp)。该区块由getAbandonedPackagesMd生成(dependency-dashboard.ts)。
4.3 已关闭/被忽略更新的可见性
Dashboard 会列出所有“待办(to do)”的更新。如果你手动关闭了 Renovate 创建的更新 PR,该更新会出现在 Dashboard 的Closed/Ignored(源码中对应PR Closed (Blocked)区块)部分,而不是凭空消失。之后若改变主意,只需勾选该行对应的复选框,Renovate 就会重新创建 PR。
4.4 CVE / 漏洞汇总(实验性)
配置项dependencyDashboardOSVVulnerabilitySummary(默认'none',可选'none' | 'all' | 'unresolved',标注为 experimental)控制是否在 Dashboard 中列出 osv.dev 提供的 CVE 信息,例如:
{ "dependencyDashboard": true, "dependencyDashboardOSVVulnerabilitySummary": "all" }源码中getDashboardMarkdownVulnerabilities(dependency-dashboard.ts)会汇总漏洞数量、区分“已有修复版本”与“未修复”,并以manager → packageFile → packageName的多层<details>结构呈现每个 CVE 及其修复版本。
五、Approval Workflow:让更新“先审批、后创建”
Dependency Dashboard 除了展示状态,还承载着“审批(Approval)”工作流:让 Renovate 在创建更新 PR 前等待你的手动批准。核心配置项为dependencyDashboardApproval(默认false,见 lib/config/options/index.ts),官方描述为:“Controls if updates need manual approval from the Dependency Dashboard issue before PRs are created.”
注意:无论审批如何配置,漏洞修复类(vulnerability remediation)PR 始终会被立即创建,无需审批。这一点在配置默认值上也有体现——
vulnerabilityAlerts的默认配置中dependencyDashboardApproval: false(见 lib/config/options/index.ts)。
审批粒度分为三个层级,且可以混合使用。
5.1 要求所有更新都需审批(不推荐)
使用预设:dependencyDashboardApproval:
{ "extends": ["config:recommended", ":dependencyDashboardApproval"] }该预设定义在 lib/config/presets/internal/default.preset.ts。官方并不推荐全局启用:因为一旦所有更新都需要人工批准,你就必须频繁检查 Dashboard,否则重要更新会被无限期搁置(“眼不见,心不烦”)。它只适合那些觉得 Renovate 噪音太大、希望完全掌控更新节奏的仓库。
5.2 仅要求 major 更新审批(推荐场景)
Major 更新通常包含破坏性变更,需要人工适配。相比直接禁用 major 更新(更新完全不可见),审批模式能让你在 Dashboard 上看到所有待处理的 major 更新,并在合适的时间逐个批准:
{ "major": { "dependencyDashboardApproval": true } }5.3 仅要求特定包审批
适用于不遵循语义化版本、每次发布都可能破坏 API 的包,或更新过于频繁、希望手动掌控更新节奏的包。通过packageRules按包名/模式匹配:
{ "packageRules": [ { "matchPackageNames": ["@somescope/**"], "dependencyDashboardApproval": true } ] }上述三种方式可以自由组合:例如全局自动更新,仅对 major 和特定命名空间开启审批。
5.4 审批的触发与生效条件(源码视角)
从 dependency-dashboard.ts 的ensureDependencyDashboard可以看出,只要满足以下任一条件,Renovate 就会保持/创建 Dashboard,以便承载审批交互:
config.dependencyDashboard === trueconfig.dependencyDashboardApproval === true- 任一
packageRules中设置了dependencyDashboardApproval - 存在设置了
dependencyDashboardApproval或dependencyDashboardPrApproval的分支
另外,readDashboardBody(dependency-dashboard.ts)表明:即使没有显式开启dependencyDashboard,只要配置中存在"dependencyDashboardApproval": true或"prCreation": "approval",Renovate 也会自动读取 Dashboard Issue 并解析其中已勾选的审批项。也就是说,审批工作流会自动带动 Dashboard 的启用。
5.5 审批动作如何被执行
当你在 Dashboard 勾选<!-- approve-branch=xxx -->复选框后,下次运行 Renovate 时,parseDashboardIssue会通过正则markedBranchesRe(- \[x\] <!-- ([a-zA-Z]+)-branch=([^\s]+) -->)解析所有已勾选条目,将{branchName: type}记录到dependencyDashboardChecks,随后分支处理器据此创建对应 PR。同时,Dashboard 还支持“一键批量操作”复选框(通过getBranchesListMd的bulkComment参数生成),例如:
- 勾选
approve-all-pending-prs→ 一次性创建所有待审批 PR - 勾选
create-all-rate-limited-prs→ 一次性创建所有被限流的 PR - 勾选
create-all-awaiting-schedule-prs→ 一次性创建所有等待排期的 PR - 勾选
rebase-all-open-prs→ 一次性 Rebase 所有打开的 PR
六、Dashboard 的区块结构与交互清单
根据 dependency-dashboard.ts 的渲染顺序和仓库测试固件 dependency-dashboard-with-10-PR.txt,Dashboard Issue 通常包含以下区块:
| 区块标题 | 触发条件(branch.result) | 勾选后的动作 | 是否支持一键批量 |
|---|---|---|---|
| Pending Approval | needs-approval | 创建待审批 PR(approve) | ✅ 全部创建 |
| Group Size Not Met | minimum-group-size-not-met | 忽略分组大小限制创建 PR(approveGroup) | — |
| Awaiting Schedule | not-scheduled | 立即创建 PR,无视排期(unschedule) | ✅ 全部创建 |
| Rate-Limited | branch-limit-reached/pr-limit-reached/commit-per-run-limit-reached/commit-hourly-limit-reached | 强制立即创建(unlimit) | ✅ 全部创建 |
| Errored | error | 强制立即重试(retry) | — |
| PR Creation Approval Required | needs-pr-approval | 批准 PR 创建 | — |
| PR Edited (Blocked) | pr-edited | 丢弃所有提交重新开始(rebase) | — |
| Pending Status Checks | pending | 强制创建(unpend) | — |
| Pending Branch Automerge | prBlockedBy === 'BranchAutomerge' | 中止分支自动合并并改开 PR | — |
| Other Branches | 其他未归类状态 | 强制创建 PR(other) | — |
| Open | 已有 PR 且未被阻塞 | 强制重试/Rebase(rebase) | ✅ 全部 Rebase |
| PR Closed (Blocked) | already-existed | 重新创建 PR(recreate) | — |
当仓库没有任何待处理分支时,Dashboard 会显示 “This repository currently has no open or pending branches.”。
此外,errors-warnings.ts 中的getDepWarningsDashboard还会在 Dashboard 中追加 “Renovate failed to look up the following dependencies” 类型的查找失败警告(除非在suppressNotifications中配置了dependencyLookupWarnings)。
七、Dashboard 的定制化配置
除开关外,Renovate 还提供了一系列定制项(均定义于 lib/config/options/index.ts):
| 配置项 | 类型/默认值 | 说明 |
|---|---|---|
dependencyDashboardTitle | string,默认Dependency Dashboard | Dashboard Issue 的标题 |
dependencyDashboardHeader | string,支持模板 | 插入到 Issue 正文最开头的内容,默认是一段指向 Dashboard 文档的说明文字 |
dependencyDashboardFooter | string,支持模板 | 插入到 Issue 正文最后的内容(前面自动加分隔线) |
dependencyDashboardLabels | string[] | 始终应用到该 Issue 的标签,即使被手动移除也会在下次运行恢复 |
dependencyDashboardCategory | string | 用于对 Dashboard 上的分支进行分组的类别;splitBranchesByCategory会按类别名排序渲染(见 dependency-dashboard.ts),未分类分支归入 “Others” |
dependencyDashboardReportAbandonment | boolean,默认true | 是否在 Dashboard 中报告疑似弃用的依赖 |
dependencyDashboardOSVVulnerabilitySummary | 'none' \| 'all' \| 'unresolved',默认'none',实验性 | 是否在 Dashboard 中汇总 osv.dev 的 CVE 信息 |
示例(组合使用):
{ "dependencyDashboard": true, "dependencyDashboardTitle": "Deps Dashboard", "dependencyDashboardHeader": "欢迎查看本仓库的依赖状态总览。", "dependencyDashboardLabels": ["renovate", "dashboard"], "dependencyDashboardOSVVulnerabilitySummary": "unresolved" }注意:dependencyDashboardHeader与dependencyDashboardFooter支持 Renovate 模板语法(supportsTemplating: true),因此可以插入{{datasource}}、{{depName}}等模板变量。
八、附:Dry Run 行为与运行模式说明
从源码看,Dashboard 的创建/更新/关闭行为还会受到运行模式影响:
- 当
mode === 'silent'时,Renovate不会创建、更新或关闭Dashboard Issue(见 dependency-dashboard.ts)。 - 在
dryRun(试运行)模式下,Renovate 不会真正写入 Issue,而是输出DRY-RUN: Would ensure Dependency Dashboard/DRY-RUN: Would close Dependency Dashboard之类的日志,便于你在正式运行前预览 Dashboard 会如何变化。
结语
Dependency Dashboard 是 Renovate 将“自动更新”与“人工掌控”结合起来的关键机制:一方面它以单张 Issue 的形式让仓库内所有依赖更新的状态完全透明、可追踪;另一方面通过可交互的 Markdown 复选框,把“审批、强制、重试、Rebase、重开”等操作化为一次勾选。如果你希望进一步深挖实现细节,可以阅读 dependency-dashboard.ts 及其测试 dependency-dashboard.spec.ts,以及预设定义 default.preset.ts,从而理解每个区块、每个复选框背后的精确行为。
【免费下载链接】renovateHome of the Renovate CLI: Cross-platform Dependency Automation by Mend.io项目地址: https://gitcode.com/GitHub_Trending/re/renovate
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考