- #!/bin/bash
- # scripts/deploy-test.sh - 构建镜像并部署到 WSL 本地测试环境
- #
- # 用法:
- # bash scripts/deploy-test.sh [cn|ov] [--no-build]
- #
- # 测试环境:
- # 国内: /root/new-api-cn 端口 23000 容器 cn-new-api
- # 国外: /root/new-api-ov 端口 13000 容器 ov-new-api
-
- set -euo pipefail
-
- # ==================== 配置 ====================
- DOCKER_REGISTRY="registry.cn-hangzhou.aliyuncs.com/fengsilin/new-api"
- PROJECT_DIR="/mnt/d/code/new-api"
-
- # 测试节点
- CN_DIR="/root/new-api-cn"
- OV_DIR="/root/new-api-ov"
-
- # ==================== 颜色 ====================
- RED='\033[0;31m'
- GREEN='\033[0;32m'
- YELLOW='\033[1;33m'
- CYAN='\033[0;36m'
- BOLD='\033[1m'
- NC='\033[0m'
-
- info() { echo -e " ${CYAN}[INFO]${NC} $*"; }
- ok() { echo -e " ${GREEN}[OK]${NC} $*"; }
- warn() { echo -e " ${YELLOW}[WARN]${NC} $*"; }
- error() { echo -e " ${RED}[ERROR]${NC} $*"; }
-
- section() {
- echo ""
- echo -e " ${BOLD}=========================================${NC}"
- echo -e " ${BOLD} $*${NC}"
- echo -e " ${BOLD}=========================================${NC}"
- }
-
- # ==================== 参数解析 ====================
- TARGET="all"
- NO_BUILD=false
-
- for arg in "$@"; do
- case "$arg" in
- cn) TARGET="cn" ;;
- ov) TARGET="ov" ;;
- --no-build) NO_BUILD=true ;;
- -h|--help)
- echo "用法: $0 [cn|ov] [--no-build]"
- echo ""
- echo "测试环境:"
- echo " 国内: ${CN_DIR} 端口 23000"
- echo " 国外: ${OV_DIR} 端口 13000"
- exit 0
- ;;
- *)
- error "未知参数: $arg"
- exit 1
- ;;
- esac
- done
-
- # ==================== Step 1: 构建并推送 ====================
- if [ "$NO_BUILD" = false ]; then
- section "Step 1/2: 构建并推送镜像"
-
- cd "$PROJECT_DIR"
-
- BRANCH=$(git rev-parse --abbrev-ref HEAD | sed 's/\//-/g')
- TAG="$(date +%Y%m%d%H%M)-${BRANCH}"
- IMAGE="${DOCKER_REGISTRY}:${TAG}"
-
- info "分支: ${BRANCH}"
- info "Tag: ${TAG}"
- info "镜像: ${IMAGE}"
- echo ""
-
- docker build -t "${IMAGE}" .
-
- echo ""
- info "推送镜像..."
- docker push "${IMAGE}"
- ok "构建并推送完成: ${TAG}"
- else
- section "跳过构建,查找本地最新镜像..."
-
- IMAGE=$(docker images --format "{{.Repository}}:{{.Tag}}" "${DOCKER_REGISTRY}" | head -1)
- if [ -z "$IMAGE" ]; then
- error "本地未找到 ${DOCKER_REGISTRY} 的镜像"
- error "请先不带 --no-build 运行一次"
- exit 1
- fi
- TAG="${IMAGE##*:}"
- ok "使用镜像: ${IMAGE}"
- fi
-
- # ==================== Step 2: 部署到测试节点 ====================
- section "Step 2/2: 部署到测试环境"
-
- FAILED=()
-
- deploy_local() {
- local NAME="$1"
- local DIR="$2"
-
- echo ""
- info "部署到 ${NAME}..."
- info " 目录: ${DIR} Tag: ${TAG}"
- echo ""
-
- if [ ! -d "$DIR" ]; then
- error "目录不存在: ${DIR}"
- FAILED+=("$NAME")
- return
- fi
-
- cd "$DIR"
-
- echo " [1/3] 更新 image tag..."
- sed -i "s|${DOCKER_REGISTRY}:.*|${DOCKER_REGISTRY}:${TAG}|" docker-compose.yml
-
- echo " [2/3] 拉取新镜像..."
- docker compose pull new-api
-
- echo " [3/3] 重启服务..."
- docker compose up -d new-api
-
- sleep 5
- docker compose ps new-api
- ok "${NAME} 部署成功"
- }
-
- case "$TARGET" in
- cn) deploy_local "国内测试(CN)" "$CN_DIR" ;;
- ov) deploy_local "国外测试(OV)" "$OV_DIR" ;;
- all)
- deploy_local "国内测试(CN)" "$CN_DIR"
- deploy_local "国外测试(OV)" "$OV_DIR"
- ;;
- esac
-
- # ==================== 总结 ====================
- echo ""
- section "部署总结"
- echo -e " 镜像: ${GREEN}${IMAGE}${NC}"
- echo -e " 测试环境:"
- echo -e " 国内: ${CYAN}http://localhost:23000${NC}"
- echo -e " 国外: ${CYAN}http://localhost:13000${NC}"
-
- if [ ${#FAILED[@]} -gt 0 ]; then
- error "失败节点: ${FAILED[*]}"
- exit 1
- else
- ok "全部节点部署成功"
- fi
|