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

