功能: - 自动拉取最新代码 - 检测代码变更决定是否构建 - Maven 自动打包 - 优雅停止和启动服务 - 健康检查 - 日志记录 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
141 lines
3.7 KiB
Bash
141 lines
3.7 KiB
Bash
#!/bin/bash
|
|
|
|
# ============================================
|
|
# Monisuo CI/CD 部署脚本 - 宝塔 Webhook
|
|
# ============================================
|
|
|
|
# ============ 环境配置 ============
|
|
# JDK 路径(根据实际修改)
|
|
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
|
|
export PATH=$JAVA_HOME/bin:$PATH
|
|
|
|
# Maven 路径(如果手动安装)
|
|
export MAVEN_HOME=/opt/maven
|
|
export PATH=$MAVEN_HOME/bin:$PATH
|
|
|
|
# ============ 项目配置 ============
|
|
PROJECT_PATH="/opt/monisuo"
|
|
GIT_REPO="http://sion:woshisaw.@8.155.172.147:3001/sion/monisuo.git"
|
|
JAR_NAME="monisuo-1.0.jar"
|
|
LOG_FILE="/opt/monisuo/deploy.log"
|
|
WEBHOOK_SECRET=""
|
|
|
|
# ============ 日志函数 ============
|
|
log() {
|
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
|
|
}
|
|
|
|
# ============ 错误处理 ============
|
|
error_exit() {
|
|
log "❌ 错误: $1"
|
|
echo "Error: $1"
|
|
exit 1
|
|
}
|
|
|
|
# ============ 主流程 ============
|
|
log "=========================================="
|
|
log "🚀 开始 CI/CD 部署"
|
|
log "=========================================="
|
|
|
|
# 记录环境信息
|
|
log "Java 版本: $(java -version 2>&1 | head -1)"
|
|
log "Maven 版本: $(mvn -version 2>&1 | head -1)"
|
|
log "当前目录: $(pwd)"
|
|
|
|
# 1. 检查/克隆项目
|
|
if [ ! -d "$PROJECT_PATH/.git" ]; then
|
|
log "📥 首次部署,克隆项目..."
|
|
mkdir -p $PROJECT_PATH
|
|
git clone $GIT_REPO $PROJECT_PATH >> $LOG_FILE 2>&1 || error_exit "Git 克隆失败"
|
|
fi
|
|
|
|
cd $PROJECT_PATH || error_exit "无法进入项目目录"
|
|
|
|
# 2. 拉取最新代码
|
|
log "📥 拉取最新代码..."
|
|
git fetch origin >> $LOG_FILE 2>&1
|
|
git reset --hard origin/main >> $LOG_FILE 2>&1 || error_exit "Git 拉取失败"
|
|
|
|
# 获取提交信息
|
|
COMMIT_HASH=$(git rev-parse --short HEAD)
|
|
COMMIT_MSG=$(git log -1 --pretty=%s)
|
|
log "📝 最新提交: $COMMIT_HASH - $COMMIT_MSG"
|
|
|
|
# 3. 检查文件变更
|
|
CHANGED_FILES=$(git diff --name-only HEAD~1 HEAD 2>/dev/null)
|
|
log "📁 变更文件: $CHANGED_FILES"
|
|
|
|
# 4. 后端构建和部署
|
|
if echo "$CHANGED_FILES" | grep -qE "^src/|^pom.xml"; then
|
|
log "🔨 检测到后端代码变更,开始构建..."
|
|
|
|
cd $PROJECT_PATH
|
|
mvn clean package -DskipTests >> $LOG_FILE 2>&1
|
|
|
|
if [ $? -ne 0 ]; then
|
|
error_exit "Maven 构建失败"
|
|
fi
|
|
log "✅ Maven 构建成功"
|
|
else
|
|
log "⏭️ 后端代码无变更,跳过构建"
|
|
fi
|
|
|
|
# 5. 停止旧服务
|
|
log "🛑 停止旧服务..."
|
|
pkill -f $JAR_NAME 2>/dev/null
|
|
sleep 3
|
|
|
|
# 检查是否停止成功
|
|
if pgrep -f $JAR_NAME > /dev/null; then
|
|
log "⚠️ 进程未停止,强制终止..."
|
|
pkill -9 -f $JAR_NAME 2>/dev/null
|
|
sleep 2
|
|
fi
|
|
|
|
# 6. 启动新服务
|
|
log "🚀 启动新服务..."
|
|
cd $PROJECT_PATH
|
|
|
|
nohup java -jar \
|
|
-Xms256m \
|
|
-Xmx512m \
|
|
-XX:+UseG1GC \
|
|
target/$JAR_NAME \
|
|
--spring.profiles.active=dev \
|
|
> $PROJECT_PATH/app.log 2>&1 &
|
|
|
|
# 7. 检查服务状态
|
|
sleep 5
|
|
if pgrep -f $JAR_NAME > /dev/null; then
|
|
PID=$(pgrep -f $JAR_NAME)
|
|
log "✅ 服务启动成功 (PID: $PID)"
|
|
else
|
|
log "❌ 服务启动失败,查看日志:"
|
|
tail -50 $PROJECT_PATH/app.log >> $LOG_FILE
|
|
error_exit "服务启动失败"
|
|
fi
|
|
|
|
# 8. 健康检查
|
|
log "🔍 健康检查..."
|
|
sleep 5
|
|
HEALTH_CHECK=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:5010/ 2>/dev/null || echo "000")
|
|
|
|
if [ "$HEALTH_CHECK" = "200" ] || [ "$HEALTH_CHECK" = "404" ]; then
|
|
log "✅ 健康检查通过 (HTTP $HEALTH_CHECK)"
|
|
else
|
|
log "⚠️ 健康检查异常 (HTTP $HEALTH_CHECK)"
|
|
fi
|
|
|
|
# 9. 清理旧日志
|
|
log "🧹 清理旧日志..."
|
|
find $PROJECT_PATH -name "*.log" -mtime +7 -delete 2>/dev/null
|
|
|
|
# 10. 完成
|
|
log "=========================================="
|
|
log "✅ CI/CD 部署完成"
|
|
log " 提交: $COMMIT_HASH"
|
|
log " 时间: $(date '+%Y-%m-%d %H:%M:%S')"
|
|
log "=========================================="
|
|
|
|
echo "Deploy Success! Commit: $COMMIT_HASH"
|