Jenkins Vue 流水线 pnpm install 报 ERR_PNPM_OUTDATED_LOCKFILE 排查

Jenkins Vue 流水线 pnpm install 报 ERR_PNPM_OUTDATED_LOCKFILE 排查

记录时间:2026-08-03
环境:Jenkins 共享库(ops-jenkinsfile)· Vue 前端流水线 vueDevopsByk8s.groovy · 业务项目 gzeport-gzsw-ui · pnpm 10.22.0 / node 20.19.5

一、问题现象

构建 dyck-vue-gzsw-ui 时,前端构建阶段 pnpm install 失败,报错:

ERR_PNPM_OUTDATED_LOCKFILE Cannot install with "frozen-lockfile" because pnpm-lock.yaml is not up to date with <ROOT>/package.json

  Failure reason:
  specifiers in the lockfile don't match specifiers in package.json:
* 1 dependencies were added: echarts@^6.1.0

随后「构建并推送镜像」阶段因前置失败被跳过。日志另有一条 WARN:

WARN Unsupported engine: wanted: {"node":"^22.14.0 || >=22.12.0"} (current: {"node":"v20.19.5","pnpm":"10.22.0"})

二、排查过程

2.1 确认流水线安装命令

查看 vars/vueDevopsByk8s.groovy,pnpm 分支安装命令为:

pnpm install --registry ${params.registryUrl} --dangerously-allow-all-builds

没有显式传入 --frozen-lockfile--no-frozen-lockfile

2.2 对比业务项目 package.json 与 pnpm-lock.yaml

对比 gzeport-gzsw-ui 的两个文件:

  • package.jsondependencies 中存在 "echarts": "^6.1.0"
  • pnpm-lock.yamlimporters 段没有任何 echarts 条目

即锁文件未包含新增依赖。

2.3 确认 pnpm 的 CI 默认行为

pnpm 在 CI 环境(检测到 CI 相关环境变量)默认启用 frozen-lockfile,锁文件与 package.json 不一致时直接拒绝安装,错误信息中也注明了这一点。

三、根因分析

业务项目新增了 echarts@^6.1.0 依赖,但 pnpm-lock.yaml 未同步更新并提交。pnpm 10 在 CI 下默认 frozen-lockfile 校验锁文件与 package.json 的一致性,发现失步即中断。这是业务侧依赖锁定规范问题,不是流水线脚本逻辑问题

另需澄清:日志里的 Unsupported engine WARN 与业务项目 package.jsonengines 字段(^22.14.0 || >=22.12.0)逐字一致,是项目自身声明的 node 版本要求,并非 echarts 的 node 限制,且该 WARN 不阻断安装。

四、解决方案

方案 A:业务侧更新锁文件(根治,推荐)

在业务仓库根目录执行:

pnpm install

pnpm-lock.yaml 会按现有 package.json 的 specifier 自动补上 echarts 条目,然后提交 package.json + pnpm-lock.yaml 两个文件,重新触发构建。这是 pnpm 官方 CI 最佳实践,保证构建可复现、依赖版本锁定。

方案 B:流水线临时绕过(不推荐长期)

vars/vueDevopsByk8s.groovy 的 pnpm 安装命令追加:

pnpm install ... --no-frozen-lockfile

代价:CI 每次会重新解析依赖并尝试更新 lockfile(CI 不提交、更新无意义),丧失依赖锁定与可复现性,且掩盖业务侧锁文件失步问题。

五、验证

  1. 业务侧本地执行 pnpm install,确认 pnpm-lock.yamlimporters 段出现 echarts 条目
  2. 提交 package.json + pnpm-lock.yaml 后重新触发 Jenkins 构建
  3. 预期:pnpm install 阶段通过,进入「构建并推送镜像」阶段

image-20260803192409279

六、注意事项

  • Unsupported engine WARN 不阻断:源于项目自身 engines 声明 node ≥ 22.12,CI node 容器是 v20.19.5(低于声明)。工具链 vite@7.3.6(engines ^20.19.0 || >=22.12.0)、@vitejs/plugin-vue@6.0.7sass@1.101.0>=20.19.0)均支持 node 20.19+,node 20 构建大概率可行;若业务团队按 node 22 开发,建议把该项目的 nodeVersion 参数切到 22 与 engines 对齐(未验证)。
  • --dangerously-allow-all-builds 不要改动:pnpm 10+ 默认拦截依赖构建脚本,该开关是官方 CI 放行方式,不要改为固化某个项目的包名白名单。
  • 新增依赖必须提交 lockfile:这是 CI 规范红线,开发本地加依赖后需把 package.jsonpnpm-lock.yaml 一并提交,避免 CI 在 frozen-lockfile 下直接失败。

七、参考资料

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇