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里复制对应密钥:- 在你的终端执行:
复制输出的那一行密钥内容。cat ~/.ssh/known_hosts | grep xxx.xx.x.xxx - 找到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的Matchfile或Fastfile里配置跳过主机密钥检查,避免交互等待:
在match动作里添加git_ssh_command参数:
match( type: "appstore", git_ssh_command: "ssh -o StrictHostKeyChecking=no" )
⚠️ 注意:这种方式会跳过SSH主机密钥验证,存在安全风险,仅建议在测试环境或完全可控的内部网络中使用。
内容的提问来源于stack exchange,提问作者mmvie




