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

如何配置CICD实现SSH连接?GitLab Runner流水线SSH失败排查

老哥,我看你遇到的问题是GitLab CI/CD流水线里SSH连不上目标机器,但直接在Runner机器上手动连接就没问题对吧?这情况我碰到好多次了,核心原因就是CI运行的环境和你手动操作的环境完全不一样——CI是用Runner的专属执行用户(一般是gitlab-runner)来跑任务的,而你手动SSH用的是自己的登录用户,这俩环境的SSH配置、权限都不互通。给你几个靠谱的排查和解决思路:

解决GitLab CI/CD SSH连接失败的核心方案

1. 同步SSH密钥到Runner执行用户的环境

你手动能用的SSH密钥,大概率存在你个人用户的~/.ssh/目录下,但CI用的是gitlab-runner用户的环境,所以得把密钥同步过去,还要设置正确的权限(SSH对密钥权限要求很严,权限太宽会直接拒绝):

# 在Runner机器上执行这些命令
sudo cp ~/.ssh/id_rsa /home/gitlab-runner/.ssh/
sudo chown gitlab-runner:gitlab-runner /home/gitlab-runner/.ssh/id_rsa
sudo chmod 600 /home/gitlab-runner/.ssh/id_rsa

另外,别忘了把目标服务器的主机公钥加到gitlab-runner用户的known_hosts里,不然CI会因为首次连接的主机验证弹窗(CI环境是无交互的,弹窗直接导致失败):

sudo -u gitlab-runner ssh-keyscan 你的目标服务器IP/域名 >> /home/gitlab-runner/.ssh/known_hosts

2. 用GitLab CI变量管理SSH密钥(更灵活)

如果不想动Runner机器的本地文件,推荐用GitLab的CI/CD变量来存储私钥,这样更安全也更易维护:

  • 打开项目的「Settings → CI/CD → Variables」,添加一个新变量,比如命名为SSH_PRIVATE_KEY,把你的SSH私钥内容(注意是私钥,不是公钥)粘贴进去,勾选「Protect variable」和「Mask variable」防止泄露
  • 然后在.gitlab-ci.yml里添加初始化SSH的步骤:
stages:
  - test_ssh

test_ssh_job:
  stage: test_ssh
  script:
    # 初始化SSH目录和权限
    - mkdir -p ~/.ssh
    - echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
    - chmod 600 ~/.ssh/id_rsa
    # 添加目标服务器到已知主机
    - ssh-keyscan 你的目标服务器IP/域名 >> ~/.ssh/known_hosts
    # 测试SSH连接
    - ssh 目标服务器用户名@你的目标服务器IP/域名 "echo 'SSH连接成功!'"

3. 临时测试:关闭主机密钥验证(仅测试用)

如果只是想快速验证是不是主机验证的问题,可以在SSH命令里加参数跳过验证,但这个方法不推荐在生产环境用,毕竟不安全:

ssh -o StrictHostKeyChecking=no 目标服务器用户名@你的目标服务器IP/域名 "echo 测试连接"

4. 模拟CI环境排查问题

直接在Runner机器上切换到gitlab-runner用户,模拟CI的执行环境,看看手动执行SSH命令会不会失败:

sudo su - gitlab-runner
ssh 目标服务器用户名@你的目标服务器IP/域名

如果这个命令也失败,那说明问题出在gitlab-runner用户本身的SSH配置上,回到第一步重新检查密钥和权限就行。

内容的提问来源于stack exchange,提问作者Mansoor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:33:43