build.sh 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. #!/bin/bash
  2. set -e
  3. # ========== 配置 ==========
  4. PROJECT_DIR=$(cd "$(dirname "$0")" && pwd)
  5. VERSION='1.2.1'
  6. ENV='dev'
  7. MODULE='aitori-bi-v2'
  8. REGISTRY='registry.cn-shenzhen.aliyuncs.com/bantbox'
  9. REMOTE_DEV="root@192.168.0.155"
  10. REMOTE_TEST="root@34.146.228.227"
  11. REMOTE_PRO="root@34.146.222.45"
  12. # ========== 函数 ==========
  13. usage() {
  14. echo ""
  15. echo "Usage:"
  16. echo " $0 [-e env] [-v version] [-h]"
  17. echo ""
  18. echo "Options:"
  19. echo " -e 部署环境 (dev/test/pro),默认: dev"
  20. echo " -v 镜像版本号,默认: 1.2.1"
  21. echo " -h 显示帮助"
  22. echo ""
  23. }
  24. docker_login() {
  25. echo "[+] Docker login..."
  26. docker login --username=arche@1030463161912241 --password=bantbox@2021 registry.cn-shenzhen.aliyuncs.com
  27. }
  28. build_image() {
  29. local IMAGE_TAG="${REGISTRY}/${MODULE}:${VERSION}-${ENV}"
  30. echo "[+] ================================"
  31. echo "[+] 开始构建镜像..."
  32. echo "[+] 环境: ${ENV}"
  33. echo "[+] 版本: ${VERSION}"
  34. echo "[+] 镜像: ${IMAGE_TAG}"
  35. echo "[+] ================================"
  36. cd "$PROJECT_DIR"
  37. docker build \
  38. --build-arg ACTIVE_ENV="${ENV}" \
  39. -t "${MODULE}:${VERSION}" \
  40. -t "${IMAGE_TAG}" \
  41. .
  42. echo "[+] 推送镜像: ${IMAGE_TAG}"
  43. docker push "${IMAGE_TAG}"
  44. echo "[+] 构建完成"
  45. echo "[+] ================================"
  46. }
  47. restart_app() {
  48. local IMAGE_TAG="${REGISTRY}/${MODULE}:${VERSION}-${ENV}"
  49. local REMOTE=""
  50. local MEMORY_LIMIT="-m 2g"
  51. local MYSQL_HOST=""
  52. local MYSQL_PORT="3306"
  53. local MYSQL_DATABASE="aitori"
  54. local MYSQL_USERNAME="root"
  55. local MYSQL_PASSWORD=""
  56. local REDIS_HOST=""
  57. local REDIS_PORT="6379"
  58. local REDIS_PASSWORD=""
  59. local REDIS_DATABASE="1"
  60. local WORKFLOW_HOST="http://10.146.0.2:8080"
  61. case $ENV in
  62. dev)
  63. REMOTE=$REMOTE_DEV
  64. MYSQL_HOST="127.0.0.1"
  65. MYSQL_PASSWORD=""
  66. REDIS_HOST="127.0.0.1"
  67. REDIS_PASSWORD=""
  68. ;;
  69. test)
  70. REMOTE=$REMOTE_TEST
  71. MYSQL_HOST="10.146.0.2"
  72. MYSQL_PASSWORD='mysql@aitori!@#'
  73. REDIS_HOST="10.146.0.2"
  74. REDIS_PASSWORD='redis@aitori!@#'
  75. ;;
  76. pro)
  77. REMOTE=$REMOTE_PRO
  78. MEMORY_LIMIT=""
  79. MYSQL_HOST="35.189.132.138"
  80. MYSQL_PASSWORD='mysql@aitori!@#'
  81. REDIS_HOST="10.146.0.3"
  82. REDIS_PASSWORD='redis@aitori!@#'
  83. WORKFLOW_HOST="http://10.146.0.3:8080"
  84. ;;
  85. *)
  86. echo "[-] 未知环境: $ENV"
  87. exit 1
  88. ;;
  89. esac
  90. echo "[+] ================================"
  91. echo "[+] 重启远程服务: ${REMOTE}"
  92. echo "[+] MySQL: ${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_DATABASE}"
  93. echo "[+] Redis: ${REDIS_HOST}:${REDIS_PORT} db=${REDIS_DATABASE}"
  94. echo "[+] ================================"
  95. ssh "$REMOTE" << EEOOFF
  96. set -e
  97. echo "[remote] 停止旧容器..."
  98. docker rm -f ${MODULE} || true
  99. echo "[remote] 拉取新镜像..."
  100. docker pull ${IMAGE_TAG}
  101. echo "[remote] 初始化挂载目录..."
  102. mkdir -p /logs/${MODULE}
  103. chown 1000:1000 /logs/${MODULE}
  104. echo "[remote] 启动新容器..."
  105. docker run -d \
  106. --name ${MODULE} \
  107. --restart always \
  108. ${MEMORY_LIMIT} \
  109. -p 9901:9901 \
  110. -p 9902:8090 \
  111. --volume /etc/localtime:/etc/localtime \
  112. -v /var/run/docker.sock:/var/run/docker.sock \
  113. --group-add \$(stat -c '%g' /var/run/docker.sock) \
  114. -v /logs/${MODULE}:/app/logs \
  115. -v /data/www/file/:/data/www/file/ \
  116. -e ACTIVE_ENV=${ENV} \
  117. -e MYSQL_HOST=${MYSQL_HOST} \
  118. -e MYSQL_PROT=${MYSQL_PORT} \
  119. -e MYSQL_DATABASE=${MYSQL_DATABASE} \
  120. -e MYSQL_USERNAME=${MYSQL_USERNAME} \
  121. -e MYSQL_PASSWORD='${MYSQL_PASSWORD}' \
  122. -e REDIS_HOST=${REDIS_HOST} \
  123. -e REDIS_PORT=${REDIS_PORT} \
  124. -e REDIS_PASSWORD='${REDIS_PASSWORD}' \
  125. -e REDIS_DATABASE=${REDIS_DATABASE} \
  126. -e ACTIVE_ENV=${ENV} \
  127. -e WORKFLOW_HOST=${WORKFLOW_HOST} \
  128. --privileged=true \
  129. ${IMAGE_TAG}
  130. echo "[remote] 容器已启动"
  131. docker ps --filter "name=${MODULE}" --format "table {{.ID}}\t{{.Image}}\t{{.Status}}"
  132. EEOOFF
  133. echo "[+] 远程部署完成"
  134. echo "[+] ================================"
  135. }
  136. # ========== 解析参数 ==========
  137. while getopts "e:v:h" arg; do
  138. case $arg in
  139. e)
  140. ENV=$OPTARG
  141. echo "[+] 部署环境: $ENV"
  142. ;;
  143. v)
  144. VERSION=$OPTARG
  145. echo "[+] 镜像版本: $VERSION"
  146. ;;
  147. h)
  148. usage
  149. exit 0
  150. ;;
  151. *)
  152. usage
  153. exit 1
  154. ;;
  155. esac
  156. done
  157. # ========== 执行 ==========
  158. docker_login
  159. build_image
  160. restart_app