[Refactor/Chore] Reuse Node runtime downloads in web CI with least-privilege cache access

当 Dify Web CI 在测试或构建开始前,因重复从 nodejs.org 下载固定版本的 Node.js 运行时出现失败时,优先排查 CI 中 Node.js 的安装方式;本 Issue 最终通过改用 actions/setup-node 安装 Node.js 解决,无需额外引入 runtim

快速结论:当 Dify Web CI 在测试或构建开始前,因重复从 nodejs.org 下载固定版本的 Node.js 运行时出现失败时,优先排查 CI 中 Node.js 的安装方式;本 Issue 最终通过改用 actions/setup-node 安装 Node.js 解决,无需额外引入 runtime-store 缓存。

适用环境:GitHub Actions 上的 Dify 仓库 Web CI;问题涉及 pnpm 安装 Node.js 运行时、Node.js 与 pnpm 版本固定、Vite+ 缓存步骤,以及工作流缓存权限(contents: read、缓存 access mode)。Issue 未确认具体操作系统、Python、CUDA、显卡或依赖版本。

最快修复方案:将共享 web bootstrap 中通过 pnpm 下载 Node.js 的方式替换为 actions/setup-node 安装固定版本 Node.js,并保留原有 Node.js/pnpm 版本、依赖检查及测试覆盖率阈值。

注意事项:该修复仅改变 CI 下载 Node.js 的方式,缓存未命中时仍需从上游下载运行时,缓存本身不能修复上游下载服务故障。Issue 中提出的 runtime-store 缓存方案未采用,相关 PR #44959 已作为被取代方案关闭。

问题场景

Dify 仓库的 Web CI 在启动阶段会先通过 pnpm 安装 Node.js,然后再进入 Vite+ 缓存步骤。由于每次都需要从 nodejs.org 下载固定版本的 Node.js 运行时,在测试或构建真正开始之前,就可能因下载重试、超时或响应体不完整而失败。

Issue 曾计划在部分 Web CI job 中复用固定的 Node.js 运行时下载,并配合最小权限缓存访问;目标是在不改变 Node.js、pnpm 版本和测试覆盖率要求的前提下,减少重复下载。最终该方案被更简单的做法取代。

报错原文

[Refactor/Chore] Reuse Node runtime downloads in web CI with least-privilege cache access
retried the runtime tarball download, then failed with timeouts and an incomplete response body

原因分析

最可能的原因是:当前 Web bootstrap 在 Vite+ 缓存步骤之前,先通过 pnpm 安装 Node.js,导致每个相关 CI job 都要单独从 nodejs.org 下载运行时 tarball。当上游下载服务出现超时或响应不完整时,job 会在测试和构建开始前就失败。

Issue 中提到的缓存方案主要用于减少重复下载,而不是修复上游下载服务;因此即使设计缓存,缓存未命中时仍会回到原始下载路径。

环境排查

  • 确认 Web CI 中 Node.js 的安装位置:是由 pnpm 安装,还是由 actions/setup-node 安装。
  • 确认 Node.js 与 pnpm 的固定版本是否与仓库原有配置一致。
  • 确认 Vite+ 缓存步骤与 Node.js 安装步骤的先后顺序。
  • 确认 CI job 的缓存权限设置,包括是否使用 contents: read、缓存 access mode 是否为只读消费。
  • 确认缓存准备 job 是否仅运行在可信的主分支代码上,且没有恢复旧缓存条目。
  • 确认发布评论、release 或其他写操作 artifact 的 job 是否独立于依赖缓存恢复和仓库脚本执行。
  • 如仍出现下载失败,检查失败是否发生在 nodejs.org 下载阶段,而不是依赖安装或测试阶段。

解决步骤

  1. 定位共享 web bootstrap 中通过 pnpm 安装 Node.js 的步骤。
  2. 将该安装方式改为使用 actions/setup-node,并按仓库原有配置指定固定 Node.js 版本。
  3. 保留原有 pnpm 版本、依赖检查、测试与覆盖率阈值,不做额外放宽。
  4. 保持 pnpm store 复用为可选(opt-in),不要让现有共享 setup 调用方默认启用 runtime-store 缓存。
  5. 不引入 PAT、OIDC 权限或仓库写权限用于缓存;缓存准备与消费使用 contents: read 和显式缓存访问模式。
  6. 将缓存准备限制在可信主分支代码,并避免在该准备 job 中恢复更早的缓存条目。
  7. 确保消费缓存的 job 在 job token 层面为只读;不要只依赖 action 的 save-cache 开关。
  8. 将 bundle report 计算与 PR 评论发布拆开,使发布 job 不执行仓库脚本、也不恢复依赖缓存。
  9. 增加针对权限边界的检查,并运行工作流验证。

验证方法

重新触发 Web CI 后,确认 Node.js 由 actions/setup-node 安装,且不再出现由 pnpm 运行时下载器引起的 nodejs.org tarball 重试、超时或响应体不完整错误;同时确认测试、构建和覆盖率阈值仍正常通过。由于该修复已通过 #44976 合并,可直接查看合并后的共享 web bootstrap 是否已不再使用 pnpm 下载 Node.js 运行时。

参考来源

langgenius/dify #44954

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 30745

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注