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
相关产品推荐
相关产品推荐

