在Jenkins运行Cypress前启动React应用触发ENOSPC监听错误如何解决
问题原因
你遇到的ENOSPC报错是Linux系统默认的inotify文件监听数量上限不足导致的。react-scripts start默认开启开发模式的热重载功能,会调用chokidar监听项目所有相关文件(包括node_modules下的依赖文件),当监听数量超过系统默认上限时就会抛出该错误。
优先推荐解决方案(适配CI场景,无系统修改依赖)
CI环境不需要热重载、文件监听这类开发功能,你可以直接在启动命令前添加CI=true环境变量,react-scripts识别到CI环境后会自动关闭所有开发模式的监听特性,从根源避免触发监听上限:
修改package.json中的start:e2e-ci脚本如下:
"start:e2e-ci": "CI=true REACT_APP_TEST_ENV=e2e HTTPS=true HOST=pressboxlivelocal.statsperform.com PORT=443 react-scripts start"
该方案不需要修改Jenkins节点的系统配置,适配所有临时CI节点场景,优先使用
补充注意事项
你当前的Jenkins步骤直接执行npm run start:e2e-ci会占住前台进程,后续Cypress测试命令无法执行,需要调整脚本将React应用后台启动,等服务就绪后再运行测试,测试完成后销毁后台进程,参考修改后的Jenkinsfile步骤:
stage('Cypress') { steps { configFileProvider([configFile(fileId: 'shell-aliases', variable: 'CFG_SHELL_ALIASES')]) { sh ''' source $CFG_SHELL_ALIASES > /dev/null 2>&1 # 后台启动React应用 npm run start:e2e-ci & # 等待React服务启动完成,替换为你实际的服务地址 npx wait-on https://pressboxlivelocal.statsperform.com # 运行Cypress测试,替换为你实际的Cypress运行命令 npm run test:cypress # 测试完成后杀掉后台的React进程 kill $! ''' } } }
备选解决方案(需要修改系统配置)
如果因为特殊需求不能关闭热重载功能,可以通过调大系统inotify监听上限解决:
- 临时生效(重启节点后恢复默认):在Jenkins步骤的最开头添加命令
sudo sysctl fs.inotify.max_user_watches=524288,需要给Jenkins运行用户开放sudo执行sysctl的权限 - 永久生效:登录Jenkins运行节点,在
/etc/sysctl.conf文件末尾添加一行fs.inotify.max_user_watches=524288,保存后执行sudo sysctl -p即可永久生效
内容的提问来源于stack exchange,提问作者Rafael Urbina
相关产品推荐
相关产品推荐

