数据解析模块
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

deploy.sh 5.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. #!/bin/bash
  2. # IoT Platform 一键部署脚本
  3. # 用法:
  4. # ./deploy.sh --build # 本地构建后部署
  5. # ./deploy.sh --jar path/to/jar # 使用指定 jar 部署
  6. # ./deploy.sh --build --jar path # 构建并使用指定 jar(覆盖)
  7. #
  8. # 环境变量:
  9. # SERVER_HOST 默认: 47.104.204.180
  10. # SERVER_USER 默认: root
  11. # REMOTE_DIR 默认: /opt/iot-platform
  12. set -e
  13. # 配置
  14. SERVER_HOST="${SERVER_HOST:-47.104.204.180}"
  15. SERVER_USER="${SERVER_USER:-root}"
  16. REMOTE_DIR="${REMOTE_DIR:-/opt/iot-platform}"
  17. APP_NAME="iot-platform"
  18. LOCAL_JAR=""
  19. DO_BUILD=false
  20. # 颜色
  21. RED='\033[0;31m'
  22. GREEN='\033[0;32m'
  23. YELLOW='\033[1;33m'
  24. NC='\033[0m'
  25. # 解析参数
  26. while [[ $# -gt 0 ]]; do
  27. case $1 in
  28. --build)
  29. DO_BUILD=true
  30. shift
  31. ;;
  32. --jar)
  33. LOCAL_JAR="$2"
  34. shift 2
  35. ;;
  36. --help|-h)
  37. echo "用法: ./deploy.sh [--build] [--jar <path>]"
  38. echo " --build 本地执行 mvn clean package"
  39. echo " --jar 指定要部署的 jar 文件路径"
  40. exit 0
  41. ;;
  42. *)
  43. echo "未知参数: $1"
  44. exit 1
  45. ;;
  46. esac
  47. done
  48. # 确定 jar 路径
  49. if [ "$DO_BUILD" = true ]; then
  50. echo -e "${YELLOW}[deploy] 开始本地构建...${NC}"
  51. cd "$(dirname "$0")/.."
  52. mvn clean package -pl iot-platform -am -Dmaven.test.skip=true
  53. LOCAL_JAR="iot-platform/target/iot-platform.jar"
  54. echo -e "${GREEN}[deploy] 构建完成: ${LOCAL_JAR}${NC}"
  55. fi
  56. if [ -z "$LOCAL_JAR" ]; then
  57. # 默认使用本地 target 下的 jar
  58. cd "$(dirname "$0")/.."
  59. LOCAL_JAR="iot-platform/target/iot-platform.jar"
  60. fi
  61. if [ ! -f "$LOCAL_JAR" ]; then
  62. echo -e "${RED}[deploy] 错误: 找不到 jar 文件: ${LOCAL_JAR}${NC}"
  63. exit 1
  64. fi
  65. JAR_NAME=$(basename "$LOCAL_JAR")
  66. TIMESTAMP=$(date +%Y%m%d-%H%M%S)
  67. BACKUP_NAME="${APP_NAME}-${TIMESTAMP}.jar"
  68. echo "========================================"
  69. echo "IoT Platform 部署"
  70. echo "========================================"
  71. echo "目标服务器: ${SERVER_USER}@${SERVER_HOST}"
  72. echo "远程目录: ${REMOTE_DIR}"
  73. echo "本地 JAR: ${LOCAL_JAR}"
  74. echo "========================================"
  75. # 步骤 1: 上传 JAR 到临时目录
  76. echo -e "${YELLOW}[1/6] 上传 JAR 到服务器...${NC}"
  77. ssh "${SERVER_USER}@${SERVER_HOST}" "mkdir -p ${REMOTE_DIR}/tmp ${REMOTE_DIR}/backup"
  78. scp "${LOCAL_JAR}" "${SERVER_USER}@${SERVER_HOST}:${REMOTE_DIR}/tmp/${JAR_NAME}"
  79. echo -e "${GREEN}[1/6] 上传完成${NC}"
  80. # 步骤 2: 备份当前版本
  81. echo -e "${YELLOW}[2/6] 备份当前版本...${NC}"
  82. ssh "${SERVER_USER}@${SERVER_HOST}" "
  83. if [ -f ${REMOTE_DIR}/${APP_NAME}.jar ]; then
  84. cp -a ${REMOTE_DIR}/${APP_NAME}.jar ${REMOTE_DIR}/backup/${BACKUP_NAME}
  85. echo ' 已备份: ${BACKUP_NAME}'
  86. ls -lh ${REMOTE_DIR}/backup/ | tail -5
  87. else
  88. echo ' 无现有版本,跳过备份'
  89. fi
  90. "
  91. echo -e "${GREEN}[2/6] 备份完成${NC}"
  92. # 步骤 3: 停止服务
  93. echo -e "${YELLOW}[3/6] 停止服务...${NC}"
  94. ssh "${SERVER_USER}@${SERVER_HOST}" "systemctl stop ${APP_NAME} || true"
  95. sleep 2
  96. echo -e "${GREEN}[3/6] 服务已停止${NC}"
  97. # 步骤 4: 替换 JAR
  98. echo -e "${YELLOW}[4/6] 替换 JAR...${NC}"
  99. ssh "${SERVER_USER}@${SERVER_HOST}" "
  100. cp ${REMOTE_DIR}/tmp/${JAR_NAME} ${REMOTE_DIR}/${APP_NAME}.jar
  101. chmod 644 ${REMOTE_DIR}/${APP_NAME}.jar
  102. rm -f ${REMOTE_DIR}/tmp/${JAR_NAME}
  103. echo ' 新 JAR:'
  104. ls -lh ${REMOTE_DIR}/${APP_NAME}.jar
  105. "
  106. echo -e "${GREEN}[4/6] 替换完成${NC}"
  107. # 步骤 5: 启动服务
  108. echo -e "${YELLOW}[5/6] 启动服务...${NC}"
  109. ssh "${SERVER_USER}@${SERVER_HOST}" "systemctl start ${APP_NAME}"
  110. sleep 3
  111. echo -e "${GREEN}[5/6] 服务已启动${NC}"
  112. # 步骤 6: 健康检查
  113. echo -e "${YELLOW}[6/6] 健康检查...${NC}"
  114. if ssh "${SERVER_USER}@${SERVER_HOST}" "bash ${REMOTE_DIR}/bin/health-check.sh localhost 8887 30"; then
  115. echo -e "${GREEN}[6/6] 健康检查通过,部署成功!${NC}"
  116. echo ""
  117. echo "========================================"
  118. echo "部署摘要"
  119. echo "========================================"
  120. echo "时间: ${TIMESTAMP}"
  121. echo "JAR: ${LOCAL_JAR}"
  122. echo "备份: ${BACKUP_NAME}"
  123. echo "状态: 成功"
  124. echo ""
  125. echo "服务状态:"
  126. ssh "${SERVER_USER}@${SERVER_HOST}" "systemctl status ${APP_NAME} --no-pager"
  127. exit 0
  128. else
  129. echo -e "${RED}[6/6] 健康检查失败! 执行回滚...${NC}"
  130. # 回滚
  131. echo -e "${YELLOW}[rollback] 停止服务...${NC}"
  132. ssh "${SERVER_USER}@${SERVER_HOST}" "systemctl stop ${APP_NAME} || true"
  133. if ssh "${SERVER_USER}@${SERVER_HOST}" "test -f ${REMOTE_DIR}/backup/${BACKUP_NAME}"; then
  134. echo -e "${YELLOW}[rollback] 恢复旧版本...${NC}"
  135. ssh "${SERVER_USER}@${SERVER_HOST}" "
  136. cp ${REMOTE_DIR}/backup/${BACKUP_NAME} ${REMOTE_DIR}/${APP_NAME}.jar
  137. systemctl start ${APP_NAME}
  138. "
  139. sleep 3
  140. if ssh "${SERVER_USER}@${SERVER_HOST}" "bash ${REMOTE_DIR}/bin/health-check.sh localhost 8887 30"; then
  141. echo -e "${GREEN}[rollback] 回滚成功,旧版本已恢复${NC}"
  142. else
  143. echo -e "${RED}[rollback] 回滚后健康检查仍失败,请手动排查!${NC}"
  144. fi
  145. else
  146. echo -e "${RED}[rollback] 无备份可回滚,请手动修复!${NC}"
  147. fi
  148. exit 1
  149. fi