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

GitHub Action部署Node应用至Digital Ocean:Git拉取与权限异常

问题根源分析

初始配置的核心错误

你之前的工作流逻辑完全错误:git pull、npm install等步骤都是在GitHub提供的runner虚拟机(ubuntu-20.04)上执行的,而非你的Digital Ocean服务器。这就是为什么手动在DO服务器上pull能拿到更新,但工作流里显示Already up to date——runner上刚checkout的代码就是最新的,和DO服务器完全无关。

更新后配置的错误点

  1. 私钥写入格式错误:脚本里用echo "${{ secrets.SSH_KEY }}" > ~/.ssh/id_rsa会把私钥包裹在双引号里写入文件,导致SSH识别无效的私钥。
  2. 私钥换行丢失:直接用echo写入包含换行的私钥时,部分环境会丢失换行,破坏私钥结构。
  3. 权限配置不全:仅设置id_rsa为600,但未确保.ssh目录的权限为700,SSH会拒绝使用权限不符合要求的密钥文件。
  4. 多余步骤无效:Checkout和npm run build步骤在runner上执行,不是DO服务器,完全多余。

修正后的工作流配置

name: Deploy app

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-20.04

    steps:
      - name: Deploy to Digital Ocean via SSH
        uses: appleboy/ssh-action@v0.1.7
        with:
          host: ${{ secrets.SSH_HOST }}
          username: ${{ secrets.SSH_USERNAME }}
          key: ${{ secrets.SSH_KEY }}  # 直接用插件参数传递私钥,无需手动写入文件
          passphrase: ${{ secrets.SSH_PASSPHRASE }}
          script: |
            # 进入目标目录
            cd /saver
            
            # 配置GitHub主机信任(简化版)
            mkdir -p ~/.ssh
            ssh-keyscan github.com >> ~/.ssh/known_hosts
            chmod 700 ~/.ssh
            chmod 600 ~/.ssh/known_hosts
            
            # 拉取最新代码
            git pull origin main
            
            # 安装依赖并构建项目
            npm run client:prodinstall
            npm run client:build
            npm run server:prodinstall
            npm run server:build
            
            # 如需重启服务,取消注释下面一行
            # pm2 restart [appname]

关键修正说明

  1. 直接用ssh-action的key参数传递私钥:appleboy/ssh-action本身支持通过key参数传入私钥,无需手动在服务器上创建id_rsa文件,彻底避免权限和格式问题。
  2. 所有操作都在SSH脚本内执行:确保cd、git pull、npm命令都在DO服务器上运行,而非runner虚拟机。
  3. 简化known_hosts配置:直接用ssh-keyscan github.com添加信任,避免复杂的dig命令出错。
  4. 明确权限设置:显式设置.ssh目录权限为700,known_hosts为600,符合SSH安全要求。

额外检查项

  • 确认SSH密钥配对:确保存入仓库Secret的SSH_KEY是DO服务器上的完整私钥(包含-----BEGIN RSA PRIVATE KEY-----和-----END RSA PRIVATE KEY-----),对应的公钥已添加到GitHub仓库的Deploy keys(仓库Settings > Deploy keys),拉取代码只需勾选只读权限。
  • 检查服务器git远程配置:在DO服务器上执行cd /saver && git remote -v,确认origin是GitHub仓库的SSH地址(如git@github.com:your-username/your-repo.git),而非HTTPS地址。
  • 测试私钥有效性:在本地用ssh -i /path/to/your-private-key username@ssh-host git@github.com测试,确认能成功连接GitHub,权限正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 01:59:59