feat(deploy): 新增部署脚本和配置文件
添加 deploy.sh 主部署脚本和 deploy-config.sh 配置文件,支持多环境批量部署 包含彩色输出、环境验证、错误处理和进度提示等功能 同时添加 DEPLOY-SHELL.md 详细说明文档
Showing
3 changed files
with
495 additions
and
0 deletions
DEPLOY-SHELL.md
0 → 100644
| 1 | +# Shell 部署脚本使用说明 | ||
| 2 | + | ||
| 3 | +## 概述 | ||
| 4 | + | ||
| 5 | +为了简化部署流程,我们提供了两个 Shell 脚本: | ||
| 6 | +- `deploy.sh` - 主部署脚本,支持灵活的环境选择 | ||
| 7 | +- `deploy-config.sh` - 配置脚本,预定义环境组合 | ||
| 8 | + | ||
| 9 | +## 快速开始 | ||
| 10 | + | ||
| 11 | +### 方法一:使用配置脚本(推荐) | ||
| 12 | + | ||
| 13 | +1. **编辑配置文件** | ||
| 14 | + ```bash | ||
| 15 | + # 编辑 deploy-config.sh | ||
| 16 | + vim deploy-config.sh | ||
| 17 | + | ||
| 18 | + # 修改 upload_array 数组 | ||
| 19 | + upload_array=('dev' 'oa' 'mituo') | ||
| 20 | + ``` | ||
| 21 | + | ||
| 22 | +2. **执行部署** | ||
| 23 | + ```bash | ||
| 24 | + ./deploy-config.sh | ||
| 25 | + ``` | ||
| 26 | + | ||
| 27 | +### 方法二:直接使用主脚本 | ||
| 28 | + | ||
| 29 | +```bash | ||
| 30 | +# 部署到指定环境 | ||
| 31 | +./deploy.sh dev oa mituo | ||
| 32 | + | ||
| 33 | +# 部署到所有环境 | ||
| 34 | +./deploy.sh all | ||
| 35 | + | ||
| 36 | +# 查看帮助 | ||
| 37 | +./deploy.sh --help | ||
| 38 | +``` | ||
| 39 | + | ||
| 40 | +## 支持的环境 | ||
| 41 | + | ||
| 42 | +| 环境代码 | 环境名称 | 说明 | | ||
| 43 | +|---------|---------|------| | ||
| 44 | +| `dev` | 开发环境 | 开发测试环境 | | ||
| 45 | +| `oa` | OA环境 | OA系统环境 | | ||
| 46 | +| `mituo` | 米托环境 | 米托相关环境 | | ||
| 47 | +| `guanzong` | 观宗环境 | 观宗相关环境 | | ||
| 48 | +| `baorong` | 宝融环境 | 宝融相关环境 | | ||
| 49 | +| `taishan` | 泰山环境 | 泰山相关环境 | | ||
| 50 | +| `xys` | XYS环境 | XYS相关环境 | | ||
| 51 | +| `zentea` | Zentea环境 | Zentea相关环境 | | ||
| 52 | + | ||
| 53 | +## 使用示例 | ||
| 54 | + | ||
| 55 | +### 1. 配置脚本示例 | ||
| 56 | + | ||
| 57 | +```bash | ||
| 58 | +# deploy-config.sh 中的配置示例 | ||
| 59 | + | ||
| 60 | +# 仅部署开发和OA环境 | ||
| 61 | +upload_array=('dev' 'oa') | ||
| 62 | + | ||
| 63 | +# 部署三个主要环境 | ||
| 64 | +upload_array=('dev' 'oa' 'mituo') | ||
| 65 | + | ||
| 66 | +# 部署所有环境 | ||
| 67 | +upload_array=('all') | ||
| 68 | + | ||
| 69 | +# 部署特定的几个环境 | ||
| 70 | +upload_array=('mituo' 'guanzong' 'baorong' 'taishan') | ||
| 71 | +``` | ||
| 72 | + | ||
| 73 | +### 2. 直接命令示例 | ||
| 74 | + | ||
| 75 | +```bash | ||
| 76 | +# 部署到开发环境 | ||
| 77 | +./deploy.sh dev | ||
| 78 | + | ||
| 79 | +# 部署到开发和OA环境 | ||
| 80 | +./deploy.sh dev oa | ||
| 81 | + | ||
| 82 | +# 部署到多个环境 | ||
| 83 | +./deploy.sh dev oa mituo guanzong | ||
| 84 | + | ||
| 85 | +# 部署到所有环境 | ||
| 86 | +./deploy.sh all | ||
| 87 | +``` | ||
| 88 | + | ||
| 89 | +## 脚本功能特性 | ||
| 90 | + | ||
| 91 | +### 🚀 智能部署流程 | ||
| 92 | +1. **编译打包** - 自动执行 `npm run build` 和 `npm run tar` | ||
| 93 | +2. **环境验证** - 检查指定环境是否有效 | ||
| 94 | +3. **批量部署** - 依次部署到指定环境 | ||
| 95 | +4. **自动清理** - 部署完成后清理临时文件 | ||
| 96 | + | ||
| 97 | +### 🎨 用户友好界面 | ||
| 98 | +- **彩色输出** - 不同类型的消息使用不同颜色 | ||
| 99 | +- **进度提示** - 实时显示部署进度 | ||
| 100 | +- **结果汇总** - 显示部署成功/失败统计 | ||
| 101 | +- **耗时统计** - 显示总部署时间 | ||
| 102 | + | ||
| 103 | +### 🛡️ 安全特性 | ||
| 104 | +- **确认提示** - 部署前需要用户确认 | ||
| 105 | +- **错误处理** - 遇到错误时停止执行 | ||
| 106 | +- **信号捕获** - 支持 Ctrl+C 中断并清理 | ||
| 107 | +- **环境验证** - 防止部署到无效环境 | ||
| 108 | + | ||
| 109 | +### 📊 详细日志 | ||
| 110 | +- **实时状态** - 显示当前执行步骤 | ||
| 111 | +- **错误信息** - 详细的错误提示 | ||
| 112 | +- **成功反馈** - 明确的成功确认 | ||
| 113 | +- **汇总报告** - 最终部署结果统计 | ||
| 114 | + | ||
| 115 | +## 故障排除 | ||
| 116 | + | ||
| 117 | +### 常见问题 | ||
| 118 | + | ||
| 119 | +1. **权限问题** | ||
| 120 | + ```bash | ||
| 121 | + # 如果脚本无法执行,添加执行权限 | ||
| 122 | + chmod +x deploy.sh | ||
| 123 | + chmod +x deploy-config.sh | ||
| 124 | + ``` | ||
| 125 | + | ||
| 126 | +2. **环境不存在** | ||
| 127 | + ```bash | ||
| 128 | + # 检查 package.json 中是否有对应的 scp-* 和 dec-* 脚本 | ||
| 129 | + # 例如:scp-dev, dec-dev | ||
| 130 | + ``` | ||
| 131 | + | ||
| 132 | +3. **编译失败** | ||
| 133 | + ```bash | ||
| 134 | + # 确保项目依赖已安装 | ||
| 135 | + npm install | ||
| 136 | + | ||
| 137 | + # 手动测试编译 | ||
| 138 | + npm run build | ||
| 139 | + ``` | ||
| 140 | + | ||
| 141 | +4. **网络问题** | ||
| 142 | + ```bash | ||
| 143 | + # 检查SSH连接 | ||
| 144 | + ssh your-server | ||
| 145 | + | ||
| 146 | + # 检查SCP权限 | ||
| 147 | + scp test.txt your-server:/path/ | ||
| 148 | + ``` | ||
| 149 | + | ||
| 150 | +### 调试模式 | ||
| 151 | + | ||
| 152 | +```bash | ||
| 153 | +# 在脚本开头添加调试选项 | ||
| 154 | +set -x # 显示执行的每个命令 | ||
| 155 | +set -e # 遇到错误立即退出 | ||
| 156 | +``` | ||
| 157 | + | ||
| 158 | +## 高级用法 | ||
| 159 | + | ||
| 160 | +### 自定义环境组合 | ||
| 161 | + | ||
| 162 | +你可以在 `deploy-config.sh` 中定义多个不同的环境组合: | ||
| 163 | + | ||
| 164 | +```bash | ||
| 165 | +# 开发组合 | ||
| 166 | +dev_array=('dev') | ||
| 167 | + | ||
| 168 | +# 测试组合 | ||
| 169 | +test_array=('dev' 'oa') | ||
| 170 | + | ||
| 171 | +# 生产组合 | ||
| 172 | +prod_array=('mituo' 'guanzong' 'baorong' 'taishan') | ||
| 173 | + | ||
| 174 | +# 全部组合 | ||
| 175 | +all_array=('all') | ||
| 176 | + | ||
| 177 | +# 根据需要选择使用哪个组合 | ||
| 178 | +upload_array=("${test_array[@]}") | ||
| 179 | +``` | ||
| 180 | + | ||
| 181 | +### 环境变量配置 | ||
| 182 | + | ||
| 183 | +```bash | ||
| 184 | +# 可以通过环境变量传递配置 | ||
| 185 | +export DEPLOY_ENVS="dev,oa,mituo" | ||
| 186 | +./deploy.sh ${DEPLOY_ENVS//,/ } | ||
| 187 | +``` | ||
| 188 | + | ||
| 189 | +### 集成到CI/CD | ||
| 190 | + | ||
| 191 | +```yaml | ||
| 192 | +# GitHub Actions 示例 | ||
| 193 | +- name: Deploy to environments | ||
| 194 | + run: | | ||
| 195 | + chmod +x deploy.sh | ||
| 196 | + ./deploy.sh dev oa | ||
| 197 | +``` | ||
| 198 | + | ||
| 199 | +## 与npm脚本的对比 | ||
| 200 | + | ||
| 201 | +| 特性 | npm脚本 | Shell脚本 | | ||
| 202 | +|------|---------|----------| | ||
| 203 | +| 使用复杂度 | 中等 | 简单 | | ||
| 204 | +| 环境选择 | 固定 | 灵活 | | ||
| 205 | +| 批量部署 | 需要多个命令 | 一个命令 | | ||
| 206 | +| 错误处理 | 基础 | 完善 | | ||
| 207 | +| 用户界面 | 基础 | 友好 | | ||
| 208 | +| 确认机制 | 无 | 有 | | ||
| 209 | +| 进度显示 | 无 | 有 | | ||
| 210 | + | ||
| 211 | +## 总结 | ||
| 212 | + | ||
| 213 | +Shell脚本提供了更加灵活和用户友好的部署方式: | ||
| 214 | + | ||
| 215 | +✅ **简单易用** - 一行命令完成多环境部署 | ||
| 216 | +✅ **灵活配置** - 支持任意环境组合 | ||
| 217 | +✅ **安全可靠** - 完善的错误处理和确认机制 | ||
| 218 | +✅ **用户友好** - 彩色输出和详细进度提示 | ||
| 219 | +✅ **高效部署** - 一次编译,多环境部署 | ||
| 220 | + | ||
| 221 | +推荐使用 `deploy-config.sh` 进行日常部署,使用 `deploy.sh` 进行临时的灵活部署。 | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
deploy-config.sh
0 → 100755
| 1 | +#!/bin/bash | ||
| 2 | + | ||
| 3 | +# 部署配置文件 | ||
| 4 | +# 在这里定义你想要部署的环境组合 | ||
| 5 | + | ||
| 6 | +# 使用方法: | ||
| 7 | +# 1. 修改下面的 upload_array 数组,添加你需要的环境 | ||
| 8 | +# 2. 运行: ./deploy-config.sh | ||
| 9 | + | ||
| 10 | +# 定义部署环境数组 - 根据需要修改这里 | ||
| 11 | +# upload_array=('dev' 'oa' 'mituo') | ||
| 12 | + | ||
| 13 | +# 你也可以定义多个不同的组合: | ||
| 14 | +# upload_array=('dev' 'oa') # 仅开发和OA环境 | ||
| 15 | +upload_array=('oa' 'mituo' 'guanzong' 'baorong' 'taishan' 'xys') # 仅这三个环境 | ||
| 16 | +# upload_array=('all') # 所有环境 | ||
| 17 | + | ||
| 18 | +# 颜色定义 | ||
| 19 | +GREEN='\033[0;32m' | ||
| 20 | +BLUE='\033[0;34m' | ||
| 21 | +YELLOW='\033[1;33m' | ||
| 22 | +NC='\033[0m' | ||
| 23 | + | ||
| 24 | +echo -e "${BLUE}=== 自动部署脚本 ===${NC}" | ||
| 25 | +echo -e "${YELLOW}配置的部署环境: ${upload_array[*]}${NC}" | ||
| 26 | +echo "" | ||
| 27 | + | ||
| 28 | +# 调用主部署脚本 | ||
| 29 | +./deploy.sh "${upload_array[@]}" | ||
| 30 | + | ||
| 31 | +# 检查部署结果 | ||
| 32 | +if [[ $? -eq 0 ]]; then | ||
| 33 | + echo -e "${GREEN}✅ 部署任务完成!${NC}" | ||
| 34 | +else | ||
| 35 | + echo -e "${RED}❌ 部署过程中出现错误${NC}" | ||
| 36 | + exit 1 | ||
| 37 | +fi |
deploy.sh
0 → 100755
| 1 | +#!/bin/bash | ||
| 2 | + | ||
| 3 | +# 部署脚本 - 智能批量部署工具 | ||
| 4 | +# 使用方法: ./deploy.sh [环境1] [环境2] [环境3] ... | ||
| 5 | +# 示例: ./deploy.sh dev oa mituo | ||
| 6 | + | ||
| 7 | +# 颜色定义 | ||
| 8 | +RED='\033[0;31m' | ||
| 9 | +GREEN='\033[0;32m' | ||
| 10 | +YELLOW='\033[1;33m' | ||
| 11 | +BLUE='\033[0;34m' | ||
| 12 | +NC='\033[0m' # No Color | ||
| 13 | + | ||
| 14 | +# 打印带颜色的消息 | ||
| 15 | +print_info() { | ||
| 16 | + echo -e "${BLUE}[INFO]${NC} $1" | ||
| 17 | +} | ||
| 18 | + | ||
| 19 | +print_success() { | ||
| 20 | + echo -e "${GREEN}[SUCCESS]${NC} $1" | ||
| 21 | +} | ||
| 22 | + | ||
| 23 | +print_warning() { | ||
| 24 | + echo -e "${YELLOW}[WARNING]${NC} $1" | ||
| 25 | +} | ||
| 26 | + | ||
| 27 | +print_error() { | ||
| 28 | + echo -e "${RED}[ERROR]${NC} $1" | ||
| 29 | +} | ||
| 30 | + | ||
| 31 | +# 支持的环境列表 | ||
| 32 | +declare -A ENVIRONMENTS | ||
| 33 | +ENVIRONMENTS["dev"]="开发环境" | ||
| 34 | +ENVIRONMENTS["oa"]="OA环境" | ||
| 35 | +ENVIRONMENTS["mituo"]="弥陀寺环境" | ||
| 36 | +ENVIRONMENTS["guanzong"]="观宗寺环境" | ||
| 37 | +ENVIRONMENTS["baorong"]="包容寺环境" | ||
| 38 | +ENVIRONMENTS["taishan"]="泰山寺环境" | ||
| 39 | +ENVIRONMENTS["xys"]="西园寺环境" | ||
| 40 | +ENVIRONMENTS["zentea"]="Zentea环境" | ||
| 41 | + | ||
| 42 | +# 显示帮助信息 | ||
| 43 | +show_help() { | ||
| 44 | + echo "部署脚本使用说明:" | ||
| 45 | + echo "" | ||
| 46 | + echo "使用方法:" | ||
| 47 | + echo " ./deploy.sh [环境1] [环境2] [环境3] ..." | ||
| 48 | + echo "" | ||
| 49 | + echo "支持的环境:" | ||
| 50 | + for env in "${!ENVIRONMENTS[@]}"; do | ||
| 51 | + echo " $env - ${ENVIRONMENTS[$env]}" | ||
| 52 | + done | ||
| 53 | + echo "" | ||
| 54 | + echo "示例:" | ||
| 55 | + echo " ./deploy.sh dev oa mituo # 部署到开发、OA、米托环境" | ||
| 56 | + echo " ./deploy.sh all # 部署到所有环境" | ||
| 57 | + echo " ./deploy.sh --help # 显示帮助信息" | ||
| 58 | + echo "" | ||
| 59 | +} | ||
| 60 | + | ||
| 61 | +# 检查环境是否有效 | ||
| 62 | +validate_environment() { | ||
| 63 | + local env=$1 | ||
| 64 | + if [[ ! ${ENVIRONMENTS[$env]+_} ]]; then | ||
| 65 | + print_error "不支持的环境: $env" | ||
| 66 | + print_info "支持的环境: ${!ENVIRONMENTS[*]}" | ||
| 67 | + return 1 | ||
| 68 | + fi | ||
| 69 | + return 0 | ||
| 70 | +} | ||
| 71 | + | ||
| 72 | +# 编译打包 | ||
| 73 | +build_project() { | ||
| 74 | + print_info "开始编译打包..." | ||
| 75 | + | ||
| 76 | + # 检查是否存在 package.json | ||
| 77 | + if [[ ! -f "package.json" ]]; then | ||
| 78 | + print_error "未找到 package.json 文件,请在项目根目录执行此脚本" | ||
| 79 | + exit 1 | ||
| 80 | + fi | ||
| 81 | + | ||
| 82 | + # 执行编译打包 | ||
| 83 | + npm run build | ||
| 84 | + if [[ $? -ne 0 ]]; then | ||
| 85 | + print_error "编译失败" | ||
| 86 | + exit 1 | ||
| 87 | + fi | ||
| 88 | + | ||
| 89 | + npm run tar | ||
| 90 | + if [[ $? -ne 0 ]]; then | ||
| 91 | + print_error "打包失败" | ||
| 92 | + exit 1 | ||
| 93 | + fi | ||
| 94 | + | ||
| 95 | + # 检查打包文件是否存在 | ||
| 96 | + if [[ ! -f "dist.tar.gz" ]]; then | ||
| 97 | + print_error "打包文件 dist.tar.gz 不存在" | ||
| 98 | + exit 1 | ||
| 99 | + fi | ||
| 100 | + | ||
| 101 | + print_success "编译打包完成" | ||
| 102 | +} | ||
| 103 | + | ||
| 104 | +# 部署到指定环境 | ||
| 105 | +deploy_to_environment() { | ||
| 106 | + local env=$1 | ||
| 107 | + local env_name=${ENVIRONMENTS[$env]} | ||
| 108 | + | ||
| 109 | + print_info "开始部署到 $env_name ($env)..." | ||
| 110 | + | ||
| 111 | + # 执行上传 | ||
| 112 | + npm run scp-$env | ||
| 113 | + if [[ $? -ne 0 ]]; then | ||
| 114 | + print_error "上传到 $env_name 失败" | ||
| 115 | + return 1 | ||
| 116 | + fi | ||
| 117 | + | ||
| 118 | + # 执行解压 | ||
| 119 | + npm run dec-$env | ||
| 120 | + if [[ $? -ne 0 ]]; then | ||
| 121 | + print_error "在 $env_name 解压失败" | ||
| 122 | + return 1 | ||
| 123 | + fi | ||
| 124 | + | ||
| 125 | + print_success "部署到 $env_name 完成" | ||
| 126 | + return 0 | ||
| 127 | +} | ||
| 128 | + | ||
| 129 | +# 清理临时文件 | ||
| 130 | +cleanup() { | ||
| 131 | + print_info "清理临时文件..." | ||
| 132 | + | ||
| 133 | + if [[ -f "dist.tar.gz" ]]; then | ||
| 134 | + rm -f dist.tar.gz | ||
| 135 | + print_info "删除 dist.tar.gz" | ||
| 136 | + fi | ||
| 137 | + | ||
| 138 | + if [[ -d "front" ]]; then | ||
| 139 | + rm -rf front | ||
| 140 | + print_info "删除 front 目录" | ||
| 141 | + fi | ||
| 142 | + | ||
| 143 | + print_success "清理完成" | ||
| 144 | +} | ||
| 145 | + | ||
| 146 | +# 主函数 | ||
| 147 | +main() { | ||
| 148 | + # 检查参数 | ||
| 149 | + if [[ $# -eq 0 ]] || [[ "$1" == "--help" ]] || [[ "$1" == "-h" ]]; then | ||
| 150 | + show_help | ||
| 151 | + exit 0 | ||
| 152 | + fi | ||
| 153 | + | ||
| 154 | + # 解析环境参数 | ||
| 155 | + local environments=() | ||
| 156 | + | ||
| 157 | + if [[ "$1" == "all" ]]; then | ||
| 158 | + # 部署到所有环境 | ||
| 159 | + environments=("${!ENVIRONMENTS[@]}") | ||
| 160 | + print_info "将部署到所有环境: ${environments[*]}" | ||
| 161 | + else | ||
| 162 | + # 验证指定的环境 | ||
| 163 | + for env in "$@"; do | ||
| 164 | + if validate_environment "$env"; then | ||
| 165 | + environments+=("$env") | ||
| 166 | + else | ||
| 167 | + exit 1 | ||
| 168 | + fi | ||
| 169 | + done | ||
| 170 | + print_info "将部署到环境: ${environments[*]}" | ||
| 171 | + fi | ||
| 172 | + | ||
| 173 | + # 确认部署 | ||
| 174 | + echo "" | ||
| 175 | + print_warning "即将部署到以下环境:" | ||
| 176 | + for env in "${environments[@]}"; do | ||
| 177 | + echo " - $env (${ENVIRONMENTS[$env]})" | ||
| 178 | + done | ||
| 179 | + echo "" | ||
| 180 | + read -p "确认继续? (y/N): " -n 1 -r | ||
| 181 | + echo "" | ||
| 182 | + if [[ ! $REPLY =~ ^[Yy]$ ]]; then | ||
| 183 | + print_info "部署已取消" | ||
| 184 | + exit 0 | ||
| 185 | + fi | ||
| 186 | + | ||
| 187 | + # 记录开始时间 | ||
| 188 | + local start_time=$(date +%s) | ||
| 189 | + | ||
| 190 | + # 编译打包 | ||
| 191 | + build_project | ||
| 192 | + | ||
| 193 | + # 部署到各个环境 | ||
| 194 | + local success_count=0 | ||
| 195 | + local failed_environments=() | ||
| 196 | + | ||
| 197 | + for env in "${environments[@]}"; do | ||
| 198 | + if deploy_to_environment "$env"; then | ||
| 199 | + ((success_count++)) | ||
| 200 | + else | ||
| 201 | + failed_environments+=("$env") | ||
| 202 | + fi | ||
| 203 | + echo "" # 添加空行分隔 | ||
| 204 | + done | ||
| 205 | + | ||
| 206 | + # 清理临时文件 | ||
| 207 | + cleanup | ||
| 208 | + | ||
| 209 | + # 计算耗时 | ||
| 210 | + local end_time=$(date +%s) | ||
| 211 | + local duration=$((end_time - start_time)) | ||
| 212 | + | ||
| 213 | + # 显示部署结果 | ||
| 214 | + echo "" | ||
| 215 | + print_info "=== 部署结果汇总 ===" | ||
| 216 | + print_success "成功部署: $success_count/${#environments[@]} 个环境" | ||
| 217 | + | ||
| 218 | + if [[ ${#failed_environments[@]} -gt 0 ]]; then | ||
| 219 | + print_error "失败环境: ${failed_environments[*]}" | ||
| 220 | + fi | ||
| 221 | + | ||
| 222 | + print_info "总耗时: ${duration}秒" | ||
| 223 | + | ||
| 224 | + # 退出码 | ||
| 225 | + if [[ ${#failed_environments[@]} -gt 0 ]]; then | ||
| 226 | + exit 1 | ||
| 227 | + else | ||
| 228 | + print_success "所有环境部署完成!" | ||
| 229 | + exit 0 | ||
| 230 | + fi | ||
| 231 | +} | ||
| 232 | + | ||
| 233 | +# 捕获中断信号,确保清理 | ||
| 234 | +trap cleanup EXIT INT TERM | ||
| 235 | + | ||
| 236 | +# 执行主函数 | ||
| 237 | +main "$@" |
-
Please register or login to post a comment