Auto backup Wiki #1537
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Auto backup Wiki | |
| on: | |
| workflow_dispatch: | |
| schedule: | |
| - cron: '*/30 * * * *' | |
| permissions: | |
| contents: write | |
| jobs: | |
| backup-wiki-root: | |
| if: github.repository == 'Aethersailor/Custom_OpenClash_Rules' | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout main repository | |
| uses: actions/checkout@v6 | |
| - name: Clone wiki repository with auth | |
| env: | |
| TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| run: | | |
| git clone https://x-access-token:${TOKEN}@github.com/${{ github.repository }}.wiki.git _wiki | |
| - name: Clean old wiki backup | |
| run: | | |
| mkdir -p wiki | |
| find wiki -type f -name "*.md" -delete | |
| - name: Build link replacement map | |
| id: build-map | |
| run: | | |
| echo "LINK_MAP_START" > link_map.txt | |
| count=0 | |
| grep -E '^\s*###\s*.*\[.*\]\(.*\)' _wiki/Home.md | while read -r line; do | |
| count=$((count+1)) | |
| num=$count | |
| raw_url=$(echo "$line" | sed -E 's/.*\/wiki\/([^)]*).*/\1/') | |
| filename=$(python3 -c "import urllib.parse; print(urllib.parse.unquote('$raw_url'))") | |
| # 只替换页面部分,不自动附加锚点 | |
| echo "https://github.com/${{ github.repository }}/wiki/${raw_url}|${num}.${filename}.md" >> link_map.txt | |
| done | |
| echo "LINK_MAP_END" >> link_map.txt | |
| echo "==== Link Map ====" | |
| cat link_map.txt | |
| - name: Copy Home.md to wiki/README.md with replacements | |
| run: | | |
| cp _wiki/Home.md wiki/README.md | |
| # 替换 doc 路径 | |
| sed -i 's#](doc/#](../doc/#g' wiki/README.md | |
| # 替换 wiki 页面链接 | |
| while IFS='|' read -r src dst; do | |
| [[ "$src" == LINK_MAP_START ]] && continue | |
| [[ "$src" == LINK_MAP_END ]] && continue | |
| echo "Replacing $src → $dst in README.md" | |
| # 转义链接中的特殊字符 | |
| src_escaped=$(printf '%s\n' "$src" | sed 's/[\/&]/\\&/g') | |
| dst_escaped=$(printf '%s\n' "$dst" | sed 's/[\/&]/\\&/g') | |
| # 普通页面链接 | |
| sed -i "s~${src_escaped}~${dst_escaped}~g" wiki/README.md | |
| # 带 # 锚点的链接 | |
| sed -i "s~${src_escaped}#~${dst_escaped}#~g" wiki/README.md | |
| done < link_map.txt | |
| - name: Parse Home.md and copy listed files with replacements | |
| run: | | |
| count=0 | |
| grep -E '^\s*###\s*.*\[.*\]\(.*\)' _wiki/Home.md | while read -r line; do | |
| count=$((count+1)) | |
| num=$count | |
| raw_url=$(echo "$line" | sed -E 's/.*\/wiki\/([^)]*).*/\1/') | |
| filename=$(python3 -c "import urllib.parse; print(urllib.parse.unquote('$raw_url'))") | |
| src_file="_wiki/${filename}.md" | |
| dst_file="wiki/${num}.${filename}.md" | |
| echo "Processing: $src_file → $dst_file" | |
| if [ -f "$src_file" ]; then | |
| cp "$src_file" "$dst_file" | |
| # 替换 doc 路径 | |
| sed -i 's#](doc/#](../doc/#g' "$dst_file" | |
| # 替换 wiki 页面链接 | |
| while IFS='|' read -r src dst; do | |
| [[ "$src" == LINK_MAP_START ]] && continue | |
| [[ "$src" == LINK_MAP_END ]] && continue | |
| echo "Replacing $src → $dst in $dst_file" | |
| src_escaped=$(printf '%s\n' "$src" | sed 's/[\/&]/\\&/g') | |
| dst_escaped=$(printf '%s\n' "$dst" | sed 's/[\/&]/\\&/g') | |
| sed -i "s~${src_escaped}~${dst_escaped}~g" "$dst_file" | |
| sed -i "s~${src_escaped}#~${dst_escaped}#~g" "$dst_file" | |
| done < link_map.txt | |
| else | |
| echo "Warning: File not found: $src_file" | |
| fi | |
| done | |
| - name: Commit and push changes | |
| run: | | |
| git config user.name "github-actions[bot]" | |
| git config user.email "github-actions[bot]@users.noreply.github.com" | |
| git add wiki | |
| if ! git diff --cached --quiet; then | |
| commit_time=$(TZ='Asia/Shanghai' date '+%Y-%m-%d %H:%M:%S') | |
| git commit -m "chore(wiki): auto backup Wiki at ${commit_time} UTC+8" | |
| git push | |
| fi |