Jenkins 构建 React 项目时为啥一直卡在 npm run build?
我在 Jenkins 上部署一个 React 项目,本地能正常 build,但 Jenkins 构建时老是卡在 npm run build 这一步,日志也不报错,就是不动了。试过加 –verbose 也没用。
项目里有个组件是这样写的:
import React from 'react';
const App = () => {
return (
<div className="app">
<h1>Hello Jenkins!</h1>
</div>
);
};
export default App;
Node 和 npm 版本跟本地一致(v18.17.0 / 9.6.7),Jenkins 跑在 Docker 里。是不是内存不够?还是环境变量没配对?
问题根源
npm在非TTY环境下(也就是没有终端交互的情况下)会卡住,尤其是执行某些scripts的时候。Jenkins在Docker里运行构建任务时,默认就是非交互模式,但你的package.json里的build命令或者依赖安装过程中可能有些地方在等输入。
解决方案
在Jenkins的构建脚本里加环境变量:
CI=true这个环境变量会让npm自动进入非交互模式,很多卡住的问题都是因为缺这个。另一个可能的原因
如果上面不行,检查一下你的package.json里有没有这种写法:
有些项目会用react-scripts或者自定义的node脚本,这些在某些情况下也会卡。如果你是用create-react-app或者类似脚手架创建的,试试改成:
内存问题
你说得对,内存也可能是一部分原因。Docker容器默认内存限制可能比较小,Node.js在build时比较吃内存。在Jenkins的Docker启动参数里加一下:
给到2G左右比较稳妥。
排查建议
先试CI=true这个,绝大部分情况下加了就好了。如果还不行,把npm run build改成手动分步执行,看看具体卡在哪一步:
npm ci比npm install更适合CI环境,它直接从package-lock.json安装,不会产生交互。