GitBook 自动拉取仓库脚本

#!/bin/bash

#######################################################
# GitBook 自动构建脚本(带完整日志记录)
# 功能:定期同步Git仓库并自动构建GitBook文档
# 日志:所有操作记录到/var/log/gitbook_auto_build.log
#######################################################

# 配置参数区
LOG_FILE="/root/shell/log/gitbook_auto_build.log"
REPO_URL="https://gitee.com/ye-ziheng123/automatic-note-taking.git"
TARGET_DIR="/www/wwwroot/gitbook.yumesakura.com"

set -euo pipefail  # 开启错误退出、未定义变量检测、管道错误检测

# 创建日志目录(如果不存在)
mkdir -p $(dirname "$LOG_FILE")
touch "$LOG_FILE"

# 日志记录函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

# 严格Git仓库检测函数
is_git_repo() {
    [ -d "$1/.git" ] && git -C "$1" rev-parse --is-inside-work-tree >/dev/null 2>&1
}

# 添加目标目录到 Git 安全目录列表
git config --global --add safe.directory "$TARGET_DIR" 2>> "$LOG_FILE" || {
    log "错误:无法添加 $TARGET_DIR 到 Git 安全目录列表"
    exit 1
}

# 主程序开始
log "========== 开始执行GitBook自动构建 =========="

# Git仓库同步模块
if is_git_repo "$TARGET_DIR"; then
    log "检测到有效Git仓库,正在拉取新内容..."
    cd "$TARGET_DIR"
    git pull >> "$LOG_FILE" 2>&1 || {
        log "错误:Git拉取失败!最后10行日志:"
        tail -n 10 "$LOG_FILE" | tee -a "$LOG_FILE"
        exit 1
    }
    log "远程仓库同步后清理本地多余的文件(排除SUMMARY.md文件和_book目录)..."
    git clean -fd --exclude=SUMMARY.md --exclude=_book/



else
    log "未检测到有效Git仓库,正在进行初始化..."
    if [ -d "$TARGET_DIR" ]; then
        log "警告:目标目录已存在但非Git仓库,尝试安全清空目标目录后重新克隆..."

        log "正在安全清理目标目录..."

        EXCLUDE_LIST=(
            ".user.ini"       # 保留文件
            "gitbook_auto_build.log"
        )

        safe_clean_dir() {
            local dir="${1:?错误:未指定目录参数}"  # 强制参数检查
            log "正在安全清理目录: $dir (保留: ${EXCLUDE_LIST[*]})"

            # 防误删根目录保护
            [[ "$dir" == "/" ]] && {
                log "致命错误:拒绝清理根目录!"
                exit 1
            }

            # 检查目录是否存在
            [ -d "$dir" ] || {
                log "目录不存在,无需清理"
                return 0
            }

            # 检查目录可写权限
            [ -w "$dir" ] || {
                log "错误:对目录 $dir 没有写权限!"
                return 1
            }

            # 安全生成排除路径列表
            local exclude_patterns=()
            for item in "${EXCLUDE_LIST[@]}"; do
                exclude_patterns+=(! -path "$(realpath -- "$dir")/$item")
            done

            # 执行清理(带详细日志)
            find "$dir" -mindepth 1 "${exclude_patterns[@]}" -exec rm -rfv {} + >> "$LOG_FILE" 2>&1

            if [ $? -ne 0 ]; then
                log "警告:部分内容清理失败(可能权限问题)"
                return 1
            fi
            log "目录清理完成(已保留指定文件)"
            return 0
        }

        # 使用示例
        safe_clean_dir "$TARGET_DIR" || {
            log "关键错误:目录清理失败!"
            exit 1
        }

    fi

    log "正在克隆Git仓库到: $TARGET_DIR"
    git clone "$REPO_URL" "$TARGET_DIR" >> "$LOG_FILE" 2>&1 || {
        log "错误:Git克隆失败!最后10行日志:"
        tail -n 10 "$LOG_FILE" | tee -a "$LOG_FILE"
        exit 1
    }
fi

# GitBook构建模块
cd "$TARGET_DIR" >> "$LOG_FILE" 2>&1 || {
    log "错误:无法进入目标目录!"
    exit 1
}

log "正在生成目录索引文件SUMMARY.md..."
book sm >> "$LOG_FILE" 2>&1 || {
    log "错误:生成SUMMARY.md失败!最后10行日志:"
    tail -n 10 "$LOG_FILE" | tee -a "$LOG_FILE"
    exit 1
}

log "正在准备GitBook环境..."
gitbook init >> "$LOG_FILE" 2>&1 || {
    log "警告:GitBook初始化可能不完全,最后10行日志:"
    tail -n 10 "$LOG_FILE" | tee -a "$LOG_FILE"
}

log "开始构建GitBook静态网页..."
gitbook build >> "$LOG_FILE" 2>&1 || {
    log "错误:GitBook构建失败!最后10行日志:"
    tail -n 10 "$LOG_FILE" | tee -a "$LOG_FILE"
    exit 1
}

log "GitBook自动构建成功完成"
log "========== 执行结束 =========="
# 日志文件说明:
# 1. 包含完整的时间戳
# 2. 记录所有命令输出
# 3. 每次执行有开始结束标记
# 4. 错误信息会同时在终端和日志显示
# 5. 自动创建日志文件(如果不存在)
梦葉樱 all right reserved,powered by Gitbook该文件最后修改时间: 2025-07-22 17:22:02

results matching ""

    No results matching ""