#!/bin/bash # kb-web 自动部署脚本 # 用法: ./deploy.sh [test|prod] [branch] set -e DEPLOY_ENV=${1:-test} BRANCH=${2:-main} TIMESTAMP=$(date +"%Y%m%d_%H%M%S") # 配置 case $DEPLOY_ENV in test) DEPLOY_DIR="/var/www/kb-web-test" BACKUP_DIR="/var/www/kb-web-test-backups" ;; prod) DEPLOY_DIR="/var/www/kb-web-prod" BACKUP_DIR="/var/www/kb-web-prod-backups" ;; *) echo "用法: $0 [test|prod] [branch]" exit 1 ;; esac REPO_URL="ssh://sc-gitea@192.168.1.22:2223/starmen1265/kb-web.git" LOG_FILE="/var/log/kb-web-deploy.log" log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" } log "========== 开始部署 $DEPLOY_ENV 环境 ==========" log "分支: $BRANCH" log "目标目录: $DEPLOY_DIR" # 创建目录 mkdir -p "$DEPLOY_DIR" "$BACKUP_DIR" "$(dirname "$LOG_FILE")" # 备份当前版本 if [ -d "$DEPLOY_DIR/.git" ]; then log "备份当前版本..." CURRENT_COMMIT=$(cd "$DEPLOY_DIR" && git rev-parse --short HEAD 2>/dev/null || echo "unknown") tar -czf "$BACKUP_DIR/backup_${CURRENT_COMMIT}_${TIMESTAMP}.tar.gz" -C "$DEPLOY_DIR" . 2>/dev/null || true # 只保留最近5个备份 cd "$BACKUP_DIR" && ls -t | tail -n +6 | xargs -r rm -f fi # 拉取代码 if [ -d "$DEPLOY_DIR/.git" ]; then log "更新代码..." cd "$DEPLOY_DIR" git fetch origin git reset --hard "origin/$BRANCH" else log "克隆代码..." git clone -b "$BRANCH" "$REPO_URL" "$DEPLOY_DIR" cd "$DEPLOY_DIR" fi # 设置权限 log "设置权限..." chown -R www-data:www-data "$DEPLOY_DIR" 2>/dev/null || chown -R nginx:nginx "$DEPLOY_DIR" 2>/dev/null || true find "$DEPLOY_DIR" -type d -exec chmod 755 {} \; find "$DEPLOY_DIR" -type f -exec chmod 644 {} \; # 记录部署信息 DEPLOY_INFO="$DEPLOY_DIR/.deploy_info" cat > "$DEPLOY_INFO" << EOF 环境: $DEPLOY_ENV 分支: $BRANCH 提交: $(git rev-parse HEAD) 时间: $(date '+%Y-%m-%d %H:%M:%S') 部署者: webhook EOF log "部署完成!" log "提交: $(git log -1 --oneline)" log "=========================================="