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

GitHub Actions部署如何在复制文件前执行npm run build构建流程

GitHub Actions 生产部署配置调整方案

原配置直接全量上传仓库所有文件到VPS,会把未压缩的测试源码、开发配置、测试文件等非生产内容同步到服务器,按以下方式调整即可,核心逻辑是在CI侧提前完成生产构建,仅上传运行必需的生产文件到服务器:

  • 流程前置Node环境配置、依赖安装、生产构建步骤,在GitHub提供的运行器上完成产物打包,不需要把源码传到服务器再构建
  • 收窄SCP同步的文件范围,仅上传构建产物和生产运行必需的配置文件,过滤源码、测试目录、开发依赖、Git配置等无关文件
  • 修正原配置中SSH步骤的参数问题(appleboy/ssh-action的入参为全小写字段,原配置大写的USERNAME、PORT、PASSWORD字段无法被正确读取,会导致SSH认证失败),同时调整远程执行逻辑,跳过重复构建步骤,仅安装生产依赖、启动服务

调整后的完整配置

name: Deploy

# 建议限定仅推送到master分支时触发部署,避免其他分支推送误触发
on:
  push:
    branches: [ master ]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: 拉取仓库代码
      uses: actions/checkout@v4 # 旧版v1已停止维护,改用最新稳定版

    # 配置Node.js环境,版本和你本地生产环境使用的版本保持一致
    - name: 配置Node.js环境
      uses: actions/setup-node@v4
      with:
        node-version: 20 # 替换为项目实际使用的Node版本
        cache: 'npm'

    # 安装依赖并执行生产构建
    - name: 安装依赖&构建生产产物
      run: |
        npm ci
        npm run build

    # 仅同步生产必需文件到VPS,注意调整source路径匹配你项目的构建输出目录
    - name: 通过SCP同步生产文件到服务器
      uses: appleboy/scp-action@master
      with:
        host: ${{ secrets.HOST }}
        username: ${{ secrets.USERNAME }}
        port: ${{ secrets.PORT }}
        password: ${{ secrets.PASSWORD }}
        source: |
          dist/* # 替换为npm run build实际输出的构建目录,常见的还有build、out等
          package.json
          package-lock.json
        target: "/var/www/html/cnaiapp"
        rm: true # 同步前清空目标目录旧文件,避免残留文件干扰
        # 明确排除不需要同步的非生产文件
        exclude: |
          .git
          .github
          node_modules
          *.test.js
          src
          tests

    # 远程执行部署启动命令
    - name: 服务器端执行部署操作
      uses: appleboy/ssh-action@master # develop为开发分支,稳定性差,改用正式版
      with:
        host: ${{ secrets.HOST }}
        username: ${{ secrets.USERNAME }}
        port: ${{ secrets.PORT }}
        password: ${{ secrets.PASSWORD }}
        script: |
          cd /var/www/html/cnaiapp
          # 仅安装生产依赖,跳过开发依赖
          npm ci --production
          # 因CI侧已经完成构建,无需重复执行build,直接启动服务即可
          # 若保留原npm run deploy命令,请先删除命令内的build逻辑,避免服务器端因缺少源码构建失败
          npm run start

注意事项

  • 请根据项目实际情况修改配置里的构建输出目录:如果npm run build的输出目录不是dist,把SCP步骤里的dist/*替换成实际目录名即可,比如React项目默认输出目录为build、Vue项目默认输出目录为dist
  • 如果使用PM2等进程守护工具,可以把远程脚本里的启动命令替换为pm2 restart 你的服务名,实现服务平滑重启
  • 旧版本的actions/checkout@v1和appleboy/ssh-action@develop存在已知兼容性问题,建议替换为配置中使用的稳定版本
  • SCP同步的文件列表可以根据项目实际需求增减,只要保证生产运行必需的文件在列表内、源码和测试文件被排除即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:54:29