deploy.sh 5.64 KB
#!/bin/bash

# 部署脚本 - 智能批量部署工具
# 使用方法: ./deploy.sh [环境1] [环境2] [环境3] ...
# 示例: ./deploy.sh dev oa mituo

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 打印带颜色的消息
print_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

print_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 支持的环境列表
# 使用函数方式实现环境映射,兼容更多shell版本
get_environment_name() {
    case "$1" in
        "dev") echo "开发环境" ;;
        "oa") echo "OA环境" ;;
        "mituo") echo "弥陀寺环境" ;;
        "guanzong") echo "观宗寺环境" ;;
        "baorong") echo "包容寺环境" ;;
        "taishan") echo "泰山寺环境" ;;
        "xys") echo "西园寺环境" ;;
        "zentea") echo "Zentea环境" ;;
        "behalo") echo "美乐爱觉环境" ;;
        *) echo "" ;;
    esac
}

# 获取所有支持的环境列表
get_all_environments() {
    echo "dev oa mituo guanzong baorong taishan xys zentea behalo"
}

# 显示帮助信息
show_help() {
    echo "部署脚本使用说明:"
    echo ""
    echo "使用方法:"
    echo "  ./deploy.sh [环境1] [环境2] [环境3] ..."
    echo ""
    echo "支持的环境:"
    for env in $(get_all_environments); do
        echo "  $env - $(get_environment_name "$env")"
    done
    echo ""
    echo "示例:"
    echo "  ./deploy.sh dev oa mituo          # 部署到开发、OA、米托环境"
    echo "  ./deploy.sh all                   # 部署到所有环境"
    echo "  ./deploy.sh --help               # 显示帮助信息"
    echo ""
}

# 检查环境是否有效
validate_environment() {
    local env=$1
    local env_name=$(get_environment_name "$env")
    if [[ -z "$env_name" ]]; then
        print_error "不支持的环境: $env"
        print_info "支持的环境: $(get_all_environments)"
        return 1
    fi
    return 0
}

# 编译打包
build_project() {
    print_info "开始编译打包..."

    # 检查是否存在 package.json
    if [[ ! -f "package.json" ]]; then
        print_error "未找到 package.json 文件,请在项目根目录执行此脚本"
        exit 1
    fi

    # 执行编译打包
    npm run build
    if [[ $? -ne 0 ]]; then
        print_error "编译失败"
        exit 1
    fi

    npm run tar
    if [[ $? -ne 0 ]]; then
        print_error "打包失败"
        exit 1
    fi

    # 检查打包文件是否存在
    if [[ ! -f "dist.tar.gz" ]]; then
        print_error "打包文件 dist.tar.gz 不存在"
        exit 1
    fi

    print_success "编译打包完成"
}

# 部署到指定环境
deploy_to_environment() {
    local env=$1
    local env_name=${ENVIRONMENTS[$env]}

    print_info "开始部署到 $env_name ($env)..."

    # 执行上传
    npm run scp-$env
    if [[ $? -ne 0 ]]; then
        print_error "上传到 $env_name 失败"
        return 1
    fi

    # 执行解压
    npm run dec-$env
    if [[ $? -ne 0 ]]; then
        print_error "在 $env_name 解压失败"
        return 1
    fi

    print_success "部署到 $env_name 完成"
    return 0
}

# 清理临时文件
cleanup() {
    print_info "清理临时文件..."

    if [[ -f "dist.tar.gz" ]]; then
        rm -f dist.tar.gz
        print_info "删除 dist.tar.gz"
    fi

    if [[ -d "front" ]]; then
        rm -rf front
        print_info "删除 front 目录"
    fi

    print_success "清理完成"
}

# 主函数
main() {
    # 检查参数
    if [[ $# -eq 0 ]] || [[ "$1" == "--help" ]] || [[ "$1" == "-h" ]]; then
        show_help
        exit 0
    fi

    # 解析环境参数
    local environments=()

    if [[ "$1" == "all" ]]; then
        # 部署到所有环境
        environments=($(get_all_environments))
        print_info "将部署到所有环境: ${environments[*]}"
    else
        # 验证指定的环境
        for env in "$@"; do
            if validate_environment "$env"; then
                environments+=("$env")
            else
                exit 1
            fi
        done
        print_info "将部署到环境: ${environments[*]}"
    fi

    # 确认部署
    echo ""
    print_warning "即将部署到以下环境:"
    for env in "${environments[@]}"; do
        echo "  - $env ($(get_environment_name "$env"))"
    done
    echo ""
    read -p "确认继续? (y/N): " -n 1 -r
    echo ""
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        print_info "部署已取消"
        exit 0
    fi

    # 记录开始时间
    local start_time=$(date +%s)

    # 编译打包
    build_project

    # 部署到各个环境
    local success_count=0
    local failed_environments=()

    for env in "${environments[@]}"; do
        if deploy_to_environment "$env"; then
            ((success_count++))
        else
            failed_environments+=("$env")
        fi
        echo "" # 添加空行分隔
    done

    # 清理临时文件
    cleanup

    # 计算耗时
    local end_time=$(date +%s)
    local duration=$((end_time - start_time))

    # 显示部署结果
    echo ""
    print_info "=== 部署结果汇总 ==="
    print_success "成功部署: $success_count/${#environments[@]} 个环境"

    if [[ ${#failed_environments[@]} -gt 0 ]]; then
        print_error "失败环境: ${failed_environments[*]}"
    fi

    print_info "总耗时: ${duration}秒"

    # 退出码
    if [[ ${#failed_environments[@]} -gt 0 ]]; then
        exit 1
    else
        print_success "所有环境部署完成!"
        exit 0
    fi
}

# 捕获中断信号,确保清理
trap cleanup EXIT INT TERM

# 执行主函数
main "$@"