From a70d3f16b3d6c772a3073c1841ff1a94a3701825 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 6 May 2026 14:44:35 +0000 Subject: [PATCH 1/2] =?UTF-8?q?fix(ci):=20workflow=20path=20=E8=B7=9F?= =?UTF-8?q?=E9=9A=8F=20i18n=20URL=20=E6=AE=B5=E5=8C=96=EF=BC=88app/docs=20?= =?UTF-8?q?=E2=86=92=20content/docs=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit i18n PR (#330) merge 后,sync-uuid workflow 在 main 上 fail: git add 'app/docs/**/*.md' 'app/docs/**/*.mdx' 因为 app/docs 已经 不存在,pathspec 不匹配任何文件,git 退出码 128 → workflow 失败。 backfill 脚本本身 OK(已成功生成 JSON),失败在最后 commit 那一步。 修: 1. sync-uuid.yml - paths trigger: app/docs/** → content/docs/** - git diff / git add 路径同步改 content/docs 2. content-check.yml - paths trigger: app/docs/** → content/docs/** 3. deploy.yml (IndexNow 推送) - 删掉旧 app/docs/(.*)/page.tsx 提取分支(不再有 page.tsx-as-content) - content/docs/(.*).mdx 提 base slug 时剥离 locale 后缀(.en/.zh), 拿到 canonical slug - 每篇文档推送 zh + en 两条 URL(/zh/docs/ + /en/docs/), i18n 段化后这是两个独立 URL,IndexNow 要分别通知 - fallback URL 也改成双语 ($SITE_ORIGIN/zh + $SITE_ORIGIN/en) 注:generated/doc-contributors.json 留给 sync-uuid workflow 修好后 下次跑自己 commit,不进本 PR。 --- .github/workflows/content-check.yml | 3 ++- .github/workflows/deploy.yml | 31 +++++++++++++++++------------ .github/workflows/sync-uuid.yml | 7 ++++--- 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/.github/workflows/content-check.yml b/.github/workflows/content-check.yml index a74f30af..317e33a3 100644 --- a/.github/workflows/content-check.yml +++ b/.github/workflows/content-check.yml @@ -10,7 +10,8 @@ on: - "**/*.md" - "**/*.mdx" - "source.config.ts" - - "app/docs/**" + # 2026-05 i18n URL 段化:mdx 内容从 app/docs/ 迁到 content/docs/ + - "content/docs/**" - "data/**" - "tests/**" - "lib/source.ts" diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 13809157..f9d39fc7 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -36,7 +36,7 @@ jobs: run: node scripts/check-pnpm-version.mjs - run: pnpm install --frozen-lockfile - + # Verify lockfile wasn't modified by install - name: Check lockfile consistency run: | @@ -75,31 +75,36 @@ jobs: git fetch --depth=2 origin ${{ github.ref }} || true CHANGED="$(git diff --name-only HEAD~1 HEAD || true)" - CHANGED_DOCS="$(echo "$CHANGED" | grep -E '^(app/docs/|content/docs/).*\.(mdx?|tsx?)$' || true)" - + CHANGED_DOCS="$(echo "$CHANGED" | grep -E '^content/docs/.*\.(md|mdx)$' || true)" + + # i18n URL 段化(2026-05)后所有 docs URL 都带 // 前缀。 + # 每篇文档对外有 /zh/docs/ 和 /en/docs/ 两个独立 URL, + # 任意文件变更都推送两条让 IndexNow 同时刷新两种语言版本。 + # 文件命名约定(fumadocs dot parser): + # xxx.mdx → 默认 (zh) 原文,slug = xxx + # xxx.en.mdx → en 翻译,slug = xxx(去 .en 后缀提 base slug) URLS=() - while IFS= read -r f; do - [ -z "$f" ] && continue - if [[ "$f" =~ ^app/docs/(.*)/page\.(mdx|md|tsx|ts|jsx|js)$ ]]; then - slug="${BASH_REMATCH[1]}" - URLS+=("$SITE_ORIGIN/docs/$slug") - fi - done <<< "$CHANGED_DOCS" - while IFS= read -r f; do [ -z "$f" ] && continue if [[ "$f" =~ ^content/docs/(.*)\.(md|mdx)$ ]]; then slug="${BASH_REMATCH[1]}" + # 剥离 locale 后缀(.en / .zh),拿到 canonical base slug + slug="${slug%.en}" + slug="${slug%.zh}" + # index.mdx 对应目录本身的 URL(fumadocs 约定) slug="${slug%/index}" - URLS+=("$SITE_ORIGIN/docs/$slug") + URLS+=("$SITE_ORIGIN/zh/docs/$slug") + URLS+=("$SITE_ORIGIN/en/docs/$slug") fi done <<< "$CHANGED_DOCS" mapfile -t URLS < <(printf "%s\n" "${URLS[@]}" | awk 'NF' | sort -u) if [ "${#URLS[@]}" -eq 0 ]; then - URLS=("$SITE_ORIGIN/") + # 没有 docs 改动时(例如改 README / 配置等)仍提交首页让 Bing/Yandex + # 知道站点活跃。i18n 段化后首页有两个 URL,分别推送。 + URLS=("$SITE_ORIGIN/zh" "$SITE_ORIGIN/en") fi echo "✅ Submitting URLs to IndexNow:" diff --git a/.github/workflows/sync-uuid.yml b/.github/workflows/sync-uuid.yml index 82b298b2..8ab3b045 100644 --- a/.github/workflows/sync-uuid.yml +++ b/.github/workflows/sync-uuid.yml @@ -22,7 +22,8 @@ on: - main - feat/contributor paths: - - "app/docs/**" + # 2026-05 i18n URL 段化:mdx 内容从 app/docs/ 迁到 content/docs/ + - "content/docs/**" - "scripts/uuid.mjs" - "scripts/backfill-contributors.mjs" - "package.json" @@ -146,10 +147,10 @@ jobs: # 只 commit MDX frontmatter 改动 + 生成的 JSON,不包含任何其他脏文件。 # [skip ci] 防止自提交再次触发本 workflow 死循环。 # ============================================================ - if ! git diff --quiet -- 'app/docs/**/*.md' 'app/docs/**/*.mdx' generated/doc-contributors.json; then + if ! git diff --quiet -- 'content/docs/**/*.md' 'content/docs/**/*.mdx' generated/doc-contributors.json; then git config user.name "github-actions[bot]" git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add 'app/docs/**/*.md' 'app/docs/**/*.mdx' generated/doc-contributors.json + git add 'content/docs/**/*.md' 'content/docs/**/*.mdx' generated/doc-contributors.json git commit -m "chore(docs): sync doc metadata [skip ci]" git push origin "$BRANCH" else From e53d33501060be275e60d5e223562783365c8545 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 6 May 2026 15:16:27 +0000 Subject: [PATCH 2/2] =?UTF-8?q?fix(ci):=20IndexNow=20=E6=8F=90=20leetcode?= =?UTF-8?q?=20slug=20=E6=97=B6=E8=B5=B0=E6=8B=BC=E9=9F=B3=E6=98=A0?= =?UTF-8?q?=E5=B0=84=EF=BC=8C=E4=B8=8E=E5=AE=9E=E9=99=85=E8=B7=AF=E7=94=B1?= =?UTF-8?q?=E5=AF=B9=E9=BD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CR (Copilot) 指出 #331 的 deploy.yml 直接拿文件路径当 slug,但 lib/source.ts 的 transformer 把 career/interview-prep/leetcode/ 下 含中文的文件名拼音化(convertSlugToPinyin): 文件:content/docs/career/interview-prep/leetcode/142.环形链表II_translated.md 实际路由://docs/career/interview-prep/leetcode/142-huan-xing-lian-biao-iitranslated 我之前推的://docs/career/interview-prep/leetcode/142.环形链表II_translated ← 404 修:在 deploy.yml 的 IndexNow URL 提取里复用 generated/leetcode-slug-map.json (prebuild 时由 scripts/generate-leetcode-slug-map.mts 用同一份算法生成), 对 leetcode 子树的 slug 做 stem → 拼音 映射后再推送。 非 leetcode 子树的 slug 不受影响(它们的文件名都是 ASCII,路由按 file path 直出,不需要映射)。 --- .github/workflows/deploy.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index f9d39fc7..cb380437 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -83,6 +83,15 @@ jobs: # 文件命名约定(fumadocs dot parser): # xxx.mdx → 默认 (zh) 原文,slug = xxx # xxx.en.mdx → en 翻译,slug = xxx(去 .en 后缀提 base slug) + # + # 例外:career/interview-prep/leetcode/ 下含中文的文件名会被 + # lib/source.ts 的 transformer 拼音化(convertSlugToPinyin), + # 实际路由的最后一段是拼音 slug 而不是中文 stem。这里复用 + # generated/leetcode-slug-map.json (prebuild 时由 + # scripts/generate-leetcode-slug-map.mts 与 source.ts 同算法生成) + # 把中文 stem 映射到拼音 slug,否则推送的 URL 会 404。 + LEETCODE_PREFIX="career/interview-prep/leetcode/" + SLUG_MAP_FILE="generated/leetcode-slug-map.json" URLS=() while IFS= read -r f; do @@ -94,6 +103,17 @@ jobs: slug="${slug%.zh}" # index.mdx 对应目录本身的 URL(fumadocs 约定) slug="${slug%/index}" + + # leetcode 中文 stem → 拼音 slug 映射(与 source.ts transformer 一致) + if [[ "$slug" == "$LEETCODE_PREFIX"* && -f "$SLUG_MAP_FILE" ]]; then + stem="${slug##*/}" + dir="${slug%/*}" + mapped="$(jq -r --arg k "$stem" '.[$k] // empty' "$SLUG_MAP_FILE")" + if [ -n "$mapped" ]; then + slug="$dir/$mapped" + fi + fi + URLS+=("$SITE_ORIGIN/zh/docs/$slug") URLS+=("$SITE_ORIGIN/en/docs/$slug") fi