#!/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