linux

如何利用Linux Tomcat实现自动化部署

小樊
48
2025-11-23 05:23:03
栏目: 智能运维

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 流水线编排

五、安全与运维要点

0
看了该问题的人还看了