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

Gitlab CI/CD部署Laravel项目触发分支时报Permission denied错误如何解决?

Gitlab: Permission denied (publickey,keyboard-interactive). fatal: Could not read from remote repository

核心错误原因

你在CI流程中注入的$SSH_PRIVATE_KEY仅作用于GitLab Runner当前执行环境,当你通过ssh root@mywebsite.com登录到目标服务器后,目标服务器本身没有配置可以访问你的GitLab仓库的SSH密钥,所以在目标服务器执行git pull时会触发权限校验失败。

前置排查项

如果确认已配置仓库权限仍报错,请先检查以下配置:

  • 确认GitLab项目的CI/CD变量中$SSH_PRIVATE_KEY配置正确,是可以登录目标服务器的私钥,没有多余的换行或者空格
  • 确认目标服务器的sshd配置中已开启公钥认证,/etc/ssh/sshd_config中PubkeyAuthentication yes配置已生效
可行解决方案

方案1:配置目标服务器为GitLab项目部署密钥(推荐)

  • 登录你的目标服务器mywebsite.com,执行ssh-keygen -t ed25519生成SSH密钥对,一路回车使用默认配置即可
  • 执行cat ~/.ssh/id_ed25519.pub复制输出的公钥内容
  • 打开GitLab对应项目的「设置」-「仓库」-「部署密钥」,粘贴刚才复制的公钥,按需勾选「允许推送权限」(仅拉取代码可以不勾选)后保存
  • 首次配置完成后可手动在目标服务器执行一次git pull git@gitlab.com:groupname/project/nas-project.git dev,确认可以正常拉取后再触发CI流水线

方案2:开启SSH代理转发(临时使用)

无需在目标服务器存储密钥,直接转发CI环境的SSH代理权限,修改gitlab-ci.yml中deploy阶段的ssh命令,添加-A参数即可:

deploy:
  stage: deploy
  script:
    - *change_file_permissions
    - ssh -A root@mywebsite.com "cd /home/root/public_html/files && git pull git@gitlab.com:groupname/project/nas-project.git dev && exit"
  environment:
    name: live
    url: mywebsite.com
  only:
    - dev

该方案安全等级低于方案1,仅推荐临时测试场景使用。

可选优化建议
  • 当前before_script中配置的StrictHostKeyChecking no存在安全风险,建议改为提前将GitLab和目标服务器的主机公钥写入CI环境的~/.ssh/known_hosts文件中
  • 不建议直接使用root用户部署项目,建议单独创建站点运行用户执行部署操作,降低服务器安全风险

内容的提问来源于stack exchange,提问作者Faisal Faiz Michankhel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 17:57:06