Linux Tomcat自动化部署实践
一、方案总览与适用场景
| 方式 | 核心思路 | 适用场景 | 关键要点 |
|---|---|---|---|
| Shell脚本一键发布 | 本地/CI构建出 WAR → 通过 SCP/FTP 上传 → 脚本执行停服、备份、部署、启动、健康检查 | 内网隔离、多实例、需要自定义流程与回滚策略 | 原子化操作、备份与回滚、启动失败告警、日志追踪 |
| Maven Tomcat 插件部署 | 在 pom.xml 配置 tomcat7-maven-plugin → 执行 mvn tomcat7:deploy/redeploy | 开发-测试联动、快速迭代、与CI/CD天然集成 | 配置 manager 用户与权限、settings.xml 的 server 认证、使用 /manager/text 接口 |
| Jenkins 流水线 | Jenkins 拉代码 → 构建 → 调用脚本或 Maven 插件 → 多机分发与回滚 | 规范化交付、多环境发布、可审计可追溯 | 参数化构建、人工确认门禁、制品归档、回滚作业、并发控制 |
二、Shell脚本一键发布实战
#!/usr/bin/env bash
set -Eeuo pipefail
export CATALINA_HOME="/opt/apache-tomcat-9.0.xx"
APP_NAME="myapp"
WAR_SRC="/opt/dist/${APP_NAME}.war"
WEBAPPS="$CATALINA_HOME/webapps"
BACKUP_DIR="/opt/backups/${APP_NAME}/$(date +%F_%H%M%S)"
HEALTH_URL="http://127.0.0.1:8080/${APP_NAME}/health"
TIMEOUT=60
SLEEP=5
log(){ echo "[$(date '+%F %T')] $*"; }
stop_tomcat(){
log "Stopping Tomcat..."
"$CATALINA_HOME/bin/shutdown.sh" || true
local i=0
while (( i < TIMEOUT )); do
pid=$(ps -ef | grep "$CATALINA_HOME" | grep -v grep | awk '{print $2}' | head -n1)
[[ -z "$pid" ]] && { log "Tomcat stopped."; return 0; }
sleep "$SLEEP"; ((i+=SLEEP))
done
log "Timeout, killing Tomcat..."
pkill -f "$CATALINA_HOME" || true
}
backup(){
log "Backup $APP_NAME to $BACKUP_DIR"
mkdir -p "$BACKUP_DIR"
cp -a "$WEBAPPS/${APP_NAME}" "$BACKUP_DIR/" 2>/dev/null || true
cp -a "$WAR_SRC" "$BACKUP_DIR/" 2>/dev/null || true
}
deploy(){
log "Deploying $WAR_SRC to $WEBAPPS"
rm -rf "$WEBAPPS/${APP_NAME}" "$WEBAPPS/${APP_NAME}.war"
cp "$WAR_SRC" "$WEBAPPS/${APP_NAME}.war"
}
start_tomcat(){
log "Starting Tomcat..."
"$CATALINA_HOME/bin/startup.sh"
}
health_check(){
log "Health check $HEALTH_URL"
local i=0
while (( i < TIMEOUT )); do
if curl -sf "$HEALTH_URL" >/dev/null; then
log "Health check OK."
return 0
fi
sleep "$SLEEP"; ((i+=SLEEP))
done
log "Health check FAILED."
return 1
}
rollback(){
log "Rolling back..."
pkill -f "$CATALINA_HOME" || true
sleep 3
rm -rf "$WEBAPPS/${APP_NAME}" "$WEBAPPS/${APP_NAME}.war"
cp -a "$BACKUP_DIR/${APP_NAME}" "$WEBAPPS/" 2>/dev/null || true
cp -a "$BACKUP_DIR/${APP_NAME}.war" "$WEBAPPS/" 2>/dev/null || true
"$CATALINA_HOME/bin/startup.sh"
}
main(){
trap rollback ERR
stop_tomcat
backup
deploy
start_tomcat
if ! health_check; then
rollback
exit 1
fi
log "Deploy SUCCESS."
}
main "$@"
三、Maven Tomcat 插件部署
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="deployer" password="StrongPass!23" roles="manager-script,manager-jmx,manager-status"/>
<servers>
<server>
<id>tomcat-server</id>
<username>deployer</username>
<password>StrongPass!23</password>
</server>
</servers>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<url>http://192.168.10.20:8080/manager/text</url>
<server>tomcat-server</server>
<path>/${project.artifactId}</path>
<update>true</update>
<charset>UTF-8</charset>
</configuration>
</plugin>
</plugins>
</build>
四、Jenkins 流水线编排
五、安全与运维要点