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 { ... } // 同上,目标主机为生产
}
}
}
五、运维与安全要点