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

Github Actions中ssh-action的Node版本无法更新问题求助

解决GitHub Actions部署Next.js到VPS时Node.js版本不匹配问题

问题描述

我需要在代码仓库的production分支有推送操作时,通过GitHub Actions将Next.js应用部署到VPS,但部署失败。错误显示VPS上的Node.js版本始终是v12.22.9,不符合Next.js 13.4.8要求的>=16.8.0版本。虽然我在GitHub Actions的main.yml中已经用actions/setup-node@v3.3.0指定了Node.js 18.x版本,但问题依然存在。

我的main.yml配置

name: Deploy

on:
  push:
    branches: [ production ]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Use Node.js 18
        uses: actions/setup-node@v3.3.0
        with:
          node-version: 18
      - name: Deploy using ssh
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USER }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          port: 22
          script: |
            node -v
            ./deploy-landing.sh

部署时的错误信息

out: v12.22.9
...
err: npm WARN EBADENGINE Unsupported engine {
err: npm WARN EBADENGINE   package: 'next@13.4.8',
err: npm WARN EBADENGINE   required: { node: '>=16.8.0' },
err: npm WARN EBADENGINE   current: { node: 'v12.22.9', npm: '8.5.1' }
err: npm WARN EBADENGINE }
...
out: > next build
err: /var/www/landing/node_modules/next/dist/build/index.js:435
err:                     ...pageKeys.app ?? []

问题原因

actions/setup-node@v3.3.0是在GitHub提供的ubuntu-latest runner上设置Node.js版本,而SSH脚本是在你的VPS服务器上执行的,两者属于完全独立的环境。runner上的Node版本设置不会影响VPS上的Node环境,所以VPS依然使用默认安装的旧版本Node.js。

解决方案

方案1:在VPS上切换到Node.js 18版本

直接在VPS上升级或切换Node.js版本,确保部署脚本使用符合要求的版本。

如果你用nvm管理Node.js

在deploy-landing.sh的开头添加以下命令,确保加载nvm并切换到18版本:

# 加载nvm环境变量
source ~/.nvm/nvm.sh
# 如果已经安装过Node 18,直接切换
nvm use 18
# 如果没安装过,先安装再设置为默认
# nvm install 18
# nvm alias default 18

如果你用apt包管理器安装Node.js

先卸载旧版本,再添加NodeSource的18.x源安装新版本:

sudo apt remove nodejs -y
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install nodejs -y

方案2:在GitHub Runner上构建,再上传产物到VPS

推荐这种方式:先在GitHub Runner上用指定的Node.js 18构建Next.js应用,再把构建好的产物传到VPS,避免在VPS上处理版本问题,同时节省VPS资源。

修改后的main.yml配置:

name: Deploy

on:
  push:
    branches: [ production ]

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    steps:
      - name: 拉取代码
        uses: actions/checkout@v4

      - name: 设置Node.js 18
        uses: actions/setup-node@v3.3.0
        with:
          node-version: 18
          cache: 'npm' # 缓存npm依赖,加快构建速度

      - name: 安装依赖并构建
        run: |
          npm install
          npm run build

      - name: 上传构建产物到VPS
        uses: appleboy/scp-action@master
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USER }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          port: 22
          source: ".next,package.json,package-lock.json" # 根据你的项目调整需要上传的文件
          target: "/var/www/landing"

      - name: 在VPS上启动应用
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USER }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          port: 22
          script: |
            cd /var/www/landing
            npm install --production # 只安装生产依赖
            # 这里替换成你的应用启动命令,比如用pm2管理进程
            pm2 restart landing || pm2 start npm --name landing -- start

方案对比

  • 方案1:适合需要在VPS上进行构建的场景,但需要手动维护VPS的Node.js环境
  • 方案2:构建过程在GitHub Runner完成,能确保使用指定版本的Node.js,减少VPS资源占用,更适合现代前端项目部署

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 09:13:22