You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

后端通过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版本与项目依赖要求一致,升级后重新触发部署观察卡顿是否消失

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 10:12:28