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

