通过Jenkins部署Akka-Scala Jar包至远程服务器的部署难题
嘿,我正好之前部署过Akka-Scala应用,也踩过Jenkins SSH执行命令返回码的坑,来给你梳理下解决方案!
你遇到的核心问题是:当目标进程不存在时,pkill或者ps|grep|kill这类命令会返回非0的退出码,哪怕加了|| true有时候也不生效——这大概率是因为管道命令的返回码逻辑或者Jenkins对命令退出码的严格检查导致的。
给你几个靠谱的解决方案:
方案1:先检查进程存在再执行kill
用pgrep先判断进程是否存在,只有存在时才执行pkill,这样就不会因为无匹配进程返回错误码:if pgrep -f "%proc%" > /dev/null; then pkill -f "%proc%"; fi这里
%proc%替换成你的应用进程标识(比如Jar包名称或者应用的主类名)。方案2:优化管道命令的错误处理
如果坚持用ps|grep|kill的组合,要处理两个关键点:过滤掉grep自身的进程,同时忽略kill无目标的错误:ps ax | grep "%proc%" | grep -v grep | awk '{print $1}' | xargs kill -9 2>/dev/null || true其中
2>/dev/null用来屏蔽kill找不到进程时的错误输出,|| true确保整个命令最终返回0,让Jenkins不会报错。方案3:临时关闭Jenkins Shell的错误检查
在执行终止命令前,用set +e关闭Shell的错误终止机制,执行完再恢复set -e:set +e pkill -f "%proc%" set -e这个方法比较直接,但注意不要影响后续其他命令的错误检查。
你说已经能成功启动,但可以给你几个生产环境的优化点,让部署更稳定:
后台运行并记录日志
用nohup让应用脱离SSH会话后台运行,同时把日志输出到指定文件:nohup java -Xms512m -Xmx1g -jar your-app.jar > app.log 2>&1 &这里
-Xms和-Xmx是JVM的初始堆和最大堆内存参数,根据你的应用需求调整。用systemd管理进程(推荐)
生产环境更推荐用systemd来托管你的Akka应用,它能实现开机自启、进程崩溃自动重启、统一日志管理等功能。步骤如下:- 创建systemd服务文件
/etc/systemd/system/yourapp.service:[Unit] Description=Your Akka-Scala Application After=network.target [Service] User=deploy-user # 替换成运行应用的用户 WorkingDirectory=/opt/yourapp # 替换成Jar包所在目录 ExecStart=/usr/bin/java -Xms512m -Xmx1g -jar your-app.jar Restart=always RestartSec=5 # 崩溃后5秒重启 StandardOutput=journal+console StandardError=journal+console [Install] WantedBy=multi-user.target - Jenkins中执行以下命令完成部署:
systemctl stop yourapp.service || true # 上传新的Jar包到指定目录 systemctl daemon-reload systemctl start yourapp.service
用systemd的话,终止旧进程更可靠,还能避免手动管理后台进程的麻烦。
- 创建systemd服务文件
内容的提问来源于stack exchange,提问作者a7emenov

