From 5e03b464c874f370dc3f595741146c005d3ed38b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E5=A4=952077?= <274166795@qq.com> Date: Mon, 23 Jun 2025 23:31:04 +0800 Subject: [PATCH] Update build-daily-book.yml --- .github/workflows/build-daily-book.yml | 141 +++++++++++++------------ 1 file changed, 72 insertions(+), 69 deletions(-) diff --git a/.github/workflows/build-daily-book.yml b/.github/workflows/build-daily-book.yml index 7c18964..b068dcf 100644 --- a/.github/workflows/build-daily-book.yml +++ b/.github/workflows/build-daily-book.yml @@ -1,12 +1,9 @@ name: Build Daily Journal on: - # 每天UTC时间8点自动触发 (对应北京时间下午4点) - # 如果需要北京时间早上8点,请设置为 0 0 * * * + # 每天UTC时间0点自动触发 (对应北京时间早上8点) schedule: - # 这里的 cron 表示每5分钟执行一次,用于测试。 - # 如果要实现 “每天UTC时间8点” ,应改为 '0 8 * * *' - - cron: 0 0 * * * + - cron: '0 0 * * *' # 手动触发 workflow_dispatch: @@ -18,7 +15,7 @@ jobs: env: IMAGE_PROXY_URL: ${{ vars.IMAGE_PROXY_URL }} # 从仓库变量中读取 - # 需要写入权限来提交生成的文件 + # 需要写入权限来提交生成的文件和归档的日刊 permissions: contents: write @@ -27,7 +24,7 @@ jobs: uses: actions/checkout@v4 with: # 明确指定要检出的分支 - ref: 'book' # <-- (3) 请将 'main' 替换为你的目标分支名 + ref: 'book' # <-- 请将 'book' 替换为你的目标分支名 - name: Install mdBook run: | @@ -37,38 +34,64 @@ jobs: - name: Replace image URLs in daily notes run: | - echo "开始替换 daily/ 目录下的 Markdown 文件内容..." - echo "使用的代理前缀: ${{ env.IMAGE_PROXY_URL }}" # 在日志中打印变量以供调试 - # 使用 find 和 sed 高效地批量替换 - # -exec sed ... {} + 会将所有找到的文件传递给一个 sed 命令,效率更高 - # 使用 `|` 作为 sed 的分隔符,以避免与 URL 中的 `/`冲突 + echo "开始替换 daily/ 目录及其子目录下所有 Markdown 文件的内容..." + echo "使用的代理前缀: ${{ env.IMAGE_PROXY_URL }}" find daily -type f -name "*.md" -exec sed -i \ -e 's|upload.chinaz.com|pic.chinaz.com|g' \ -e 's|https://pic.chinaz.com|${{ env.IMAGE_PROXY_URL }}https://pic.chinaz.com|g' {} + echo "URL 替换完成。" - - name: Generate SUMMARY.md + - name: Archive old notes before generating summary + id: archive + run: | + echo "开始检查并归档旧的日刊..." + # 查找最新文件以确定当前月份 + LATEST_DAILY_FILE=$(find daily -type f -name "*.md" | sort -r | head -n 1) + if [ -z "$LATEST_DAILY_FILE" ]; then + echo "在 'daily' 目录中没有找到任何 .md 文件,跳过归档步骤。" + exit 0 + fi + + LATEST_MONTH=$(basename "$LATEST_DAILY_FILE" .md | cut -d'-' -f1,2) + echo "当前最新月份是: $LATEST_MONTH" + + # 仅遍历 daily/ 根目录下的 md 文件进行归档 + for file in daily/*.md; do + # 如果根目录下没有md文件,循环会匹配到 "daily/*.md" 字符串,需要跳过 + [ -e "$file" ] || continue + + FILE_MONTH=$(basename "$file" .md | cut -d'-' -f1,2) + + if [ "$FILE_MONTH" != "$LATEST_MONTH" ]; then + TARGET_DIR="daily/$FILE_MONTH" + mkdir -p "$TARGET_DIR" + echo "归档文件: $file -> $TARGET_DIR/" + mv "$file" "$TARGET_DIR/" + fi + done + echo "文件归档检查完成。" + + - name: Generate SUMMARY.md from final file structure id: generate_summary run: | # 确保 src 目录存在 mkdir -p src - # 复制daily到目标目录 + rm -rf src/daily/ + # 递归复制 `daily` 目录到 `src`。因为此步在归档后运行,所以会复制最终的文件结构 cp -r daily/ src/ - # 定义 SUMMARY.md 的路径 + SUMMARY_FILE="src/SUMMARY.md" - # 查找最新的日刊文件 - LATEST_DAILY_FILE=$(ls -1 daily/*.md | sort -r | head -n 1) + # 递归查找所有日刊,确保能找到所有文件 + LATEST_DAILY_FILE=$(find daily -type f -name "*.md" | sort -r | head -n 1) if [ -z "$LATEST_DAILY_FILE" ]; then echo "错误:在 'daily' 目录中没有找到任何 .md 文件。" exit 1 fi - # 获取最新日刊的文件名,例如 2025-06-12.md + # 最新的文件还在 'daily' 根目录下,复制它作为 'Today' 页面 LATEST_FILENAME=$(basename "$LATEST_DAILY_FILE") - - # 将最新的日刊复制到 src 目录,作为 "Today" 页面 cp "$LATEST_DAILY_FILE" "src/$LATEST_FILENAME" # 开始写入 SUMMARY.md @@ -77,28 +100,32 @@ jobs: echo "[Today]($LATEST_FILENAME)" >> "$SUMMARY_FILE" echo "" >> "$SUMMARY_FILE" - # --- 生成按月分组的列表 --- + # --- 生成按月分组的列表(已适配归档后的目录结构)--- current_month="" - # 反向排序文件列表,实现日期从新到旧 - for file in $(ls -1 daily/*.md | sort -r); do - # 从文件名 'daily/YYYY-MM-DD.md' 中提取月份 'YYYY-MM' - month=$(echo "$file" | cut -d'/' -f2 | cut -d'-' -f1,2) + # 'find' 会找到所有深度的文件,'sort -r' 确保最新文件在前 + for file in $(find daily -type f -name "*.md" | sort -r); do + filename_only=$(basename "$file" .md) + month=$(echo "$filename_only" | cut -d'-' -f1,2) - # 如果是新的月份,则添加一个月份标题 if [ "$month" != "$current_month" ]; then + # echo "" >> "$SUMMARY_FILE" echo "# $month" >> "$SUMMARY_FILE" current_month=$month fi - # 提取链接标题 'MM-DD' - link_title=$(echo "$file" | cut -d'/' -f2 | cut -d'.' -f1 | cut -d'-' -f2,3) + link_title=$(echo "$filename_only" | cut -d'-' -f2,3) - # 写入日刊条目 - echo "- [${link_title}-日刊]($file)" >> "$SUMMARY_FILE" + # 关键:此命令能正确处理两种情况 + # 1. file = 'daily/YYYY-MM-DD.md' -> relative_path = 'YYYY-MM-DD.md' + # 2. file = 'daily/YYYY-MM/YYYY-MM-DD.md' -> relative_path = 'YYYY-MM/YYYY-MM-DD.md' + relative_path=${file#daily/} + + # 生成的链接将是正确的 'daily/...' 路径 + echo "- [${link_title}-日刊](daily/$relative_path)" >> "$SUMMARY_FILE" done - echo "SUMMARY.md 已成功生成。" - cat "$SUMMARY_FILE" # 在日志中打印生成的内容以供调试 + echo "SUMMARY.md 已成功生成,内容如下:" + cat "$SUMMARY_FILE" - name: Build the book run: | @@ -106,11 +133,12 @@ jobs: - name: Organize output files run: | - # 清理旧的 today 目录(如果存在),以防万一 - rm -rf today - # 创建 today 目录并将构建产物移入 + echo "正在组织输出文件..." + rm -rf today/book/ mkdir -p today - mv book today/ + cp -rf book/. today/book/ + rm -rf book + echo "输出文件已移动到 today/book。" - name: Add Clarity tracking to book.js run: | @@ -119,46 +147,24 @@ jobs: CLARITY_CODE='${{ vars.CLARITY_CODE }}' if [ -f "$TOC_FILE" ]; then - echo "Appending Forward tracking code to $TOC_FILE" - # Add a newline first - echo "" >> "$TOC_FILE" - # Append the Forward script - echo "$FORWARD_CODE" >> "$TOC_FILE" - echo "Forward code appended." - - echo "Appending Clarity tracking code to $TOC_FILE" - # Add a newline first - echo "" >> "$TOC_FILE" - # Append the Clarity script - echo "$CLARITY_CODE" >> "$TOC_FILE" - echo "Clarity code appended." - # tail -1000 "$TOC_FILE" + echo "Appending Forward and Clarity tracking code to $TOC_FILE" + printf "\n%s\n" "$FORWARD_CODE" >> "$TOC_FILE" + printf "\n%s\n" "$CLARITY_CODE" >> "$TOC_FILE" + echo "Tracking codes appended." else - echo "Warning: $TOC_FILE not found. Skipping Clarity code injection." - # Depending on your needs, you might want to fail the build if toc.js is essential - # and not found, e.g., by uncommenting the next line: - # exit 1 + echo "Warning: $TOC_FILE not found. Skipping tracking code injection." fi - name: Download RSS Feed run: | if [ -z "${{ vars.RSS_FEED_URL }}" ]; then - echo "警告: RSS_FEED_URL 仓库变量未设置或为空。" - echo "跳过下载 RSS Feed。如果需要 rss.xml 文件,请创建一个空的。" - # touch rss.xml # 可选:创建一个空的 rss.xml 以避免后续 git add 警告 (如果它不存在) - # 如果 rss.xml 是可选的,并且不存在时不想创建空文件,则移除此行 - # 并在 git add 中使用 `git add --ignore-missing rss.xml` 或类似方法 + echo "警告: RSS_FEED_URL 仓库变量未设置或为空,跳过下载。" else echo "正在从 ${{ vars.RSS_FEED_URL }} 下载 RSS Feed..." - # 使用 -q (quiet) 来减少 wget 输出,使用 --show-progress 在必要时显示进度 - # 使用 --timeout 和 --tries 增加健壮性 if wget -O rss.xml "${{ vars.RSS_FEED_URL }}" --timeout=30 --tries=3; then echo "RSS Feed 已成功下载到 rss.xml" else echo "错误: 下载 RSS Feed 失败。wget 返回错误码 $?。" - # echo "创建一个空的 rss.xml 以允许流程继续。" # 可选:如果下载失败也想继续 - # touch rss.xml - # exit 1 # 如果下载失败是关键错误,则取消注释此行以使工作流失败 fi fi @@ -167,20 +173,17 @@ jobs: git config --local user.email "action@github.com" git config --local user.name "GitHub Action" - # 添加所有新生成或修改的文件 - # 包括 src/SUMMARY.md, src/YYYY-MM-DD.md 和 today/book/ 目录 - git add src/SUMMARY.md today/book + git add daily/ src/SUMMARY.md today/ if [ -f "rss.xml" ]; then git add rss.xml else echo "rss.xml 未找到,不添加到提交中。" fi - # 检查是否有文件变更 if git diff --staged --quiet; then echo "没有文件变更,无需提交。" else echo "检测到文件变更,正在提交..." - git commit -m "docs: 自动构建日刊书籍 (`date -u`)" + git commit -m "docs: 自动构建日刊并归档旧月份 (`date -u`)" git push fi