Blame view

script/shell/deploy.sh 6.01 KB
2f252ffd   王彪总   feat(pay): 实现支付宝支...
1
  #!/bin/bash
a8d4e5e8   王彪总   feat(garden): 添加G...
2
  set -eo pipefail
2f252ffd   王彪总   feat(pay): 实现支付宝支...
3
4
5
6
7
8
9
10
11
  
  DATE=$(date +%Y%m%d%H%M)
  # 基础路径
  BASE_PATH=/work/projects/urbanops-server
  # 编译后 jar 的地址。部署时,Jenkins 会上传 jar 包到该目录下
  SOURCE_PATH=$BASE_PATH/build
  # 服务名称。同时约定部署服务的 jar 包名字也为它。
  SERVER_NAME=urbanops-server
  # 环境
a8d4e5e8   王彪总   feat(garden): 添加G...
12
  PROFILES_ACTIVE=dev
2f252ffd   王彪总   feat(pay): 实现支付宝支...
13
  # 健康检查 URL
a8d4e5e8   王彪总   feat(garden): 添加G...
14
  HEALTH_CHECK_URL=http://127.0.0.1:48081/actuator/health/
2f252ffd   王彪总   feat(pay): 实现支付宝支...
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
  
  # heapError 存放路径
  HEAP_ERROR_PATH=$BASE_PATH/heapError
  # JVM 参数
  JAVA_OPS="-Xms512m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$HEAP_ERROR_PATH"
  
  # SkyWalking Agent 配置
  #export SW_AGENT_NAME=$SERVER_NAME
  #export SW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.0.84:11800
  #export SW_GRPC_LOG_SERVER_HOST=192.168.0.84
  #export SW_AGENT_TRACE_IGNORE_PATH="Redisson/PING,/actuator/**,/admin/**"
  #export JAVA_AGENT=-javaagent:/work/skywalking/apache-skywalking-apm-bin/agent/skywalking-agent.jar
  
  # 备份
  function backup() {
      # 如果不存在,则无需备份
      if [ ! -f "$BASE_PATH/$SERVER_NAME.jar" ]; then
          echo "[backup] $BASE_PATH/$SERVER_NAME.jar 不存在,跳过备份"
      # 如果存在,则备份到 backup 目录下,使用时间作为后缀
      else
          echo "[backup] 开始备份 $SERVER_NAME ..."
a8d4e5e8   王彪总   feat(garden): 添加G...
36
37
          mkdir -p "$BASE_PATH/backup"
          cp "$BASE_PATH/$SERVER_NAME.jar" "$BASE_PATH/backup/$SERVER_NAME-$DATE.jar"
2f252ffd   王彪总   feat(pay): 实现支付宝支...
38
39
40
41
42
43
44
45
46
47
48
49
50
          echo "[backup] 备份 $SERVER_NAME 完成"
      fi
  }
  
  # 最新构建代码 移动到项目环境
  function transfer() {
      echo "[transfer] 开始转移 $SERVER_NAME.jar"
  
      # 删除原 jar 包
      if [ ! -f "$BASE_PATH/$SERVER_NAME.jar" ]; then
          echo "[transfer] $BASE_PATH/$SERVER_NAME.jar 不存在,跳过删除"
      else
          echo "[transfer] 移除 $BASE_PATH/$SERVER_NAME.jar 完成"
a8d4e5e8   王彪总   feat(garden): 添加G...
51
          rm "$BASE_PATH/$SERVER_NAME.jar"
2f252ffd   王彪总   feat(pay): 实现支付宝支...
52
53
54
55
      fi
  
      # 复制新 jar 包
      echo "[transfer] 从 $SOURCE_PATH 中获取 $SERVER_NAME.jar 并迁移至 $BASE_PATH ...."
a8d4e5e8   王彪总   feat(garden): 添加G...
56
      cp "$SOURCE_PATH/$SERVER_NAME.jar" "$BASE_PATH"
2f252ffd   王彪总   feat(pay): 实现支付宝支...
57
58
59
60
61
62
63
  
      echo "[transfer] 转移 $SERVER_NAME.jar 完成"
  }
  
  # 停止:优雅关闭之前已经启动的服务
  function stop() {
      echo "[stop] 开始停止 $BASE_PATH/$SERVER_NAME"
a8d4e5e8   王彪总   feat(garden): 添加G...
64
      PID=$(ps -ef | grep "$BASE_PATH/$SERVER_NAME.jar" | grep -v "grep" | awk '{print $2}')
2f252ffd   王彪总   feat(pay): 实现支付宝支...
65
66
67
68
69
70
71
72
73
      # 如果 Java 服务启动中,则进行关闭
      if [ -n "$PID" ]; then
          # 正常关闭
          echo "[stop] $BASE_PATH/$SERVER_NAME 运行中,开始 kill [$PID]"
          kill -15 $PID
          # 等待最大 120 秒,直到关闭完成。
          for ((i = 0; i < 120; i++))
              do
                  sleep 1
a8d4e5e8   王彪总   feat(garden): 添加G...
74
                  PID=$(ps -ef | grep "$BASE_PATH/$SERVER_NAME.jar" | grep -v "grep" | awk '{print $2}')
2f252ffd   王彪总   feat(pay): 实现支付宝支...
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
                  if [ -n "$PID" ]; then
                      echo -e ".\c"
                  else
                      echo "[stop] 停止 $BASE_PATH/$SERVER_NAME 成功"
                      break
                  fi
  		    done
  
          # 如果正常关闭失败,那么进行强制 kill -9 进行关闭
          if [ -n "$PID" ]; then
              echo "[stop] $BASE_PATH/$SERVER_NAME 失败,强制 kill -9 $PID"
              kill -9 $PID
          fi
      # 如果 Java 服务未启动,则无需关闭
      else
          echo "[stop] $BASE_PATH/$SERVER_NAME 未启动,无需停止"
      fi
  }
  
  # 启动:启动后端项目
  function start() {
      # 开启启动前,打印启动参数
      echo "[start] 开始启动 $BASE_PATH/$SERVER_NAME"
      echo "[start] JAVA_OPS: $JAVA_OPS"
      echo "[start] JAVA_AGENT: $JAVA_AGENT"
      echo "[start] PROFILES: $PROFILES_ACTIVE"
  
      # 开始启动
a8d4e5e8   王彪总   feat(garden): 添加G...
103
104
      mkdir -p "$HEAP_ERROR_PATH"
      nohup java -server $JAVA_OPS $JAVA_AGENT -jar "$BASE_PATH/$SERVER_NAME.jar" --spring.profiles.active=$PROFILES_ACTIVE >> "$BASE_PATH/nohup.out" 2>&1 &
2f252ffd   王彪总   feat(pay): 实现支付宝支...
105
106
107
108
109
110
111
112
113
114
115
116
      echo "[start] 启动 $BASE_PATH/$SERVER_NAME 完成"
  }
  
  # 健康检查:自动判断后端项目是否正常启动
  function healthCheck() {
      # 如果配置健康检查,则进行健康检查
      if [ -n "$HEALTH_CHECK_URL" ]; then
          # 健康检查最大 120 秒,直到健康检查通过
          echo "[healthCheck] 开始通过 $HEALTH_CHECK_URL 地址,进行健康检查";
          for ((i = 0; i < 120; i++))
              do
                  # 请求健康检查地址,只获取状态码。
a8d4e5e8   王彪总   feat(garden): 添加G...
117
                  result=$(curl -I -m 10 -o /dev/null -s -w %{http_code} "$HEALTH_CHECK_URL" || echo "000")
2f252ffd   王彪总   feat(pay): 实现支付宝支...
118
119
120
121
122
123
124
125
126
127
128
129
130
131
                  # 如果状态码为 200,则说明健康检查通过
                  if [ "$result" == "200" ]; then
                      echo "[healthCheck] 健康检查通过";
                      break
                  # 如果状态码非 200,则说明未通过。sleep 1 秒后,继续重试
                  else
                      echo -e ".\c"
                      sleep 1
                  fi
              done
  
          # 健康检查未通过,则异常退出 shell 脚本,不继续部署。
          if [ ! "$result" == "200" ]; then
              echo "[healthCheck] 健康检查不通过,可能部署失败。查看日志,自行判断是否启动成功";
a8d4e5e8   王彪总   feat(garden): 添加G...
132
              tail -n 10 "$BASE_PATH/nohup.out"
2f252ffd   王彪总   feat(pay): 实现支付宝支...
133
134
135
              exit 1;
          # 健康检查通过,打印最后 10 行日志,可能部署的人想看下日志。
          else
a8d4e5e8   王彪总   feat(garden): 添加G...
136
              tail -n 10 "$BASE_PATH/nohup.out"
2f252ffd   王彪总   feat(pay): 实现支付宝支...
137
138
139
140
141
142
          fi
      # 如果未配置健康检查,则 sleep 120 秒,人工看日志是否部署成功。
      else
          echo "[healthCheck] HEALTH_CHECK_URL 未配置,开始 sleep 120 秒";
          sleep 120
          echo "[healthCheck] sleep 120 秒完成,查看日志,自行判断是否启动成功";
a8d4e5e8   王彪总   feat(garden): 添加G...
143
          tail -n 50 "$BASE_PATH/nohup.out"
2f252ffd   王彪总   feat(pay): 实现支付宝支...
144
145
146
147
148
      fi
  }
  
  # 部署
  function deploy() {
a8d4e5e8   王彪总   feat(garden): 添加G...
149
150
151
152
153
154
      cd "$BASE_PATH" || { echo "[deploy] 错误:$BASE_PATH 目录不存在"; exit 1; }
      if [ ! -d "$SOURCE_PATH" ]; then
          echo "[deploy] 错误:构建目录 $SOURCE_PATH 不存在"
          exit 1
      fi
      mkdir -p "$BASE_PATH/backup" "$HEAP_ERROR_PATH"
2f252ffd   王彪总   feat(pay): 实现支付宝支...
155
156
157
158
159
160
161
162
163
164
165
166
167
      # 备份原 jar
      backup
      # 停止 Java 服务
      stop
      # 部署新 jar
      transfer
      # 启动 Java 服务
      start
      # 健康检查
      healthCheck
  }
  
  deploy