本文深入剖析 Jenkins 构建中
Send build artifacts over SSH步骤的超时故障,提供多种实战优化方案及避坑指南。
🔍 问题根源分析
报错信息解读
ERROR: Exception when publishing, exception message [Exec timed out or was interrupted after 120,000 ms]
Build step 'Send build artifacts over SSH' changed build result to UNSTABLE
Finished: UNSTABLE
- ⏱️ 120,000 ms 超时机制:Jenkins 默认限制 SSH 命令执行时间(120秒),超时强制中断
- 🔌 非交互式终端限制:后台脚本未正确返回退出状态码,导致 Jenkins 持续等待(如 exit 0)
- ⚠️ UNSTABLE 状态含义:任务未完全失败,但存在异常中断(区别于 FAILURE)

🛠️ 四大解决方案(附配置截图)
✅ 方案一:增加 SSH 超时时间(推荐)
- 进入任务配置 → Send build artifacts over SSH
- 配置Exec timeout (ms)



⚡ 方案二:启用 PTY 伪终端
在 SSH 高级选项中勾选:
✔️ Exec in PTY [模拟真实终端环境]
作用:确保脚本退出状态能被 Jenkins 正确捕获
📝 方案三:脚本强制退出
在执行的 Shell 命令末尾添加:
# 示例:启动服务后主动退出
nohup ./deploy.sh &
sleep 1 # 等待进程启动
exit 0 # 明确返回成功状态
原理:避免后台进程阻塞 Jenkins 状态检测
🌐 方案四:SSH 服务端优化
修改目标服务器配置(/etc/ssh/sshd_config):
# 每60秒发送心跳包
ClientAliveInterval 60
# 最大失败次数为3
ClientAliveCountMax 3
重启服务生效:
systemctl restart sshd
⚙️ 高级场景配置
1. Pipeline 任务超时控制
在 Jenkinsfile 中使用 timeout 指令:
timeout(time: 10, unit: 'MINUTES') {
sshPublisher(
transfers: [
// SSH传输配置
]
)
}
2. 全局 JNLP 节点超时
调整 Agent 启动参数:
java -jar agent.jar \
-pingTimeout 300 \ # 心跳检测超时(秒)
-noReconnect # 超时后不重连
3. 网络层优化技巧
| 问题类型 | 检测命令 | 解决方案 |
|---|---|---|
| SSH 连接缓慢 | time ssh user@host | 禁用 DNS 反向解析:UseDNS no |
| 跨机房传输丢包 | mtr target_ip | 使用 rsync --partial 断点续传 |
| 防火墙拦截 | telnet ip 22 | 放行目标 IP 的 22 端口 |
💡 避坑指南:高频失败原因
-
脚本未显式退出
❌ 错误示例:nohup ./start.sh &
✅ 修正方案:nohup ./start.sh & && sleep 1 && exit 0 -
资源耗尽导致卡顿
- 检查目标服务器:
top -c - 监控磁盘空间:
df -Th
- 检查目标服务器:
-
环境变量缺失
在脚本开头加载环境:#!/bin/bash source /etc/profile source ~/.bash_profile
📊 超时时间设置参考表
| 场景 | 推荐值 | 配置位置 |
|---|---|---|
| 大文件传输(>1GB) | 300-600 秒 | SSH Exec timeout |
| 服务启动脚本 | 180 秒 | PTY + exit 0 组合 |
| 集群批量部署 | 0(无限制) | 仅限稳定内网环境 |
| 跨境服务器连接 | 300 秒 | ClientAliveInterval 设置 |
🌟 总结
通过以下组合策略可根治 SSH 超时问题:
- 基础设置:SSH 超时 ≥300 秒 + 启用 PTY
- 脚本规范:后台进程后必须跟随
exit 0 - 环境保障:定期检查网络带宽和服务器资源
最终效果:构建日志显示
SUCCESS而非UNSTABLE,传输耗时任务稳定执行完成。


9163

被折叠的 条评论
为什么被折叠?



