hookehuyr

feat(deploy): 新增部署脚本和配置文件

添加 deploy.sh 主部署脚本和 deploy-config.sh 配置文件,支持多环境批量部署
包含彩色输出、环境验证、错误处理和进度提示等功能
同时添加 DEPLOY-SHELL.md 详细说明文档
# Shell 部署脚本使用说明
## 概述
为了简化部署流程,我们提供了两个 Shell 脚本:
- `deploy.sh` - 主部署脚本,支持灵活的环境选择
- `deploy-config.sh` - 配置脚本,预定义环境组合
## 快速开始
### 方法一:使用配置脚本(推荐)
1. **编辑配置文件**
```bash
# 编辑 deploy-config.sh
vim deploy-config.sh
# 修改 upload_array 数组
upload_array=('dev' 'oa' 'mituo')
```
2. **执行部署**
```bash
./deploy-config.sh
```
### 方法二:直接使用主脚本
```bash
# 部署到指定环境
./deploy.sh dev oa mituo
# 部署到所有环境
./deploy.sh all
# 查看帮助
./deploy.sh --help
```
## 支持的环境
| 环境代码 | 环境名称 | 说明 |
|---------|---------|------|
| `dev` | 开发环境 | 开发测试环境 |
| `oa` | OA环境 | OA系统环境 |
| `mituo` | 米托环境 | 米托相关环境 |
| `guanzong` | 观宗环境 | 观宗相关环境 |
| `baorong` | 宝融环境 | 宝融相关环境 |
| `taishan` | 泰山环境 | 泰山相关环境 |
| `xys` | XYS环境 | XYS相关环境 |
| `zentea` | Zentea环境 | Zentea相关环境 |
## 使用示例
### 1. 配置脚本示例
```bash
# deploy-config.sh 中的配置示例
# 仅部署开发和OA环境
upload_array=('dev' 'oa')
# 部署三个主要环境
upload_array=('dev' 'oa' 'mituo')
# 部署所有环境
upload_array=('all')
# 部署特定的几个环境
upload_array=('mituo' 'guanzong' 'baorong' 'taishan')
```
### 2. 直接命令示例
```bash
# 部署到开发环境
./deploy.sh dev
# 部署到开发和OA环境
./deploy.sh dev oa
# 部署到多个环境
./deploy.sh dev oa mituo guanzong
# 部署到所有环境
./deploy.sh all
```
## 脚本功能特性
### 🚀 智能部署流程
1. **编译打包** - 自动执行 `npm run build` 和 `npm run tar`
2. **环境验证** - 检查指定环境是否有效
3. **批量部署** - 依次部署到指定环境
4. **自动清理** - 部署完成后清理临时文件
### 🎨 用户友好界面
- **彩色输出** - 不同类型的消息使用不同颜色
- **进度提示** - 实时显示部署进度
- **结果汇总** - 显示部署成功/失败统计
- **耗时统计** - 显示总部署时间
### 🛡️ 安全特性
- **确认提示** - 部署前需要用户确认
- **错误处理** - 遇到错误时停止执行
- **信号捕获** - 支持 Ctrl+C 中断并清理
- **环境验证** - 防止部署到无效环境
### 📊 详细日志
- **实时状态** - 显示当前执行步骤
- **错误信息** - 详细的错误提示
- **成功反馈** - 明确的成功确认
- **汇总报告** - 最终部署结果统计
## 故障排除
### 常见问题
1. **权限问题**
```bash
# 如果脚本无法执行,添加执行权限
chmod +x deploy.sh
chmod +x deploy-config.sh
```
2. **环境不存在**
```bash
# 检查 package.json 中是否有对应的 scp-* 和 dec-* 脚本
# 例如:scp-dev, dec-dev
```
3. **编译失败**
```bash
# 确保项目依赖已安装
npm install
# 手动测试编译
npm run build
```
4. **网络问题**
```bash
# 检查SSH连接
ssh your-server
# 检查SCP权限
scp test.txt your-server:/path/
```
### 调试模式
```bash
# 在脚本开头添加调试选项
set -x # 显示执行的每个命令
set -e # 遇到错误立即退出
```
## 高级用法
### 自定义环境组合
你可以在 `deploy-config.sh` 中定义多个不同的环境组合:
```bash
# 开发组合
dev_array=('dev')
# 测试组合
test_array=('dev' 'oa')
# 生产组合
prod_array=('mituo' 'guanzong' 'baorong' 'taishan')
# 全部组合
all_array=('all')
# 根据需要选择使用哪个组合
upload_array=("${test_array[@]}")
```
### 环境变量配置
```bash
# 可以通过环境变量传递配置
export DEPLOY_ENVS="dev,oa,mituo"
./deploy.sh ${DEPLOY_ENVS//,/ }
```
### 集成到CI/CD
```yaml
# GitHub Actions 示例
- name: Deploy to environments
run: |
chmod +x deploy.sh
./deploy.sh dev oa
```
## 与npm脚本的对比
| 特性 | npm脚本 | Shell脚本 |
|------|---------|----------|
| 使用复杂度 | 中等 | 简单 |
| 环境选择 | 固定 | 灵活 |
| 批量部署 | 需要多个命令 | 一个命令 |
| 错误处理 | 基础 | 完善 |
| 用户界面 | 基础 | 友好 |
| 确认机制 | 无 | 有 |
| 进度显示 | 无 | 有 |
## 总结
Shell脚本提供了更加灵活和用户友好的部署方式:
**简单易用** - 一行命令完成多环境部署
**灵活配置** - 支持任意环境组合
**安全可靠** - 完善的错误处理和确认机制
**用户友好** - 彩色输出和详细进度提示
**高效部署** - 一次编译,多环境部署
推荐使用 `deploy-config.sh` 进行日常部署,使用 `deploy.sh` 进行临时的灵活部署。
\ No newline at end of file
#!/bin/bash
# 部署配置文件
# 在这里定义你想要部署的环境组合
# 使用方法:
# 1. 修改下面的 upload_array 数组,添加你需要的环境
# 2. 运行: ./deploy-config.sh
# 定义部署环境数组 - 根据需要修改这里
# upload_array=('dev' 'oa' 'mituo')
# 你也可以定义多个不同的组合:
# upload_array=('dev' 'oa') # 仅开发和OA环境
upload_array=('oa' 'mituo' 'guanzong' 'baorong' 'taishan' 'xys') # 仅这三个环境
# upload_array=('all') # 所有环境
# 颜色定义
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
NC='\033[0m'
echo -e "${BLUE}=== 自动部署脚本 ===${NC}"
echo -e "${YELLOW}配置的部署环境: ${upload_array[*]}${NC}"
echo ""
# 调用主部署脚本
./deploy.sh "${upload_array[@]}"
# 检查部署结果
if [[ $? -eq 0 ]]; then
echo -e "${GREEN}✅ 部署任务完成!${NC}"
else
echo -e "${RED}❌ 部署过程中出现错误${NC}"
exit 1
fi
#!/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"
}
# 支持的环境列表
declare -A ENVIRONMENTS
ENVIRONMENTS["dev"]="开发环境"
ENVIRONMENTS["oa"]="OA环境"
ENVIRONMENTS["mituo"]="弥陀寺环境"
ENVIRONMENTS["guanzong"]="观宗寺环境"
ENVIRONMENTS["baorong"]="包容寺环境"
ENVIRONMENTS["taishan"]="泰山寺环境"
ENVIRONMENTS["xys"]="西园寺环境"
ENVIRONMENTS["zentea"]="Zentea环境"
# 显示帮助信息
show_help() {
echo "部署脚本使用说明:"
echo ""
echo "使用方法:"
echo " ./deploy.sh [环境1] [环境2] [环境3] ..."
echo ""
echo "支持的环境:"
for env in "${!ENVIRONMENTS[@]}"; do
echo " $env - ${ENVIRONMENTS[$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
if [[ ! ${ENVIRONMENTS[$env]+_} ]]; then
print_error "不支持的环境: $env"
print_info "支持的环境: ${!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=("${!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 (${ENVIRONMENTS[$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 "$@"