Jenkins SSH 发布卡在 put [xxxxxx.jar]
日志特征:
SSH: cd [目录]
SSH: OK
SSH: put [xxx.jar]
前面全部 OK,卡在 put 上传 jar 这一步,不再往下跑。
put = sftp 上传文件,正在把本地构建好的 jar 传到远端服务器 对应的目录
最常见 4 个原因(按概率排序)
1)远端服务器磁盘空间不足(dh -f !极高嫌疑)
目标机器:ip,就是刚才那台机器
- /dev/vda1 使用率 86%,剩余 14G;如果 jar 包很大,磁盘写满,sftp‑put 就会卡死、不报错、不超时,Jenkins 任务挂住。
登录这台机器确认:
df -h
如果根盘继续上涨,sftp 写入直接僵死。
2)当前的 用户对 对应的目录 目录没有写入权限
Jenkins SSH 插件使用用户:用户
登录远端机器执行:
cd 对应的目录
ls -ld .
看目录属主是不是 用户:用户。
如果目录是 root 权限,bigdata 能 cd 进去,但无法上传文件,put 直接卡住。
修复权限:
sudo chown -R 用户:用户 目录
3)jar 包本身太大;网络带宽慢,上传时间超过插件超时时间
- 大 jar,网络慢,上传耗时很久;Jenkins SSH 插件默认超时不够,任务卡住。
现象:Jenkins 控制台没有输出,进度不动,不是报错,是还在传。
SSH 插件配置修改:
- Jenkins → 系统管理 → SSH Servers → 找到 对应 jenkins下面的 配置
- 超时时间(Timeout) 默认一般 10–30 秒,改成 300(5 分钟)
- 或者构建脚本改成:先传到临时目录,再 mv,不要直接 put 覆盖正在运行的 jar。
4)SELinux / 防火墙、磁盘 IO 打满
服务器 IO 负载很高,磁盘忙,sftp 写入阻塞。
登录机器看负载:
top
iostat -x 1
快速定位问题的调试方法(建议先做)
方式 1:手动本地 sftp 复现,直接看会不会卡死
在 Jenkins 机器手动执行 sftp 模拟 Jenkins 行为:
sftp -P22 用户名@ip
cd 对应目录
put xxxx.jar
如果这里手动 sftp 也卡住 → 问题在目标服务器侧(磁盘 / 权限 / IO),不在 Jenkins。
如果手动 sftp 上传很快成功 → Jenkins 插件问题(超时、版本 bug)。
方式 2:不要直接 put 覆盖运行中的 jar(重要坑)
现在逻辑:直接 put 上传 jar 到 /对应的目录
如果该 jar 正在被 Java 进程占用,部分环境 sftp put 会僵死!
最佳实践改流程:
避免直接覆盖正在被进程打开的 jar 包。
结合你业务完整改造 Jenkins 发布脚本思路
原来流程:
sftp cd 目录 → put jar 【卡住点】 → ssh 执行备份、mv、重启
改成安全流程:
cd 目录
脚本
mv 上传好的jar 移动到的最终的地址
重启
立刻检查这两点优先(你的环境高概率命中)
如果手动 sftp 复现也卡住,90% 就是磁盘满 / 权限问题;手动 sftp 正常,就调 Jenkins SSH 插件超时。
你可以看一下:任务卡在这里,服务器 对应上传的谬了 有没有生成部分大小的 .part 临时 jar 碎片?有的话就是上传写不进去。
查看对应的jar的大小:ls -lh 对应jar包





