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服务器完全无关。
更新后配置的错误点
- 私钥写入格式错误:脚本里用
echo "${{ secrets.SSH_KEY }}" > ~/.ssh/id_rsa会把私钥包裹在双引号里写入文件,导致SSH识别无效的私钥。 - 私钥换行丢失:直接用
echo写入包含换行的私钥时,部分环境会丢失换行,破坏私钥结构。 - 权限配置不全:仅设置
id_rsa为600,但未确保.ssh目录的权限为700,SSH会拒绝使用权限不符合要求的密钥文件。 - 多余步骤无效:
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]
关键修正说明
- 直接用ssh-action的key参数传递私钥:appleboy/ssh-action本身支持通过
key参数传入私钥,无需手动在服务器上创建id_rsa文件,彻底避免权限和格式问题。 - 所有操作都在SSH脚本内执行:确保
cd、git pull、npm命令都在DO服务器上运行,而非runner虚拟机。 - 简化known_hosts配置:直接用
ssh-keyscan github.com添加信任,避免复杂的dig命令出错。 - 明确权限设置:显式设置
.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
相关产品推荐
相关产品推荐

