You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Jenkins环境下Fastlane match无法通过SSH连接证书仓库问题排查

问题原因&解决方向

我之前碰到过几乎一模一样的部署问题!核心根源是Jenkins运行的系统用户和你手动操作的终端用户不是同一个身份,导致两者的SSH配置(尤其是known_hosts文件)完全独立,Jenkins用户并未信任目标Git服务器的主机密钥,从而在无交互环境下挂起等待确认。

具体原因拆解

你在终端执行git clone时是用自己的个人用户操作的,确认主机密钥后,该密钥会被写入你个人用户目录下的~/.ssh/known_hosts;但Jenkins在macOS上默认是以jenkins系统用户(或你自定义的专用用户)运行的,它的SSH配置目录是独立的(比如/Users/Shared/Jenkins/.ssh/),根本没有目标服务器的信任记录,而Jenkins是无交互的后台进程,无法像终端那样弹出确认提示,所以进程就一直挂起在这里。

分步解决方法

1. 确认Jenkins运行的系统用户

先在Jenkins控制台执行以下命令,获取Jenkins实际运行的用户:

whoami

一般结果是jenkins,如果是自定义用户,记下来这个用户名。

2. 让Jenkins用户信任目标Git服务器的主机密钥

有两种方式可以实现:

  • 方式一:切换到Jenkins用户手动确认
    在macOS终端执行以下命令切换到Jenkins用户(假设用户是jenkins):

    sudo su - jenkins
    

    然后执行你之前的git clone命令:

    git clone ssh://git@xxx.xx.x.xxx:xxxx/cert/ios-certificates-profiles.git
    

    此时会弹出确认密钥的提示,输入yes回车即可,这一步会把主机密钥写入Jenkins用户的~/.ssh/known_hosts文件。

  • 方式二:手动复制密钥到Jenkins的known_hosts
    如果切换Jenkins用户失败(比如没有shell权限),可以直接从你的终端用户known_hosts里复制对应密钥:

    1. 在你的终端执行:
      cat ~/.ssh/known_hosts | grep xxx.xx.x.xxx
      
      复制输出的那一行密钥内容。
    2. 找到Jenkins用户的SSH目录(常见路径:/Users/Shared/Jenkins/.ssh//var/lib/jenkins/.ssh/),如果没有known_hosts文件就新建一个,然后把刚才复制的密钥行粘贴进去。

3. 修正Jenkins SSH目录的权限

SSH对文件权限要求严格,必须确保以下权限设置正确:

# 给Jenkins的.ssh目录设置700权限
chmod 700 /path/to/jenkins/.ssh
# 给known_hosts文件设置600权限
chmod 600 /path/to/jenkins/.ssh/known_hosts

替换/path/to/jenkins/.ssh为实际的Jenkins SSH目录路径。

4. (可选)Fastlane配置层面的临时绕过(不推荐)

如果是内部完全可信的服务器,可以在Fastlane的MatchfileFastfile里配置跳过主机密钥检查,避免交互等待:
match动作里添加git_ssh_command参数:

match(
  type: "appstore",
  git_ssh_command: "ssh -o StrictHostKeyChecking=no"
)

⚠️ 注意:这种方式会跳过SSH主机密钥验证,存在安全风险,仅建议在测试环境或完全可控的内部网络中使用。

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

火山引擎 最新活动