AWS CodePipeline部署React项目至EC2的Deploy阶段报错求助
核心故障原因
- 最直接的超时原因:
app_start.sh中第一行执行的npm start是阻塞命令,会在前台持续运行 React 开发服务器,永远不会执行后续的 pm2 相关指令,导致脚本执行超过300秒阈值被强制终止 - 部署逻辑存在多处配置错误:
- buildspec 已执行
npm run build生成生产环境静态产物,但 artifacts 配置未包含编译后的build目录,EC2 实例无法获取到可直接运行的生产代码 before_install.sh中提前切换到/home/ec2-user/server目录,该阶段部署包尚未解压到服务器,目录不存在会导致脚本执行异常- 重复安装依赖,构建阶段已完成依赖安装,部署阶段无需重复执行
npm install以及 React 相关包的安装 - 生产环境启动开发服务器不符合部署规范,开发服务器性能低且不稳定,不适用于线上部署
- buildspec 已执行
修复步骤
1. 修改 buildspec.yml 产物配置
移除不需要的源码目录,新增编译后的 build 目录:
# 请勿修改版本号,此处为AWS buildspec的版本,不是您的构建配置文件的版本 version: 0.2 phases: pre_build: commands: # 将依赖安装到node_modules/目录下 - npm install build: commands: - echo Build started on `date` - echo 编译中 - npm run build post_build: commands: - echo Build completed on `date` # 仅包含应用运行所需的文件 artifacts: files: - build/**/* - package.json - appspec.yml - scripts/**/*
2. 修改 before_install.sh
移除不存在的目录切换操作:
#!/bin/bash curl -sL https://rpm.nodesource.com/setup_14.x | sudo -E bash - yum -y install nodejs npm
3. 修改 after_install.sh
移除重复依赖安装,仅安装生产环境需要的进程管理和静态服务工具:
#!/bin/bash npm install -g serve pm2
4. 修改 app_start.sh
移除阻塞的开发服务器启动指令,改为用 pm2 托管生产静态资源:
#!/bin/bash cd /home/ec2-user/server # 清理旧进程,避免端口占用 pm2 delete econote-dashboard 2>/dev/null || true # 启动静态资源服务,默认监听3000端口,可修改-l参数指定端口 pm2 start serve --name "econote-dashboard" -- -s build -l 3000 pm2 startup pm2 save
补充说明
日志中输出的所有 Hooks、未使用变量、JSX 规范类提示均为 ESLint 代码规范警告,不属于运行错误,不会影响服务正常启动,如需消除警告可根据提示内容修改对应代码即可。
内容的提问来源于stack exchange,提问作者user15884878
相关产品推荐
相关产品推荐

