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. 自动创建日志文件(如果不存在)