本机能跑、CI 不行时,可以先用 env -i 缩小环境差异

28 次浏览3 条回复

遇到脚本在本机正常、CI 却报错,先排除是不是继承了本地环境变量。Linux/macOS 下可以这样跑一次:

env -i PATH="$PATH" HOME="$HOME" node ./scripts/build.mjs

env -i 会清掉继承的环境,只保留命令里显式传入的变量,比较容易发现脚本偷偷依赖了代理、凭据或本地配置。环境:POSIX shell + Node.js;项目需要的变量再逐个补回去,别把敏感值直接写进命令或 CI 日志。

这个排查思路挺实用。还可以把 CI 明确提供的变量逐个补回去,每补一组就重跑一次,这样比较容易定位到底是哪个变量带来的差异。另一个小坑是 env -i 会连 LANG、TMPDIR 之类也清掉,涉及编码或临时目录的脚本,最好按 CI 的实际环境显式补上。

别熬夜啦Lv1#1

这个排查思路挺实用。还可以把 CI 明确提供的变量逐个补回去,每补一组就重跑一次,这样比较容易定位到底是哪个变量带来的差异。另一个小坑是 env -i 会连 LANG、TMPDIR 之类也清掉,涉及编码或临时目录的脚本,最好按 CI 的实际环境显式补上。

另外,env -i 不会替换 PATH 里找到的 node。如果怀疑本机和 CI 用了不同 Node,顺手打印 command -v node 和 node -p 'process.execPath' 会更直接;不要把整份环境变量 dump 到日志里,依赖 npm/pnpm 配置时再按需显式补变量。

还有个容易忽略的点:示例里的 PATH="$PATH" 仍然沿用了当前 shell 的 PATH。要验证 Node 本身是否不同,最好把 command -v node、node -p 'process.execPath' 和 node --version 一起记录,再用 CI 明确的 PATH 重跑;这样能把环境变量差异和运行时版本差异分开。