#!/bin/bash # Enhanced Deployment Script for junma-api # 参考PowerShell脚本结构,实现bash发布命令 set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' CYAN='\033[0;36m' NC='\033[0m' # No Color # 日志函数 log_info() { echo -e "${GREEN}$1${NC}" } log_warn() { echo -e "${YELLOW}$1${NC}" } log_error() { echo -e "${RED}$1${NC}" } log_step() { echo -e "${CYAN}$1${NC}" } # 错误处理函数 handle_error() { log_error "部署失败: $1" exit 1 } # 主部署流程 log_info "开始 junma-api 部署..." try { # 拉取最新代码 log_warn "拉取最新代码..." if ! git pull origin main; then handle_error "Git pull 失败" fi # 清理旧的构建文件 log_warn "清理旧的构建文件..." if [ -d "dist" ]; then rm -rf dist fi # 清理node_modules(可选) if [ -d "node_modules" ]; then log_warn "清理node_modules..." rm -rf node_modules fi # 移除锁文件(可选) if [ -f "package-lock.json" ]; then rm -f package-lock.json fi if [ -f "yarn.lock" ]; then rm -f yarn.lock fi # 安装依赖 log_warn "安装依赖..." if ! yarn install; then handle_error "依赖安装失败" fi # 构建生产版本 log_warn "构建生产版本..." if ! yarn build; then handle_error "构建失败" fi # 检查构建结果 log_warn "检查构建结果..." if [ ! -d "dist" ]; then handle_error "构建失败,dist目录不存在" fi # 复制环境配置文件 log_warn "复制环境配置文件..." if [ -f ".env.production" ]; then cp .env.production dist/.env else log_warn "警告: .env.production 文件不存在" fi # 复制package.json cp package.json dist/package.json # 部署到服务器 log_warn "部署到服务器..." # 尝试不同的上传方法 upload_success=false # 尝试rsync if command -v rsync >/dev/null 2>&1; then log_step "使用rsync上传..." if rsync --exclude='node_modules/' -ravzh --delete -e "ssh -o StrictHostKeyChecking=no" ./dist/ root@8.210.167.152:/var/www/junma-api/; then upload_success=true log_info "rsync上传成功" else log_warn "rsync上传失败,尝试scp..." fi else log_warn "rsync不可用,尝试scp..." fi # 尝试scp如果rsync失败 if [ "$upload_success" = false ]; then if command -v scp >/dev/null 2>&1; then log_step "使用scp上传..." if scp -r -o StrictHostKeyChecking=no ./dist/* root@8.210.167.152:/var/www/junma-api/; then upload_success=true log_info "scp上传成功" else handle_error "scp上传失败" fi else handle_error "没有可用的上传工具 (rsync/scp)" fi fi if [ "$upload_success" = false ]; then handle_error "文件上传失败 - 没有找到可用的上传方法" fi # 在服务器上执行部署后操作 log_warn "在服务器上执行部署后操作..." if ssh -o StrictHostKeyChecking=no root@8.210.167.152 "cd /var/www/junma-api && yarn install && pm2 restart junma-api"; then log_info "服务器部署操作成功" else handle_error "服务器部署操作失败" fi log_info "部署完成!" log_info "API服务已重启" log_info "服务地址: http://8.210.167.152:3000" } catch { log_error "部署过程中发生错误: $1" exit 1 }