Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 

164 строки
3.8 KiB

  1. #!/bin/bash
  2. # scripts/deploy-test.sh - 构建镜像并部署到 WSL 本地测试环境
  3. #
  4. # 用法:
  5. # bash scripts/deploy-test.sh [cn|ov] [--no-build]
  6. #
  7. # 测试环境:
  8. # 国内: /root/new-api-cn 端口 23000 容器 cn-new-api
  9. # 国外: /root/new-api-ov 端口 13000 容器 ov-new-api
  10. set -euo pipefail
  11. DOCKER_REGISTRY="registry.cn-hangzhou.aliyuncs.com/fengsilin/new-api"
  12. PROJECT_DIR="/mnt/d/code/new-api"
  13. CN_DIR="/root/new-api-cn"
  14. OV_DIR="/root/new-api-ov"
  15. RED='\033[0;31m'
  16. GREEN='\033[0;32m'
  17. YELLOW='\033[1;33m'
  18. CYAN='\033[0;36m'
  19. BOLD='\033[1m'
  20. NC='\033[0m'
  21. info() { echo -e " ${CYAN}[INFO]${NC} $*"; }
  22. ok() { echo -e " ${GREEN}[OK]${NC} $*"; }
  23. warn() { echo -e " ${YELLOW}[WARN]${NC} $*"; }
  24. error() { echo -e " ${RED}[ERROR]${NC} $*"; }
  25. section() {
  26. echo ""
  27. echo -e " ${BOLD}=========================================${NC}"
  28. echo -e " ${BOLD} $*${NC}"
  29. echo -e " ${BOLD}=========================================${NC}"
  30. }
  31. TARGET="all"
  32. NO_BUILD=false
  33. for arg in "$@"; do
  34. case "$arg" in
  35. cn) TARGET="cn" ;;
  36. ov) TARGET="ov" ;;
  37. --no-build) NO_BUILD=true ;;
  38. -h|--help)
  39. echo "用法: $0 [cn|ov] [--no-build]"
  40. echo ""
  41. echo "测试环境:"
  42. echo " 国内: ${CN_DIR} 端口 23000"
  43. echo " 国外: ${OV_DIR} 端口 13000"
  44. exit 0
  45. ;;
  46. *)
  47. error "未知参数: $arg"
  48. exit 1
  49. ;;
  50. esac
  51. done
  52. if [ "$NO_BUILD" = false ]; then
  53. section "Step 1/2: 构建并推送镜像"
  54. cd "$PROJECT_DIR"
  55. BRANCH=$(git rev-parse --abbrev-ref HEAD | sed 's/\//-/g')
  56. COMMIT_SHORT=$(git rev-parse --short HEAD)
  57. GIT_DIRTY=""
  58. git diff --quiet && git diff --cached --quiet 2>/dev/null || GIT_DIRTY="-dirty"
  59. TAG="$(date +%Y%m%d%H%M)-${BRANCH}-${COMMIT_SHORT}${GIT_DIRTY}"
  60. IMAGE="${DOCKER_REGISTRY}:${TAG}"
  61. info "分支: ${BRANCH}"
  62. info "Tag: ${TAG}"
  63. info "镜像: ${IMAGE}"
  64. echo ""
  65. docker build -t "${IMAGE}" .
  66. echo ""
  67. info "推送镜像..."
  68. docker push "${IMAGE}"
  69. ok "构建并推送完成: ${TAG}"
  70. else
  71. section "跳过构建,查找本地最新镜像..."
  72. IMAGE=$(docker images --format "{{.Repository}}:{{.Tag}}" "${DOCKER_REGISTRY}" | head -1)
  73. if [ -z "$IMAGE" ]; then
  74. error "本地未找到 ${DOCKER_REGISTRY} 的镜像"
  75. error "请先不带 --no-build 运行一次"
  76. exit 1
  77. fi
  78. TAG="${IMAGE##*:}"
  79. ok "使用镜像: ${IMAGE}"
  80. fi
  81. section "Step 2/2: 部署到测试环境"
  82. FAILED=()
  83. deploy_local() {
  84. local NAME="$1"
  85. local DIR="$2"
  86. local NODE_TYPE_VALUE="$3"
  87. echo ""
  88. info "部署到 ${NAME}..."
  89. info " 目录: ${DIR} Tag: ${TAG}"
  90. echo ""
  91. if [ ! -d "$DIR" ]; then
  92. error "目录不存在: ${DIR}"
  93. FAILED+=("$NAME")
  94. return
  95. fi
  96. cd "$DIR"
  97. echo " [1/3] 更新 image tag..."
  98. sed -i "s|${DOCKER_REGISTRY}:.*|${DOCKER_REGISTRY}:${TAG}|" docker-compose.yml
  99. if grep -q "NODE_TYPE=" docker-compose.yml; then
  100. sed -i "s|NODE_TYPE=.*|NODE_TYPE=${NODE_TYPE_VALUE}|" docker-compose.yml
  101. else
  102. sed -i "/SESSION_NAME=/a\\ - NODE_TYPE=${NODE_TYPE_VALUE}" docker-compose.yml
  103. fi
  104. echo " [2/3] 拉取新镜像..."
  105. docker compose pull new-api
  106. echo " [3/3] 重启服务..."
  107. docker compose up -d new-api
  108. sleep 5
  109. docker compose ps new-api
  110. ok "${NAME} 部署成功"
  111. }
  112. case "$TARGET" in
  113. cn)
  114. deploy_local "国内测试(CN)" "$CN_DIR" "master"
  115. ;;
  116. ov)
  117. deploy_local "国外测试(OV)" "$OV_DIR" "slave"
  118. ;;
  119. all)
  120. deploy_local "国内测试(CN)" "$CN_DIR" "master"
  121. deploy_local "国外测试(OV)" "$OV_DIR" "slave"
  122. ;;
  123. esac
  124. echo ""
  125. section "部署总结"
  126. echo -e " 镜像: ${GREEN}${IMAGE}${NC}"
  127. echo -e " 测试环境:"
  128. echo -e " 国内: ${CYAN}http://localhost:23000${NC}"
  129. echo -e " 国外: ${CYAN}http://localhost:13000${NC}"
  130. if [ ${#FAILED[@]} -gt 0 ]; then
  131. error "失败节点: ${FAILED[*]}"
  132. exit 1
  133. else
  134. ok "全部节点部署成功"
  135. fi