Jenkins执行WhiteSource扫描npm依赖时连接公网registry超时咨询
问题根因
WhiteSource扫描NPM依赖默认走这套逻辑:先跑npm ls校验本地依赖树完整性,只要检测到缺失依赖,就自动在对应目录执行npm install --ignore-scripts补全,这个过程默认请求公网NPM官方源https://registry.npmjs.org。
组织托管的Jenkins节点一般默认限制公网出口,从日志能直接定位两个触发问题的具体原因:
- 扫描路径配错了:日志里
topFolder直接指到了node_modules/got这个单个依赖包目录,WhiteSource会把这个目录当成独立NPM项目解析依赖,必然报依赖缺失 - 没关自动补装依赖的开关,也没配组织内部NPM私有源,补装依赖时直接请求公网,触发连接超时
触发超时的核心日志片段:
[ERROR] Found error in npm ls --only=prod command [WARN] Failed getting dependencies after running '[npm, ls, --only=prod]', run [npm, install, --ignore-scripts] on /var/lib/jenkins/node/workspace//got folder [WARN] Could not reach the registry using the URL: https://registry.npmjs.org/got/-/got-9.6.0.tgz. Got an error: java.net.ConnectException: Connection timed out
配置方案
按优先级操作,配完就能彻底避免扫描时主动连接公网NPM源:
- 先修正扫描路径:把WhiteSource的扫描目标从
node_modules目录改到项目根目录(也就是package.json所在的层级),绝对不能直接扫node_modules下的子目录,避免把单个依赖包识别成独立项目做依赖解析。 - 强制离线扫描,关掉自动补装依赖的逻辑:在WhiteSource扫描步骤的NPM配置里加两个参数:
npm.installMissingDependencies设为false,禁止WhiteSource检测到依赖缺失时自动跑npm installoffline设为true,强制WhiteSource只读本地已有的依赖元数据完成扫描,不发起任何远程仓库请求
- 扫描前提前把依赖装完整:在WhiteSource扫描步骤之前加构建步骤,用组织内部的NPM私有源装完全量依赖,参考命令:
npm config set registry <组织内部NPM镜像地址> npm ci --ignore-scripts npm ls --only=prod # 确认依赖树没有缺失报错之后,再触发WhiteSource扫描 - (可选)如果要保留自动补装依赖的能力,就在WhiteSource配置里加
npm.registryUrl参数,值填组织内部NPM私有源地址,同时把Jenkins构建节点的npm全局默认源也改成内部源,从根源上避免回源到公网地址。
内容的提问来源于stack exchange,提问作者Pkpk
相关产品推荐
相关产品推荐

