deploy-enhanced.sh 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #!/bin/bash
  2. # Enhanced Deployment Script for junma-api
  3. # 参考PowerShell脚本结构,实现bash发布命令
  4. set -e
  5. # 颜色定义
  6. RED='\033[0;31m'
  7. GREEN='\033[0;32m'
  8. YELLOW='\033[1;33m'
  9. CYAN='\033[0;36m'
  10. NC='\033[0m' # No Color
  11. # 日志函数
  12. log_info() {
  13. echo -e "${GREEN}$1${NC}"
  14. }
  15. log_warn() {
  16. echo -e "${YELLOW}$1${NC}"
  17. }
  18. log_error() {
  19. echo -e "${RED}$1${NC}"
  20. }
  21. log_step() {
  22. echo -e "${CYAN}$1${NC}"
  23. }
  24. # 错误处理函数
  25. handle_error() {
  26. log_error "部署失败: $1"
  27. exit 1
  28. }
  29. # 主部署流程
  30. log_info "开始 junma-api 部署..."
  31. try {
  32. # 拉取最新代码
  33. log_warn "拉取最新代码..."
  34. if ! git pull origin main; then
  35. handle_error "Git pull 失败"
  36. fi
  37. # 清理旧的构建文件
  38. log_warn "清理旧的构建文件..."
  39. if [ -d "dist" ]; then
  40. rm -rf dist
  41. fi
  42. # 清理node_modules(可选)
  43. if [ -d "node_modules" ]; then
  44. log_warn "清理node_modules..."
  45. rm -rf node_modules
  46. fi
  47. # 移除锁文件(可选)
  48. if [ -f "package-lock.json" ]; then
  49. rm -f package-lock.json
  50. fi
  51. if [ -f "yarn.lock" ]; then
  52. rm -f yarn.lock
  53. fi
  54. # 安装依赖
  55. log_warn "安装依赖..."
  56. if ! yarn install; then
  57. handle_error "依赖安装失败"
  58. fi
  59. # 构建生产版本
  60. log_warn "构建生产版本..."
  61. if ! yarn build; then
  62. handle_error "构建失败"
  63. fi
  64. # 检查构建结果
  65. log_warn "检查构建结果..."
  66. if [ ! -d "dist" ]; then
  67. handle_error "构建失败,dist目录不存在"
  68. fi
  69. # 复制环境配置文件
  70. log_warn "复制环境配置文件..."
  71. if [ -f ".env.production" ]; then
  72. cp .env.production dist/.env
  73. else
  74. log_warn "警告: .env.production 文件不存在"
  75. fi
  76. # 复制package.json
  77. cp package.json dist/package.json
  78. # 部署到服务器
  79. log_warn "部署到服务器..."
  80. # 尝试不同的上传方法
  81. upload_success=false
  82. # 尝试rsync
  83. if command -v rsync >/dev/null 2>&1; then
  84. log_step "使用rsync上传..."
  85. if rsync --exclude='node_modules/' -ravzh --delete -e "ssh -o StrictHostKeyChecking=no" ./dist/ root@8.210.167.152:/var/www/junma-api/; then
  86. upload_success=true
  87. log_info "rsync上传成功"
  88. else
  89. log_warn "rsync上传失败,尝试scp..."
  90. fi
  91. else
  92. log_warn "rsync不可用,尝试scp..."
  93. fi
  94. # 尝试scp如果rsync失败
  95. if [ "$upload_success" = false ]; then
  96. if command -v scp >/dev/null 2>&1; then
  97. log_step "使用scp上传..."
  98. if scp -r -o StrictHostKeyChecking=no ./dist/* root@8.210.167.152:/var/www/junma-api/; then
  99. upload_success=true
  100. log_info "scp上传成功"
  101. else
  102. handle_error "scp上传失败"
  103. fi
  104. else
  105. handle_error "没有可用的上传工具 (rsync/scp)"
  106. fi
  107. fi
  108. if [ "$upload_success" = false ]; then
  109. handle_error "文件上传失败 - 没有找到可用的上传方法"
  110. fi
  111. # 在服务器上执行部署后操作
  112. log_warn "在服务器上执行部署后操作..."
  113. if ssh -o StrictHostKeyChecking=no root@8.210.167.152 "cd /var/www/junma-api && yarn install && pm2 restart junma-api"; then
  114. log_info "服务器部署操作成功"
  115. else
  116. handle_error "服务器部署操作失败"
  117. fi
  118. log_info "部署完成!"
  119. log_info "API服务已重启"
  120. log_info "服务地址: http://8.210.167.152:3000"
  121. } catch {
  122. log_error "部署过程中发生错误: $1"
  123. exit 1
  124. }