Jenkins 部署 Java 应用如何配置 Tomcat 自动重启脚本

文章导读
Jenkins 部署 Java 应用到 Tomcat 并配置自动重启,标准做法是在 Jenkins 构建环节通过 SSH 插件执行远程停止与启动脚本。该方案适合传统 WAR 包部署场景,主要风险在于脚本执行权限不足或进程未完全释放导致启动失败。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

Jenkins 部署 Java 应用到 Tomcat 并配置自动重启,标准做法是在 Jenkins 构建环节通过 SSH 插件执行远程停止与启动脚本。该方案适合传统 WAR 包部署场景,主要风险在于脚本执行权限不足或进程未完全释放导致启动失败。

先说结论:通过 Jenkins 调用远程 Shell 脚本控制 Tomcat 生命周期是稳定且通用的自动化部署方案。

  • 适合:使用 WAR 包部署且需要定期重启释放内存的传统 Java Web 项目。
  • 先准备:确保 Jenkins 节点拥有目标服务器的 SSH 免密登录权限或配置了 SSH Server 插件。
  • 验收:部署后检查 Tomcat 进程状态、端口监听情况及应用日志无报错。

命令速用版

以下脚本包含停止、清理、启动和健康检查逻辑,可直接保存为 server.sh 并在 Jenkins 中调用。

#!/bin/bash
TOMCAT_HOME=/opt/tomcat
PID_FILE=$TOMCAT_HOME/logs/catalina.pid

# 停止服务
if [ -f $PID_FILE ]; then
  kill $(cat $PID_FILE)
  sleep 10
fi

# 强制清理残留进程
ps -ef | grep $TOMCAT_HOME | grep -v grep | awk '{print $2}' | xargs kill -9 2>/dev/null

# 启动服务
$TOMCAT_HOME/bin/startup.sh

# 等待启动完成
sleep 15

# 检查端口
netstat -tlnp | grep 8080 || exit 1

为什么会这样

自动化重启脚本的核心目的是消除人工操作的不一致性并确保服务状态可控。

手动重启 Tomcat 容易遗漏进程清理或日志备份,导致内存泄漏累积或端口占用。Jenkins 执行脚本能固定操作顺序,先彻底停止旧进程,再启动新实例,并通过退出码判断构建是否成功。

分步处理

第一步:配置 Jenkins SSH 权限。在 Jenkins 凭据管理中添加目标服务器的 SSH Username with private key,确保该用户有权限执行 Tomcat 启停命令。

第二步:编写远程脚本。在目标服务器创建重启脚本,赋予执行权限 chmod +x /path/to/restart.sh,脚本中需指定绝对的 JAVA_HOME 和 TOMCAT_HOME 路径。

第三步:配置构建步骤。在 Jenkins 任务中选择 Execute shell on remote server 或 Publish Over SSH,填入脚本调用命令,如 bash /path/to/restart.sh。

第四步:设置超时时间。在 Jenkins 构建配置中设置 Timeout,防止脚本卡死导致构建队列阻塞,建议设置为脚本预计运行时间的两倍。

怎么验证是否生效

查看 Jenkins 构建控制台输出,确认远程命令返回退出码 0。

登录服务器执行 ps -ef | grep tomcat,确认进程存在且启动时间与构建时间接近。

Jenkins 部署 Java 应用如何配置 Tomcat 自动重启脚本

检查 $TOMCAT_HOME/logs/catalina.out 日志,搜索 Server startup in 关键字,确认无 Exception 报错。

使用 curl -I http://localhost:8080/your-app,确认 HTTP 状态码为 200 或 302。

常见坑

权限不足:Jenkins 用户无法执行 shutdown.sh 或绑定 8080 端口,需配置 sudo 免密或修改 Tomcat 端口。

PID 文件失效:Tomcat 非正常退出时 catalina.pid 可能残留,脚本需增加判断文件存在性而非直接依赖 PID 文件。

环境变量丢失:SSH 非交互式 shell 可能不加载 /etc/profile,脚本内必须显式 export JAVA_HOME。

常见问题

Jenkins 执行脚本提示 Permission denied 怎么办

检查 Jenkins 运行用户是否有脚本执行权限,或在脚本第一行添加 sudo 并配置 visudo 免密。

Tomcat 启动后端口被占用如何处理

脚本中需增加进程查杀步骤,确保旧进程完全终止后再启动新进程,避免端口冲突。

如何确认应用已经完全启动完成

不要仅依赖 sleep 固定时间,建议在脚本中循环检查日志关键字或 HTTP 接口返回状态。

参考来源

Jenkins 官方文档,Publish Over SSH Plugin,https://plugins.jenkins.io/publish-over-ssh/

Apache Tomcat 官方文档,Running Apache Tomcat,https://tomcat.apache.org/tomcat-9.0-doc/setup.html