diff --git a/deploy/bt_webhook_cicd.sh b/deploy/bt_webhook_cicd.sh new file mode 100644 index 0000000..a5a9e2c --- /dev/null +++ b/deploy/bt_webhook_cicd.sh @@ -0,0 +1,140 @@ +#!/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"