pnpm v11 的安全策略,让我踩了个坑

pnpm v11 的安全策略,让我踩了个坑

起因

最近在 Jenkins 上构建项目时突然报错,打开 Console Output 一看,赫然是这么一条错误信息:

yaml 复制代码
ERR_PNPM_IGNORED_BUILDS --- Ignored build scripts: xxx

之前一直好好的构建流程,怎么突然就不行了?我最近只改了业务代码,依赖没有变动,pnpm 配置也没动过------这报错从何而来?

第一次尝试

按照报错提示,我在本地项目中执行了 pnpm approve-builds,交互式地选中了提示的几个依赖包:

执行完毕后,自动生成了 pnpm-workspace.yaml 文件:

yaml 复制代码
onlyBuiltDependencies:
  - '@vue-office/docx'
  - core-js
  - esbuild
  - vue-demi

看起来挺合理的,我直接 commit 推上去,心想这下应该没问题了吧。

结果 Jenkins 一跑,报错一模一样。🤦

深入排查

既然本地没问题,那问题大概率出在 Jenkins 的运行环境上。我登录到 Jenkins 所部署的服务器,钻进 Docker 容器一看------果然发现了蹊跷:

Jenkins 环境中的 pnpm-workspace.yaml 内容和本地不一样,里面多了一段:

yaml 复制代码
allowBuilds:
  '@vue-office/docx': set this to true or false
  core-js: set this to true or false
  esbuild: set this to true or false
  vue-demi: set this to true or false
onlyBuiltDependencies:
  - '@vue-office/docx'
  - core-js
  - esbuild
  - vue-demi

关键区别在于:本地生成的配置用的是 onlyBuiltDependencies(v10 的配置格式),而 Jenkins 环境下 pnpm 额外注入了 allowBuilds 字段 ,而且值还是占位提示------没有真正设置为 true

这说明 Jenkins 环境中的 pnpm 版本和本地不一致,对构建脚本的处理方式也不同。

根因定位

为什么只改了业务代码,Jenkins 构建就突然失败了?

直觉告诉我:这和 pnpm 版本升级有关。我直奔 GitHub 查看 pnpm 的 Release Notes:

github.com/pnpm/pnpm/r...

在 v11 的发布说明中,我一眼就看到了关键词 allowBuilds------构建脚本许可制,v11 的新安全特性:

再确认一下 Jenkins 环境中的 pnpm 版本:

果然是 v11!而我本地用的还是 v10。

再看 Jenkinsfile,发现它指定了 pnpm 的安装方式:

真相大白:Jenkins 环境在某次更新后安装了 pnpm v11,而本地仍在使用 v10。 v11 默认启用了 strictDepBuilds,要求所有包含构建脚本的依赖必须通过 allowBuilds 明确许可。我本地生成的 onlyBuiltDependencies 是 v10 的配置格式,在 v11 环境下不被识别为有效的许可声明,所以构建脚本依然被拦截。

最终解决

pnpm-workspace.yaml 中的配置改为 v11 的格式,将 allowBuilds 的值设为 true

yaml 复制代码
allowBuilds:
  '@vue-office/docx': true
  core-js: true
  esbuild: true
  vue-demi: true

再次 commit,Jenkins 构建------终于成功了

反思

这次踩坑的根因并不复杂:本地和 CI 环境的 pnpm 版本不一致 。v11 在供应链安全方面做了多项默认启用的重要变更,其中 allowBuilds 就是最容易"迎面撞上"的那个。

几点教训:

  1. 本地和 CI 的工具链版本要保持同步。版本不一致是最常见的"本地能跑、CI 挂掉"的元凶。
  2. 关注依赖管理工具的版本升级公告。pnpm v11 这一波安全策略升级是"默认启用"的,不留神就会踩坑。
  3. v10 的 onlyBuiltDependencies 在 v11 中已被 allowBuilds 统一替代,迁移时要注意配置格式的变化。

pnpm v11 的安全策略发力了,而我正好撞在了它的枪口上。不过话说回来,这些默认启用的安全机制(构建脚本许可、发布冷却期、非标准源拦截)确实在加固 npm 生态的供应链安全------只是作为开发者,我们得跟上节奏才行。

相关推荐
花间相见10 小时前
【LangChain组件03】—— LangChain Agents 执行与状态:工作流程与状态管理实战
java·前端·langchain
kyriewen10 小时前
面试官让我用 AI 重构一个 8 年陈的 React 组件——他说他不看代码,只看我会不会拆
前端·javascript·面试
计算机魔术师10 小时前
700吉瓦「幽灵用电」:美国AI数据中心的抢电闹剧正在失控
前端
IT_陈寒10 小时前
JavaScript数组排序踩的坑,差点让我加班到凌晨
前端·人工智能·后端
风骏时光牛马10 小时前
提示词工程:大模型交互的核心构建艺术
前端
今日无bug11 小时前
大模型的回答是怎么一个字一个字蹦出来的?前端流式输出解析
前端·llm·agent
计算机魔术师11 小时前
Anthropic 复盘 Claude 模型越权访问真实系统事件并改进对齐与安全措施
前端
掘金者阿豪11 小时前
Seedance 2.0/2.5 虚拟素材能跨 Key 共用吗?一次讲清 Asset ID、账号隔离与 SaaS 素材架构
前端·后端
用户500937683903911 小时前
热敏小票 Web 打印:我在 58/80mm 上折腾的两周
前端·vue.js
XGM11 小时前
一个前端新手的"顿悟"时刻:DOM树、渲染原理和JS动态渲染
前端