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

GitLab流水线可推送至远程仓库但SSH连接失败求助

排查并解决GitLab CI中Acquia服务器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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:05:24