deploy.sh 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #!/bin/bash
  2. # 面试管理系统 - 快速部署脚本
  3. # 使用方法: ./deploy.sh
  4. set -e # 遇到错误立即退出
  5. # 颜色输出
  6. RED='\033[0;31m'
  7. GREEN='\033[0;32m'
  8. YELLOW='\033[1;33m'
  9. NC='\033[0m' # No Color
  10. # 打印带颜色的消息
  11. print_info() {
  12. echo -e "${GREEN}[INFO]${NC} $1"
  13. }
  14. print_warn() {
  15. echo -e "${YELLOW}[WARN]${NC} $1"
  16. }
  17. print_error() {
  18. echo -e "${RED}[ERROR]${NC} $1"
  19. }
  20. # 检查命令是否存在
  21. check_command() {
  22. if ! command -v $1 &> /dev/null; then
  23. print_error "$1 未安装,请先安装"
  24. exit 1
  25. fi
  26. }
  27. # 检查环境
  28. print_info "检查环境..."
  29. check_command node
  30. check_command npm
  31. check_command nginx
  32. # 获取 Node.js 版本
  33. NODE_VERSION=$(node -v)
  34. print_info "Node.js 版本: $NODE_VERSION"
  35. # 检查 Node.js 版本
  36. if [[ $(echo $NODE_VERSION | cut -d'.' -f1 | sed 's/v//') -lt 16 ]]; then
  37. print_error "Node.js 版本需要 >= 16.0.0"
  38. exit 1
  39. fi
  40. # 获取当前目录
  41. SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
  42. PROJECT_DIR="$( cd "$SCRIPT_DIR/.." && pwd )"
  43. print_info "项目目录: $PROJECT_DIR"
  44. # 询问是否继续
  45. read -p "是否继续部署? (y/n): " -n 1 -r
  46. echo
  47. if [[ ! $REPLY =~ ^[Yy]$ ]]; then
  48. print_info "部署已取消"
  49. exit 0
  50. fi
  51. # 进入项目目录
  52. cd "$PROJECT_DIR"
  53. # 备份现有构建
  54. if [ -d "dist" ]; then
  55. print_info "备份现有构建..."
  56. if [ -d "dist.backup" ]; then
  57. rm -rf dist.backup
  58. fi
  59. cp -r dist dist.backup
  60. print_info "备份完成"
  61. fi
  62. # 安装依赖
  63. print_info "安装依赖..."
  64. npm ci
  65. # 构建项目
  66. print_info "构建项目..."
  67. npm run build
  68. # 检查构建结果
  69. if [ ! -d "dist" ] || [ -z "$(ls -A dist)" ]; then
  70. print_error "构建失败,dist 目录为空"
  71. exit 1
  72. fi
  73. print_info "构建完成"
  74. # 询问是否部署到服务器
  75. read -p "是否部署到服务器? (y/n): " -n 1 -r
  76. echo
  77. if [[ $REPLY =~ ^[Yy]$ ]]; then
  78. # 部署路径
  79. DEPLOY_PATH="/var/www/interview_web"
  80. # 检查部署路径
  81. if [ ! -d "$DEPLOY_PATH" ]; then
  82. print_warn "部署路径不存在,创建中..."
  83. sudo mkdir -p "$DEPLOY_PATH"
  84. sudo chown -R $USER:www-data "$DEPLOY_PATH"
  85. fi
  86. # 备份服务器文件
  87. if [ -d "$DEPLOY_PATH" ] && [ "$(ls -A $DEPLOY_PATH)" ]; then
  88. print_info "备份服务器文件..."
  89. sudo cp -r "$DEPLOY_PATH" "${DEPLOY_PATH}.backup.$(date +%Y%m%d_%H%M%S)"
  90. fi
  91. # 复制文件
  92. print_info "复制文件到 $DEPLOY_PATH ..."
  93. sudo rm -rf "$DEPLOY_PATH"/*
  94. sudo cp -r dist/* "$DEPLOY_PATH"/
  95. sudo chown -R www-data:www-data "$DEPLOY_PATH"
  96. print_info "文件复制完成"
  97. # 重载 Nginx
  98. print_info "重载 Nginx..."
  99. sudo nginx -t && sudo systemctl reload nginx
  100. print_info "部署完成!"
  101. print_info "访问地址: http://yourdomain.com"
  102. else
  103. print_info "跳过服务器部署"
  104. fi
  105. # 显示构建信息
  106. print_info "构建信息:"
  107. echo " 构建目录: dist/"
  108. echo " 构建时间: $(date)"
  109. echo " Node.js 版本: $NODE_VERSION"
  110. echo " 项目版本: $(cat package.json | grep '"version"' | cut -d'"' -f4)"
  111. print_info "部署脚本执行完成!"