后端通过GitHub Actions部署至EC2频繁卡顿,求排查解决步骤
GitHub Actions部署EC2后端卡顿问题排查方案
问题描述
- 后端项目通过GitHub Actions自动部署至EC2实例,近期修改代码后部署耗时过长,频繁卡在流程中,主要卡在
tsc -p .环节,偶尔随机卡在其他步骤 - 本地环境编译无异常,已保存GitHub Actions日志
- 曾修复TypeScript编译错误并成功部署一次,但之后又出现无错误的卡顿情况
- 怀疑Node.js 16.x版本过旧是否为诱因,EC2实例本身无硬件问题
现有配置
GitHub Actions工作流配置
name: Node.js CI Backend on: push: branches: ["main"] paths: ["backend/**"] jobs: deploy_backend: runs-on: ubuntu-latest strategy: matrix: node-version: [16.x] steps: - uses: actions/checkout@v3 - name: Authentication with ec2 uses: appleboy/ssh-action@v0.1.6 with: host: ${{ secrets.BACKEND_HOSTNAME}} username: ${{ secrets.BACKEND_USER}} key: ${{ secrets.BACKEND_SSH_KEY }} port: ${{ secrets.BACKEND_PORT }} script: | cd /home/webapps/mvp/backend sudo git reset --hard sudo git pull https://github.com/abcd/mvp ./deploy.sh
deploy.sh脚本内容
dir="/home/webapps/mvp/backend" echo "${cyan}Generating Backup${clear}" ts-node ${dir}/scripts/backupDB.ts echo "${green}Backup creation Sucessful ! ${clear}" cd ${dir} echo "${cyan}Getting ready to deploy${clear}" echo "${cyan}Installing and Updating Dependencies${clear} 🛠" sudo npm i echo "${green}Done:${clear} Installing and Updating Dependencies" echo "${cyan}Now Genrating Prisma Client${clear} 🛠" npx prisma generate echo "${green}Done:${clear} Genrating Prisma Client" echo "${cyan}Migrating Schema${clear} 🛠" npx prisma migrate deploy echo "${green}Done:${clear} Migrating Schema" echo "${cyan}Manifesting build directory${clear} 🛠" npm run build echo "${green}Done:${clear} build directory manifested" pm2 reload "npm start" --update-env echo "${green}All Done${clear} ✨" echo "${green}Success:${clear} Server is now live 🚀"
排查与解决步骤
1. 验证Node.js版本问题
- 升级EC2上的Node.js至LTS版本(如18.x或20.x):
- 使用nvm安装:
nvm install 20 && nvm alias default 20 - 确保全局Node版本与项目依赖要求一致,升级后重新触发部署观察卡顿是否消失
- 使用nvm安装:
2. 优化TypeScript编译环节
- 在
tsconfig.json中开启增量编译:添加"incremental": true,生成.tsbuildinfo缓存编译结果,减少重复编译耗时 - 在EC2上手动执行
tsc --diagnostics,查看编译耗时的具体模块,排查循环依赖或复杂类型计算问题 - 明确
tsconfig.json的include和exclude范围,避免编译无关文件
3. 定位部署脚本阻塞点
- 在
deploy.sh关键步骤前后添加时间戳日志,精准定位卡顿阶段:echo "$(date +'%Y-%m-%d %H:%M:%S') Starting build..." npm run build echo "$(date +'%Y-%m-%d %H:%M:%S') Build completed..." - 手动在EC2上执行完整
deploy.sh脚本,同时用top/htop监控CPU、内存占用,排查资源耗尽情况 - 将
ts-node ${dir}/scripts/backupDB.ts替换为预编译的JS文件(本地编译backupDB.ts为backupDB.js后,用node ${dir}/scripts/backupDB.js执行),避免实时编译开销
4. 优化部署流程稳定性
- 升级
appleboy/ssh-action至最新版本(当前v0.1.6版本较旧,新版有稳定性修复) - 调整项目目录权限,避免全程使用
sudo执行命令,减少权限相关的隐性阻塞 - 改用
npm ci替代npm i,并在EC2上缓存node_modules目录,缩短依赖安装时间
5. 检查系统与日志状态
- 查看EC2系统日志(
/var/log/syslog或/var/log/messages),排查磁盘IO过高、进程僵死记录 - 分析GitHub Actions完整日志,确认卡顿阶段是否存在隐性错误(如权限不足导致的静默阻塞)
- 查看PM2日志,检查服务重启阶段的资源占用情况
内容的提问来源于stack exchange,提问作者Siddharth Joshi
相关产品推荐
相关产品推荐

