#!/bin/bash # ================= 配置区域 ================= # 源代码路径 SOURCE_DIR="/home/lq/lq_workspace/source/LQAgentPlatform" # Docker Compose 运行路径 DOCKER_APP_DIR="/home/lq/lq_workspace/app/LqAgentServer/docker" # 配置文件名称 COMPOSE_FILE="docker-compose.yml" # 镜像名称 (Repository) IMAGE_NAME="lq_agent_platform_server" # Git 凭证 GIT_USER="WangXuMing" GIT_PASS="123456" # ================= 辅助函数 ================= # 打印带时间戳的日志 log_info() { echo -e "\033[32m[INFO] $(date '+%Y-%m-%d %H:%M:%S') - $1\033[0m" } log_error() { echo -e "\033[31m[ERROR] $(date '+%Y-%m-%d %H:%M:%S') - $1\033[0m" } # 检查命令执行状态,如果失败则退出 check_status() { if [ $? -ne 0 ]; then log_error "$1 执行失败,脚本终止。" exit 1 fi } # ================= 步骤 1: Git 拉取代码 (带重试+强制拉取) ================= log_info "步骤 1: 进入源码目录并拉取最新代码..." if [ ! -d "$SOURCE_DIR" ]; then log_error "源码目录不存在: $SOURCE_DIR" exit 1 fi # 检查目录进入权限并修复 if [ ! -x "$SOURCE_DIR" ]; then log_error "源码目录无进入权限!正在修复..." sudo chmod +x "$SOURCE_DIR" sudo chown -R lq:lq "$SOURCE_DIR" fi cd "$SOURCE_DIR" || { log_error "进入源码目录失败!路径:$SOURCE_DIR" log_error "可能原因:1. 目录权限不足 2. 路径含特殊字符 3. 目录被删除" exit 1 } check_status "进入源码目录" # 双重保障 # 检查是否为 Git 仓库 if [ ! -d ".git" ]; then log_error "当前目录不是 Git 仓库!路径:$SOURCE_DIR" exit 1 fi log_info "检查本地是否存在可能与远程冲突的已修改文件..." HAS_CONFLICT_FILES=$(git status --porcelain | grep -v "^??") if [ -n "$HAS_CONFLICT_FILES" ]; then log_info "发现以下文件存在本地修改(将被远程最新代码覆盖):" echo "$HAS_CONFLICT_FILES" | awk '{print " - " $2}' log_info "正在强制丢弃本地修改,确保同步远程最新代码..." # 强制丢弃修改 git checkout -- . # 仅丢弃已跟踪文件的本地修改(冲突风险文件) log_info "本地冲突文件修改已丢弃,准备拉取远程最新代码..." else log_info "本地无可能冲突的已修改文件,直接拉取远程最新代码..." fi # 组装 Git 认证 URL(保留原逻辑) ORIGIN_URL=$(git remote get-url origin 2>/dev/null) if [ $? -ne 0 ]; then log_error "获取 Git 远程地址失败!请检查 remote 配置" exit 1 fi CLEAN_URL=${ORIGIN_URL#*://} AUTH_URL="http://${GIT_USER}:${GIT_PASS}@${CLEAN_URL}" MAX_RETRIES=3 COUNT=0 GIT_SUCCESS=0 while [ $COUNT -lt $MAX_RETRIES ]; do log_info "正在执行 Git Pull (第 $((COUNT+1)) 次尝试) - 强制拉取 dev 分支最新代码..." # 核心修改:明确分支+强制拉取+兼容历史差异 git pull "$AUTH_URL" dev --force --allow-unrelated-histories if [ $? -eq 0 ]; then GIT_SUCCESS=1 # 拉取成功后,打印最新 commit 信息(验证是否为最新) LATEST_COMMIT=$(git log -1 --format="%h - %s ") log_info "Git Pull 成功!当前部署提交版本:$LATEST_COMMIT" break else log_error "Git Pull 失败,准备重试..." COUNT=$((COUNT+1)) sleep 3 # 延长重试间隔,避免频繁请求 fi done if [ $GIT_SUCCESS -eq 0 ]; then log_error "Git Pull 达到最大重试次数,无法更新代码。" exit 1 fi