25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 

158 satır
3.7 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. TAG="$(date +%Y%m%d%H%M)-${BRANCH}"
  62. IMAGE="${DOCKER_REGISTRY}:${TAG}"
  63. info "分支: ${BRANCH}"
  64. info "Tag: ${TAG}"
  65. info "镜像: ${IMAGE}"
  66. echo ""
  67. docker build -t "${IMAGE}" .
  68. echo ""
  69. info "推送镜像..."
  70. docker push "${IMAGE}"
  71. ok "构建并推送完成: ${TAG}"
  72. else
  73. section "跳过构建,查找本地最新镜像..."
  74. IMAGE=$(docker images --format "{{.Repository}}:{{.Tag}}" "${DOCKER_REGISTRY}" | head -1)
  75. if [ -z "$IMAGE" ]; then
  76. error "本地未找到 ${DOCKER_REGISTRY} 的镜像"
  77. error "请先不带 --no-build 运行一次"
  78. exit 1
  79. fi
  80. TAG="${IMAGE##*:}"
  81. ok "使用镜像: ${IMAGE}"
  82. fi
  83. # ==================== Step 2: 部署到测试节点 ====================
  84. section "Step 2/2: 部署到测试环境"
  85. FAILED=()
  86. deploy_local() {
  87. local NAME="$1"
  88. local DIR="$2"
  89. echo ""
  90. info "部署到 ${NAME}..."
  91. info " 目录: ${DIR} Tag: ${TAG}"
  92. echo ""
  93. if [ ! -d "$DIR" ]; then
  94. error "目录不存在: ${DIR}"
  95. FAILED+=("$NAME")
  96. return
  97. fi
  98. cd "$DIR"
  99. echo " [1/3] 更新 image tag..."
  100. sed -i "s|${DOCKER_REGISTRY}:.*|${DOCKER_REGISTRY}:${TAG}|" docker-compose.yml
  101. echo " [2/3] 拉取新镜像..."
  102. docker compose pull new-api
  103. echo " [3/3] 重启服务..."
  104. docker compose up -d new-api
  105. sleep 5
  106. docker compose ps new-api
  107. ok "${NAME} 部署成功"
  108. }
  109. case "$TARGET" in
  110. cn) deploy_local "国内测试(CN)" "$CN_DIR" ;;
  111. ov) deploy_local "国外测试(OV)" "$OV_DIR" ;;
  112. all)
  113. deploy_local "国内测试(CN)" "$CN_DIR"
  114. deploy_local "国外测试(OV)" "$OV_DIR"
  115. ;;
  116. esac
  117. # ==================== 总结 ====================
  118. echo ""
  119. section "部署总结"
  120. echo -e " 镜像: ${GREEN}${IMAGE}${NC}"
  121. echo -e " 测试环境:"
  122. echo -e " 国内: ${CYAN}http://localhost:23000${NC}"
  123. echo -e " 国外: ${CYAN}http://localhost:13000${NC}"
  124. if [ ${#FAILED[@]} -gt 0 ]; then
  125. error "失败节点: ${FAILED[*]}"
  126. exit 1
  127. else
  128. ok "全部节点部署成功"
  129. fi