From 9b993e487c19cacbeccd154513244bc688ed1944 Mon Sep 17 00:00:00 2001 From: pllx Date: Mon, 4 May 2026 18:23:54 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=83=A8=E7=BD=B2=E8=84=9A?= =?UTF-8?q?=E6=9C=AC=E8=B7=B3=E8=BF=87=E6=97=A0=E5=85=B3=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy_update.sh | 75 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 69 insertions(+), 6 deletions(-) diff --git a/deploy_update.sh b/deploy_update.sh index 0cdbc8c..5e9bfe0 100644 --- a/deploy_update.sh +++ b/deploy_update.sh @@ -40,11 +40,57 @@ fi PHP_VERSION=$("$PHP_BIN" -r 'echo PHP_VERSION;' 2>/dev/null) echo -e "${BLUE}使用 PHP:$PHP_BIN (版本:${PHP_VERSION:-unknown})${NC}" +frontend_build_required() { + local file="$1" + + case "$file" in + resources/js/*|resources/css/*|resources/views/*.blade.php|resources/views/*/*.blade.php|resources/views/*/*/*.blade.php|resources/views/*/*/*/*.blade.php) + return 0 + ;; + package.json|package-lock.json|vite.config.*|tailwind.config.*|postcss.config.*) + return 0 + ;; + esac + + return 1 +} + # 1. Git Pull(先重置 lock 文件,避免服务器环境差异导致冲突) echo -e "${YELLOW}[1/8] 拉取代码...${NC}" +BEFORE_REV=$(git rev-parse HEAD 2>/dev/null || echo "") git checkout -- composer.lock package-lock.json 2>/dev/null || true git fetch origin && git pull origin master if [ $? -ne 0 ]; then echo -e "${RED}❌ Git 失败${NC}"; exit 1; fi +AFTER_REV=$(git rev-parse HEAD 2>/dev/null || echo "") + +FRONTEND_BUILD_NEEDED=0 +FRONTEND_CHANGED_FILES="" +MIGRATION_NEEDED=0 +NEW_MIGRATION_FILES="" +if [ -z "$BEFORE_REV" ] || [ -z "$AFTER_REV" ]; then + FRONTEND_BUILD_NEEDED=1 + FRONTEND_CHANGED_FILES="无法识别更新前后版本,保险起见执行构建" + MIGRATION_NEEDED=1 + NEW_MIGRATION_FILES="无法识别更新前后版本,保险起见执行迁移检查" +elif [ "$BEFORE_REV" != "$AFTER_REV" ]; then + while IFS= read -r changed_file; do + if frontend_build_required "$changed_file"; then + FRONTEND_BUILD_NEEDED=1 + FRONTEND_CHANGED_FILES="${FRONTEND_CHANGED_FILES}${changed_file}"$'\n' + fi + done < <(git diff --name-only "$BEFORE_REV" "$AFTER_REV") + + while IFS=$'\t' read -r change_status changed_file extra_path; do + if [ "$change_status" = "A" ]; then + case "$changed_file" in + database/migrations/*.php) + MIGRATION_NEEDED=1 + NEW_MIGRATION_FILES="${NEW_MIGRATION_FILES}${changed_file}"$'\n' + ;; + esac + fi + done < <(git diff --name-status "$BEFORE_REV" "$AFTER_REV") +fi # 2. Composer Install (关键检查点) echo -e "${YELLOW}[2/8] 安装依赖 (Composer)...${NC}" @@ -92,15 +138,32 @@ if [ $? -ne 0 ]; then fi # 3. 前端构建 -echo -e "${YELLOW}[3/8] 前端构建 (npm run build)...${NC}" -npm run build -if [ $? -ne 0 ]; then echo -e "${RED}❌ npm run build 失败${NC}"; exit 1; fi -echo -e "${GREEN}✅ 前端资源构建完成。${NC}" +if [ "$FRONTEND_BUILD_NEEDED" -eq 1 ]; then + echo -e "${YELLOW}[3/8] 检测到前端构建输入变更,开始前端构建 (npm run build)...${NC}" + if [ -n "$FRONTEND_CHANGED_FILES" ]; then + echo -e "${BLUE}触发构建的文件:${NC}" + printf '%s\n' "$FRONTEND_CHANGED_FILES" + fi + npm run build + if [ $? -ne 0 ]; then echo -e "${RED}❌ npm run build 失败${NC}"; exit 1; fi + echo -e "${GREEN}✅ 前端资源构建完成。${NC}" +else + echo -e "${GREEN}[3/8] 未检测到前端构建输入变更,跳过 npm run build。${NC}" +fi # 4. 数据库迁移 -echo -e "${YELLOW}[4/8] 数据库迁移...${NC}" -"$PHP_BIN" artisan migrate --force +if [ "$MIGRATION_NEEDED" -eq 1 ]; then + echo -e "${YELLOW}[4/8] 检测到新增迁移文件,执行数据库迁移...${NC}" + if [ -n "$NEW_MIGRATION_FILES" ]; then + echo -e "${BLUE}新增迁移文件:${NC}" + printf '%s\n' "$NEW_MIGRATION_FILES" + fi + "$PHP_BIN" artisan migrate --force + if [ $? -ne 0 ]; then echo -e "${RED}❌ 数据库迁移失败${NC}"; exit 1; fi +else + echo -e "${GREEN}[4/8] 未检测到新增迁移文件,跳过数据库迁移。${NC}" +fi # 5. 优化 echo -e "${YELLOW}[5/8] 生产环境优化...${NC}"