Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 

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