GitLab流水线可推送至远程仓库但SSH连接失败求助
从你的CI执行日志能看到,代码推送Acquia仓库完全正常,但after_script里的SSH连接却报Permission denied (publickey)——这说明Git仓库的密钥授权和服务器SSH登录的授权是两套独立的配置,咱们一步步来定位问题:
一、先确认核心授权问题:密钥是否在Acquia服务器上被允许
Acquia的Git部署密钥和服务器SSH登录密钥是分开管理的:
- 你用来推代码的
SSH_PRIVATE_KEY对应的公钥,是添加到了Acquia仓库的部署密钥里(这也是推送成功的原因); - 但服务器SSH登录需要把同一公钥添加到Acquia Cloud控制台对应环境的SSH Keys列表中(在环境设置的"SSH Keys"选项里)。
验证方法:在本地用同一个私钥尝试SSH登录目标服务器:
ssh maindecoupled.dev@maindecoupleddev.ssh.prod.acquia-sites.com
如果本地也报错,直接去Acquia控制台补加公钥即可;如果本地能正常登录,那问题出在CI环境的密钥配置上。
二、修复CI环境中的SSH密钥配置细节
1. 确保密钥文件的权限和完整性
你当前是通过ssh-add把密钥加载到agent,但有些场景下agent可能不稳定,更可靠的方式是直接把密钥写入文件并设置严格权限:
在before_script里替换原有的ssh-agent相关步骤,改成:
mkdir -p ~/.ssh chmod 700 ~/.ssh # 将私钥写入文件,确保格式完整 echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa # SSH要求私钥权限必须是600,否则会拒绝使用
2. 优化SSH配置,指定身份文件
在~/.ssh/config里明确指定要使用的密钥文件,避免SSH自动查找出错:
echo "HOST *" > ~/.ssh/config echo "StrictHostKeyChecking no" >> ~/.ssh/config echo "IdentityFile ~/.ssh/id_rsa" >> ~/.ssh/config # 新增这一行 chmod 600 ~/.ssh/config # 配置文件权限也要设为600
3. 正确添加服务器的known_hosts
你之前直接把$GIT_URL写入known_hosts,这其实是Git仓库的地址,和SSH服务器地址不一样。应该用ssh-keyscan来获取目标SSH服务器的公钥:
# 提取SSH服务器地址并添加到known_hosts ssh-keyscan -H maindecoupleddev.ssh.prod.acquia-sites.com >> ~/.ssh/known_hosts chmod 644 ~/.ssh/known_hosts
三、验证SSH用户的正确性
确认maindecoupled.dev是Acquia环境的有效SSH用户名:Acquia的SSH用户名格式通常是[站点名].[环境名],你可以在Acquia控制台的环境详情页找到准确的用户名,避免拼写错误。
四、可选:查看服务器SSH日志定位具体原因
如果本地能登录服务器,可查看SSH日志获取更详细的拒绝原因:
# Debian/Ubuntu系统 tail /var/log/auth.log # RHEL/CentOS系统 tail /var/log/secure
日志里会明确告诉你是密钥不匹配、用户不存在还是权限设置问题。
五、优化你的.gitlab-ci.yml(修改后版本)
这里给你调整后的完整配置,修复了密钥处理和SSH配置问题,同时移除了多余的分支创建步骤:
build app: stage: build only: - feature/ci-pipeline-job-v2 before_script: - echo "before script" # 安装SSH客户端(如果需要) - 'command -v ssh >/dev/null || ( apt-get update -y && apt-get install openssh-client -y )' # 配置SSH目录和密钥 - mkdir -p ~/.ssh - chmod 700 ~/.ssh - echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa - chmod 600 ~/.ssh/id_rsa # 配置SSH全局设置 - echo "HOST *" > ~/.ssh/config - echo "StrictHostKeyChecking no" >> ~/.ssh/config - echo "IdentityFile ~/.ssh/id_rsa" >> ~/.ssh/config - chmod 600 ~/.ssh/config # 添加Git仓库和SSH服务器的known_hosts - ssh-keyscan -H $(echo "$GIT_URL" | cut -d'@' -f2 | cut -d':' -f1) >> ~/.ssh/known_hosts - ssh-keyscan -H maindecoupleddev.ssh.prod.acquia-sites.com >> ~/.ssh/known_hosts - chmod 644 ~/.ssh/known_hosts # Git用户配置 - git config user.email "user.villiers@main.com" - git config user.name "user-main" - git remote add acquia $GIT_URL script: - echo "running the script" - git push acquia feature/ci-pipeline-job-v2 after_script: - echo "time to ssh" - ssh maindecoupled.dev@maindecoupleddev.ssh.prod.acquia-sites.com "cd /var/www/html && ls -la && composer install"
内容的提问来源于stack exchange,提问作者Sidney Sousa

