GitLab流水线中如何通过SSH远程在目标机器安装RPM文件
远程安装RPM的可靠实现方案
你的原命令存在4个明确问题,直接导致执行卡住、错误码丢失:
- 写入SSH私钥时未给变量加双引号,Shell会自动把私钥内容里的换行替换为空格,PEM格式直接损坏,SSH握手阶段会一直卡住等待密码输入
- 生成的私钥文件没有设置严格权限,SSH默认会拒绝读取权限高于600的私钥文件
- 加了
-tt参数强制分配交互式终端,和管道传入的非交互式命令冲突,会出现IO阻塞挂死 - 末尾硬加
exit 0会强制覆盖所有前置命令的返回状态,不管安装成不成功都会返回成功
可直接复用的流水线命令
Alpine Runner默认不带SSH客户端,先装依赖再执行即可,所有错误码会正常透传,安装失败流水线会直接标记失败:
# 安装Alpine环境下的SSH客户端,非Alpine Runner可跳过该行 apk add --no-cache openssh-client # 写入私钥,必须加双引号保留PEM格式换行,同时设置符合SSH要求的文件权限 echo "$ADMIN_SERVER_SSH_KEY" > sshkey.pem chmod 600 sshkey.pem # 执行远程安装,跳过首次连接的主机指纹确认避免卡住 ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i sshkey.pem \ $ADMIN_SERVER_USER@$ADMIN_SERVER_IP \ "yum install -y '替换为你的S3 RPM公网直链' && rpm -q 替换为对应的RPM包名" # 可选:执行完清理本地私钥文件 rm -f sshkey.pem
关键说明
- SSH参数里加
StrictHostKeyChecking=no和UserKnownHostsFile=/dev/null,是为了跳过第一次连接远程机器时的主机指纹确认交互,不会出现无提示卡住 - 远程命令末尾加
rpm -q 包名做二次校验,只要yum安装过程出现下载失败、依赖冲突、包不存在等问题,该命令就会返回非0退出码,通过SSH透传到Runner侧,直接触发流水线失败,不会吞错 - 不要额外加
exit 0,SSH默认会把远程最后一条命令的退出码原样返回给本地执行环境 - 如果目标机器是RHEL 8/CentOS 8及以上版本,把命令里的
yum替换成dnf即可,参数完全一致 - 如果S3链接包含特殊字符,记得用单引号把链接包裹起来避免转义问题
内容的提问来源于stack exchange,提问作者Sara June
相关产品推荐
相关产品推荐

