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

GitHub Actions部署NestJS(EC2)失败:Dist文件夹缺失问题求解

解决GitHub Actions部署NestJS到EC2时缺少Dist文件夹的问题

你的问题根源很明确:GitHub Actions里的构建产物dist只在GitHub的运行环境里生成,并没有传到EC2服务器;而服务器上拉取的Git仓库因为dist在.gitignore里,自然没有这个文件夹。绝对不要把dist从.gitignore里移除——构建产物属于生成文件,提交到Git会大幅增加仓库体积,每次代码变更都会产生大量无意义的diff,严重影响版本管理。

推荐用以下两种方案解决,优先选方案一:

方案一:在GitHub Actions中构建后,将产物传到EC2

这种方式能保证构建环境统一(用GitHub官方的Ubuntu环境),避免服务器环境差异导致的构建问题,同时不用在服务器安装依赖,速度更快。

修改你的CICD工作流脚本如下:

name: CICD

on:
  push:
    branches: ['dev']

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Set up Node.js
        uses: actions/setup-node@v2
        with:
          node-version: '16'
      - name: Install dependencies and build
        run: |
          yarn install --frozen-lockfile
          yarn build
      - name: Upload build artifacts
        uses: actions/upload-artifact@v3
        with:
          name: nest-build
          path: |
            dist/
            package.json
            yarn.lock

  deploy:
    needs: [build]
    runs-on: ubuntu-latest

    steps:
      - name: Download build artifacts
        uses: actions/download-artifact@v3
        with:
          name: nest-build
          path: ./build
      - name: Upload build files to EC2
        uses: appleboy/scp-action@master
        with:
          host: ${{ secrets.REMOTE_IP }}
          username: ${{ secrets.REMOTE_SSH_ID }}
          key: ${{ secrets.REMOTE_SSH_KEY }}
          port: ${{ secrets.REMOTE_SSH_PORT }}
          source: "./build/*"
          target: "/home/ubuntu/api/favi2-api/"
      - name: Restart application via PM2
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.REMOTE_IP }}
          username: ${{ secrets.REMOTE_SSH_ID }}
          key: ${{ secrets.REMOTE_SSH_KEY }}
          port: ${{ secrets.REMOTE_SSH_PORT }}
          script: |
            cd /home/ubuntu/api/favi2-api
            pm2 reload my_app

关键修改点:

  1. Build阶段新增上传产物:用actions/upload-artifact把构建好的dist、依赖配置文件package.json和yarn.lock打包成artifact,传到GitHub的临时存储。
  2. Deploy阶段下载并传输:先下载artifact到当前运行环境,再用scp-action把文件传到EC2服务器的应用目录,最后重启PM2服务。

方案二:在EC2服务器上直接构建(不推荐)

如果暂时不想改工作流,也可以让服务器拉取代码后自行构建,但这种方式有明显弊端:服务器需要配置Node.js和Yarn环境,每次部署都要重新安装依赖,速度慢,且可能因为环境版本不一致导致构建失败。

修改Deploy阶段的脚本即可:

# ... 其他部分不变
deploy:
  needs: [build]
  runs-on: ubuntu-latest

  steps:
    - name: SSH and Deploy
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.REMOTE_IP }}
        username: ${{ secrets.REMOTE_SSH_ID }}
        key: ${{ secrets.REMOTE_SSH_KEY }}
        port: ${{ secrets.REMOTE_SSH_PORT }}
        command_timeout: 20m
        script: |
          cd /home/ubuntu/api/favi2-api
          git pull origin dev
          yarn install --frozen-lockfile
          yarn build
          pm2 reload my_app

内容的提问来源于stack exchange,提问作者Mamochi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:35:06