debian

Debian JSP应用如何实现自动化部署

小樊
43
2025-12-14 17:59:46
栏目: 编程语言

Debian 上实现 JSP 应用自动化部署

一、方案总览

二、环境与前置准备

三、自动化部署脚本示例

示例脚本 deploy.sh(可放入 Ansible 或 Jenkins 步骤中执行)

#!/usr/bin/env bash
set -Eeuo pipefail

APP_NAME="${1:-myapp}"
WAR_SRC="${2:-target/app.war}"
TOMCAT_WEBAPPS="${3:-/var/lib/tomcat9/webapps}"   # 二进制安装可改为 /opt/tomcat/webapps
TOMCAT_USER="${4:-tomcat}"
TOMCAT_GROUP="${5:-tomcat}"
HEALTH_URL="http://localhost:8080/${APP_NAME}/health"
TIMEOUT=60
SLEEP_INTERVAL=5

# 0) 参数与前置校验
[[ -f "$WAR_SRC" ]] || { echo "WAR not found: $WAR_SRC"; exit 1; }
command -v curl >/dev/null 2>&1 || { echo "curl required"; exit 1; }

# 1) 备份当前版本
APP_DIR="$TOMCAT_WEBAPPS/$APP_NAME"
BAK_DIR="$TOMCAT_WEBAPPS/${APP_NAME}_bak_$(date +%F-%H%M%S)"
if [[ -d "$APP_DIR" ]]; then
  echo "Backing up $APP_DIR -> $BAK_DIR"
  sudo cp -a "$APP_DIR" "$BAK_DIR"
fi

# 2) 部署新版本(原子替换)
TMP_DEPLOY="$TOMCAT_WEBAPPS/${APP_NAME}.new"
sudo rm -rf "$TMP_DEPLOY"
sudo cp "$WAR_SRC" "$TMP_DEPLOY"
sudo chown "$TOMCAT_USER:$TOMCAT_GROUP" "$TMP_DEPLOY"

# 3) 触发部署(热部署:复制即部署;如需重启可取消下一行注释)
# sudo systemctl restart tomcat

# 4) 健康检查与回滚
echo "Waiting for $HEALTH_URL (timeout=${TIMEOUT}s)..."
for ((i=0; i<TIMEOUT; i+=SLEEP_INTERVAL)); do
  if curl -sf --max-time 5 "$HEALTH_URL" >/dev/null; then
    echo "Health check OK"
    # 部署成功:清理旧备份(保留最近2个)
    (ls -1t "$TOMCAT_WEBAPPS/${APP_NAME}_bak_"* 2>/dev/null | tail -n +3 | xargs -r sudo rm -rf) || true
    exit 0
  fi
  sleep "$SLEEP_INTERVAL"
done

# 5) 失败回滚
echo "Health check FAILED, rolling back..."
sudo rm -rf "$APP_DIR"
if [[ -d "$BAK_DIR" ]]; then
  sudo mv "$BAK_DIR" "$APP_DIR"
  # 如需重启可取消下一行注释
  # sudo systemctl restart tomcat
fi
exit 1

四、CI 流水线示例

pipeline {
  agent any
  tools { jdk 'openjdk-11' }
  stages {
    stage('Build') {
      steps {
        sh 'mvn -B -DskipTests clean package'
      }
    }
    stage('Deploy to Staging') {
      steps {
        withCredentials([sshUserPrivateKey(credentialsId: 'deploy-key', keyFileVariable: 'SSH_KEY')]) {
          sh '''
            scp -i "$SSH_KEY" -o StrictHostKeyChecking=no target/app.war debian@staging.example.com:/tmp/app.war
            ssh -i "$SSH_KEY" -o StrictHostKeyChecking=no debian@staging.example.com \
              "sudo /opt/scripts/deploy.sh myapp /tmp/app.war /var/lib/tomcat9/webapps tomcat tomcat"
          '''
        }
      }
    }
    stage('Smoke Test') {
      steps {
        sh 'curl -sf http://staging.example.com/myapp/health | grep -q OK'
      }
    }
    stage('Deploy to Production') {
      when { branch 'main' }
      steps { ... } // 同上,目标主机为生产
    }
  }
}

五、运维与安全要点

0
看了该问题的人还看了