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
关键修改点:
- Build阶段新增上传产物:用
actions/upload-artifact把构建好的dist、依赖配置文件package.json和yarn.lock打包成artifact,传到GitHub的临时存储。 - 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
相关产品推荐
相关产品推荐

