Bitbucket Pipeline构建React.js应用失败求助
看起来你遇到的是React项目在Bitbucket CI环境下构建失败的典型场景——本地正常运行但CI报错,虽然Node/npm版本一致,但CI环境的特殊性还是会埋下不少坑。下面是一步步的排查和解决思路:
1. 先抓取完整的错误日志
当前的错误信息只显示了ELIFECYCLE和退出状态1,但真正的故障原因大概率藏在这之前的输出里。你可以修改Pipeline的构建命令,让它输出更详细的日志:
npm run build --verbose
或者直接打印npm生成的日志文件内容,拿到最直接的错误细节:
cat /root/.npm/_logs/2018-05-16T13_18_01_726Z-debug.log
这一步是定位问题的核心,千万别跳过。
2. 检查CI环境下的代码规范检查
React官方的create-react-app在CI环境下默认会开启严格模式——哪怕是代码里的ESLint警告,都会直接导致构建失败,而本地开发时可能因为配置忽略了这些警告。你可以:
- 先在本地模拟CI环境构建:
CI=true npm run build,如果本地也报错,就直接修复代码里的ESLint问题。 - 如果暂时不想严格检查,可以在Pipeline脚本里先关闭CI模式:
export CI=false npm run build
3. 清理缓存后重新安装依赖
虽然你用了Bitbucket的node缓存,但有时候缓存的依赖可能损坏或者不完整。可以在npm install前添加清理步骤:
npm cache clean --force rm -rf node_modules package-lock.json npm install
4. 确认环境变量是否缺失
如果你的React项目用到了REACT_APP_*开头的环境变量,本地可能已经配置,但Bitbucket Pipeline里没设置的话,会导致构建过程中无法读取变量而失败。你需要在Bitbucket仓库的Settings > Repository variables里添加对应的环境变量,确保构建时能正常读取。
5. 检查Node镜像的系统依赖
你用的node:8.11.1-slim是精简版镜像,可能缺少一些React构建需要的系统编译工具。可以尝试换成完整的Node镜像node:8.11.1,或者手动安装缺失的依赖:
apt-get update && apt-get install -y build-essential
额外:FTP部署的小优化
等构建问题解决后,注意git ftp init会上传整个仓库内容,但你应该只部署build文件夹的产物。可以修改部署命令:
cd build git ftp init --user $FTP_USERNAME --passwd $FTP_PASSWORD -v $FTP_HOST
另外,init只需要第一次运行,后续用git ftp push做增量上传会更高效。
内容的提问来源于stack exchange,提问作者Qamar Azam

