#!/usr/bin/env bash # ========================================== # 花信 自动部署脚本 # 用法: ./deploy.sh [环境] # 默认部署到生产服务器 # ========================================== set -euo pipefail # ----- 配置(根据需要修改)----- REMOTE_HOST="100.64.0.2" REMOTE_USER="root" REMOTE_PATH="/var/www/huaxin/" NGINX_RELOAD="nginx -s reload" # ------------------------------ RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' CYAN='\033[0;36m' NC='\033[0m' # No Color log() { echo -e "${CYAN}[deploy]${NC} $1"; } ok() { echo -e "${GREEN}[ ok ]${NC} $1"; } warn() { echo -e "${YELLOW}[ warn ]${NC} $1"; } fail() { echo -e "${RED}[fail ]${NC} $1"; exit 1; } # 1. 检查 git 工作区是否干净 log "检查 git 工作区..." if ! git diff --quiet HEAD 2>/dev/null; then fail "工作区有未提交的修改,请先 git commit" fi if [ -n "$(git status --porcelain)" ]; then fail "工作区有未跟踪的文件,请先 git add/commit 或添加到 .gitignore" fi ok "工作区干净" # 2. 获取版本号 VERSION=$(git describe --tags --abbrev=0 2>/dev/null || echo "dev") log "部署版本: ${YELLOW}${VERSION}${NC}" # 3. 安装依赖 log "安装依赖..." npm install --silent --legacy-peer-deps 2>/dev/null || npm install --legacy-peer-deps ok "依赖就绪" # 4. 构建 log "构建项目..." npm run build ok "构建完成" # 5. 上传到服务器 log "上传到 ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}..." ssh "${REMOTE_USER}@${REMOTE_HOST}" "mkdir -p ${REMOTE_PATH}" scp -qr dist/* "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}" ok "上传完成" # 6. 重载 Nginx log "重载 Nginx..." ssh "${REMOTE_USER}@${REMOTE_HOST}" "nginx -t && ${NGINX_RELOAD}" ok "Nginx 重载完成" # 7. 验证 sleep 1 HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" "https://${REMOTE_HOST}/huaxin/") if [ "$HTTP_CODE" = "200" ]; then ok "部署验证通过 (HTTP ${HTTP_CODE})" else warn "部署验证返回 HTTP ${HTTP_CODE},请手动检查" fi echo "" echo -e "${GREEN}========================================${NC}" echo -e "${GREEN} 花信 ${VERSION} 部署完成!${NC}" echo -e "${GREEN} https://${REMOTE_HOST}/huaxin/${NC}" echo -e "${GREEN}========================================${NC}"