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

通过GitHub Action部署至EC2实例时出现Git操作及认证错误

问题排查与修复方案

核心错误解析及修复

1. 分支操作逻辑混乱

你遇到的分支相关错误(foo分支已存在、无法删除当前分支master、master分支已存在)都是因为脚本里的分支操作逻辑漏洞:

  • 首次部署失败后,foo分支没有被删除,再次执行时重复创建就会报错
  • 你试图删除当前正在检出的master分支,Git明确禁止这种操作
  • 重复创建已经存在的master分支完全没必要

修复方法:替换冗余的分支创建/删除逻辑,改用更可靠的代码同步方式:

# 切换到临时分支foo(存在则直接切换,不存在再创建)
if git show-ref --verify --quiet refs/heads/foo; then
  git checkout foo
else
  git checkout -b foo
fi

# 直接将本地master分支重置为远程master-f的最新版本
git fetch origin master-f:master
# 切回master分支
git checkout master
# 强制拉取确保完全同步
git pull origin master-f --force
# 删除临时分支
git branch -D foo

2. Git HTTPS凭证缺失

fatal: could not read Username for 'https://github.com'错误说明EC2上的仓库使用HTTPS协议,但没有配置自动凭证,导致拉取代码时需要手动输入用户名密码,而脚本环境无法提供。

修复方法:

  • 先在EC2实例上执行一次,把仓库远程地址改为SSH格式(永久生效):
    git remote set-url origin git@github.com:<你的用户名>/<仓库名>.git
    
  • 或者在部署脚本中添加上述命令,确保每次部署都使用SSH协议拉取。

同时要确认EC2上的/home/ec2-user/.ssh/github密钥已经添加到GitHub仓库的部署密钥中,拥有拉取权限,且密钥文件权限为600(执行chmod 600 /home/ec2-user/.ssh/github)。

3. npm --force的警告

npm WARN using --force只是警告,不是错误,但--force会跳过依赖冲突检测,生产环境更推荐使用npm ci,它会严格按照package-lock.json安装精确版本,更稳定:

npm ci && npm run build

优化后的完整GitHub Action配置

name: Deploy to x-web

on:
  push:
    branches: [ master ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout
      uses: actions/checkout@v2

    - name: Register Private Key
      uses: webfactory/ssh-agent@v0.5.4
      with:
          ssh-private-key: ${{ secrets.PRIVATE_KEY }}
          
    - name: Deploy to EC2  
      env:
        HOSTNAME: XX.XX.X.XX
        USER_NAME: ec2-user
        REPO_SSH_URL: git@github.com:<你的用户名>/<仓库名>.git # 替换为实际仓库SSH地址
      run: |
          ssh -o StrictHostKeyChecking=no ${USER_NAME}@${HOSTNAME} '
          cd ./x-web
          # 确保远程仓库使用SSH协议
          git remote set-url origin '"${REPO_SSH_URL}"'
          # 启动SSH代理并加载密钥
          eval $(ssh-agent -s)
          ssh-add /home/ec2-user/.ssh/github
          # 安全同步远程代码到本地
          if git show-ref --verify --quiet refs/heads/foo; then
            git checkout foo
          else
            git checkout -b foo
          fi
          git fetch origin master-f:master
          git checkout master
          git pull origin master-f --force
          git branch -D foo
          # 安装依赖并构建
          npm ci && npm run build
          # 重启服务
          pm2 restart Frontend
          '

额外检查项

  • 确认EC2上的pm2已正确注册Frontend应用,可通过pm2 list验证
  • 确保GitHub Secrets中的PRIVATE_KEY是EC2实例的SSH私钥,拥有登录权限
  • 脚本中所有变量(如REPO_SSH_URL)需替换为实际值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:48:26