deploy.sh 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. #!/bin/bash
  2. # author: sre.list@songguo7.com
  3. # 2020.03.17
  4. #
  5. # 脚本执行输入参数:
  6. # 第一个参数:start | stop | restart | deploy
  7. # 第二个参数对应ENV变量(环境列表): dev | test | perf | prepub | online
  8. # 脚本执行输出状态码:
  9. # 0: 成功
  10. # 非0: 失败
  11. # 脚本执行输出字符串为devops页面输出内容;
  12. #
  13. # 示例:
  14. # 服务启动运行 bash cicd/deploy.sh deploy $ENV
  15. # 脚本执行目录为项目部署目录,所有操作不会切换目录
  16. # 示例 例如iot 部署目录为 /data/apps/iot/
  17. ACTION=$1
  18. ENV=$2
  19. # 自动获项目名
  20. PROJECT=$(basename $(pwd))
  21. # ip
  22. IP=`ip a|grep "10\."|grep inet|grep -v lo:|awk -F"/" '{print $1}'|awk '{print $NF}'`
  23. # 服务端口号,与sre 确认
  24. CURRPORT=8008
  25. # 以下两项可以自定义,最好按照统一的规范
  26. # 服务健康检查接口
  27. CHECK_WEBPATH="/${PROJECT}/web_status"
  28. # 服务健康检查接口返回值
  29. CHECK_PATTEN="status_ok"
  30. # 项目部署路径
  31. DEPLOY_DIR="/data/apps/${PROJECT}"
  32. # 使用supervisor进程时,脚本生成项目对应的进程管理配置文件
  33. START_CONFIG=${PROJECT}.ini
  34. # supervisor控制命令
  35. SUPERVISOR_BIN="supervisorctl"
  36. # jar 包及配置文件目录
  37. DEPLOY_TARGET_DIR='deploy_target'
  38. # 健康检查url
  39. HEALTH_URL="http://${IP}:${CURRPORT}${CHECK_WEBPATH}"
  40. # Java启动命令,此处可以自定义
  41. cmd_online="/data/apps/${PROJECT}/bin/${PROJECT}-app"
  42. cmd_prepub=${cmd_online}
  43. cmd_test=${cmd_online}
  44. cmd_dev=${cmd_online}
  45. cmd_perf=${cmd_online}
  46. # 应用配置源文件名称
  47. app_source_ini=""
  48. if [[ "${ENV}#" == "test#" ]] ;then
  49. cmd=${cmd_test}
  50. app_source_ini="env.test.ini"
  51. app_apollo_ini="apollo.test.json"
  52. fi
  53. if [[ "${ENV}#" == "dev#" ]] ;then
  54. cmd=${cmd_dev}
  55. app_source_ini="env.dev.ini"
  56. app_apollo_ini="apollo.dev.json"
  57. fi
  58. if [[ "${ENV}#" == "perf#" ]] ;then
  59. cmd=${cmd_perf}
  60. app_source_ini="env.performance.ini"
  61. app_apollo_ini="apollo.performance.json"
  62. fi
  63. if [[ "${ENV}#" == "prepub#" ]] ;then
  64. cmd=${cmd_prepub}
  65. app_source_ini="env.slave.ini"
  66. app_apollo_ini="apollo.slave.json"
  67. fi
  68. if [[ "${ENV}#" == "online#" ]] ;then
  69. cmd=${cmd_online}
  70. app_source_ini="env.release.ini"
  71. app_apollo_ini="apollo.release.json"
  72. fi
  73. #############################################################
  74. # 生成supervisor进程管理配置文件
  75. function genSupervisorConfig() {
  76. echo "[program:${PROJECT}]">${START_CONFIG}
  77. echo "command = ${cmd}">>${START_CONFIG}
  78. echo "directory = ${DEPLOY_DIR}" >>${START_CONFIG}
  79. echo "stdout_logfile = ${DEPLOY_DIR}/logs/${PROJECT}.log">>${START_CONFIG}
  80. echo "redirect_stderr = true">> ${START_CONFIG}
  81. echo "numprocs = 1" >>${START_CONFIG}
  82. echo "autorestart = 1">>${START_CONFIG}
  83. echo "autostart = 1">>${START_CONFIG}
  84. echo "user = ttyc">>${START_CONFIG}
  85. echo "startsecs = 5">>${START_CONFIG}
  86. if [[ ! -L "/etc/supervisord.d/${START_CONFIG}" ]];then
  87. ln -s "${DEPLOY_DIR}/$START_CONFIG" /etc/supervisord.d/${START_CONFIG}
  88. fi
  89. if [[ ! -d "${DEPLOY_DIR}/logs" ]];then
  90. mkdir "${DEPLOY_DIR}/logs"
  91. fi
  92. }
  93. # supervisor检查服务状态
  94. function check_status() {
  95. supervisorctl status ${PROJECT}
  96. }
  97. function status() {
  98. if [[ "$1" -eq 0 ]];then
  99. echo '状态正常'
  100. else
  101. echo '状态异常'
  102. exit 1
  103. fi
  104. }
  105. # 日志输出
  106. function echoStageMsg() {
  107. msg=$1
  108. echo -e "[stage]: $msg "
  109. }
  110. # 健康检查 正常不用返回,异常返回非0
  111. # 此处可以自定义
  112. function health_check() {
  113. echo -e ${HEALTH_URL}
  114. for in in $(seq 1 1 30) ;do
  115. code=`curl -s -o /dev/null -w '%{http_code}' -m 2 "${HEALTH_URL}"`
  116. if [[ ${code} -eq 200 ]] ; then
  117. echoStageMsg "健康检查 成功"
  118. break
  119. else
  120. sleep 1
  121. fi
  122. done
  123. if [[ ${code} -ne 200 ]]; then
  124. echoStageMsg "健康检查 失败"
  125. exit 1
  126. fi
  127. }
  128. function initAppLogFile() {
  129. ## 创建日志目录
  130. mkdir -p "/data/log/${PROJECT}"
  131. chown ttyc:ttyc "/data/log/${PROJECT}" -R
  132. }
  133. # 项目启动前初始化,此处可以自定义
  134. function init() {
  135. echo "deploy init start"
  136. initAppLogFile
  137. genSupervisorConfig
  138. ## 构建产物通过devops,下载 和 原样解压至项目顶级目录 如下
  139. ## deploy_target/
  140. ## cicd/deploy.sh
  141. ## 如需其他操作请在这里添加
  142. mkdir -p bin
  143. cp ${DEPLOY_TARGET_DIR}/${PROJECT}-app ./bin/
  144. cp -r ${DEPLOY_TARGET_DIR}/config ./
  145. ## 拷贝对应环境配置文件 为 env.ini
  146. /bin/cp -f ./config/${app_source_ini} ./config/env.ini
  147. /bin/cp -f ./config/apollo/${app_apollo_ini} ./config/apollo/apollo.json
  148. mkdir -p logs
  149. ## 设置权限
  150. chown ttyc:ttyc ./ -R
  151. }
  152. # 停止服务
  153. function stop() {
  154. echo "supervisorctl stop ${PROJECT}"
  155. supervisorctl stop ${PROJECT}
  156. supervisorctl reread
  157. if [[ $? -eq 0 ]] ;then
  158. supervisorctl update
  159. fi
  160. check_status ${PROJECT}|egrep -i "stopped"
  161. # status $?
  162. }
  163. # 启动服务
  164. function start(){
  165. supervisorctl reread
  166. if [[ $? -eq 0 ]] ;then
  167. supervisorctl update
  168. fi
  169. echo "supervisorctl start ${PROJECT}"
  170. # supervisorctl start $PROJECT
  171. supervisorctl restart ${PROJECT}
  172. check_status ${PROJECT}|egrep -i "running"
  173. status $?
  174. health_check
  175. }
  176. function usage(){
  177. echo $"Usage: $0 {start|stop|restart|deploy} {ENV}"
  178. exit 1
  179. }
  180. function main() {
  181. if [[ "${ACTION}" == "" ]]; then
  182. usage
  183. fi
  184. case "${ACTION}" in
  185. start)
  186. start
  187. ;;
  188. stop)
  189. stop
  190. ;;
  191. restart)
  192. echo "重启服务"
  193. stop
  194. start
  195. ;;
  196. deploy)
  197. echo "部署服务"
  198. stop
  199. init
  200. start
  201. ;;
  202. *)
  203. usage
  204. ;;
  205. esac
  206. }
  207. main
  208. # 正常执行结束,成功返回状态:0
  209. exit 0