Skip to content

自动备份网站

自动备份网站 #24

Workflow file for this run

name: 自动备份网站
concurrency:
group: backup-wikit
cancel-in-progress: false
env:
TZ: Asia/Shanghai
on:
schedule:
- cron: '30 4 */2 * *'
workflow_dispatch:
permissions:
contents: write
jobs:
backup-wikit:
runs-on: ubuntu-latest
env:
WIKIT_BIN: "./wikit"
BACKUP_ROOT: "backups/wikit"
WIKI_NAME: "deep-forest-club"
WIKI_URL: "https://deep-forest-club.wikidot.com"
MAX_BACKUPS: "8"
BACKUP_TIME_THRESHOLD: "3"
steps:
- name: 检出仓库代码
uses: actions/checkout@v4
with:
fetch-depth: 1
- name: 下载 Wikit CLI
run: |
set -euo pipefail
curl -fSL https://github.com/kakushi-w/wikit/releases/latest/download/wikit-linux-amd64 -o wikit
chmod +x wikit
./wikit version || true
- name: 准备备份目录并运行 Wikit CLI
run: |
set -euo pipefail
mkdir -p "$BACKUP_ROOT"
TS=$(date +%Y%m%d_%H%M%S)
THIS_DIR="$BACKUP_ROOT/$TS"
PREV=$(ls -1d "$BACKUP_ROOT"/*/ 2>/dev/null | sort -r | head -1 || true)
if [ -n "$PREV" ]; then
cp -r "$PREV" "$THIS_DIR"
else
mkdir -p "$THIS_DIR"
fi
START_SEC=$(date +%s)
"$WIKIT_BIN" backup "$WIKI_NAME" \
--base-dir "$THIS_DIR" \
--no-update-check
ELAPSED=$(( $(date +%s) - START_SEC ))
echo "BACKUP_TS=$TS" >> $GITHUB_ENV
echo "BACKUP_ELAPSED=$ELAPSED" >> $GITHUB_ENV
- name: 判断是否需要提交
id: check_sitemap
run: |
set -euo pipefail
cd "$BACKUP_ROOT"
CURRENT=$(ls -1d */ 2>/dev/null | sort -r | head -1)
PREV=$(ls -1d */ 2>/dev/null | sort -r | head -2 | tail -1 || true)
CURRENT_SITEMAP="$CURRENT/$WIKI_NAME/meta/sitemap.json"
PREV_SITEMAP="$PREV/$WIKI_NAME/meta/sitemap.json"
if [ "$BACKUP_ELAPSED" -ge "$BACKUP_TIME_THRESHOLD" ]; then
echo "skip=false" >> $GITHUB_OUTPUT
echo "reason=timeout" >> $GITHUB_OUTPUT
exit 0
fi
if [ ! -f "$PREV_SITEMAP" ]; then
echo "skip=false" >> $GITHUB_OUTPUT
echo "reason=new" >> $GITHUB_OUTPUT
exit 0
fi
if diff -q "$CURRENT_SITEMAP" "$PREV_SITEMAP" > /dev/null; then
echo "skip=true" >> $GITHUB_OUTPUT
echo "reason=unchanged" >> $GITHUB_OUTPUT
else
echo "skip=false" >> $GITHUB_OUTPUT
echo "reason=changed" >> $GITHUB_OUTPUT
fi
- name: 清理旧备份
run: |
cd "$BACKUP_ROOT"
ls -1trd */ 2>/dev/null | head -n -"$MAX_BACKUPS" | xargs -r rm -rf
- name: 更新 LATEST 软链接
run: |
cd "$BACKUP_ROOT"
NEWEST=$(ls -1d */ 2>/dev/null | sort -r | head -1)
rm -f LATEST
ln -s "$NEWEST" LATEST
- name: 提交并推送备份结果
if: steps.check_sitemap.outputs.skip == 'false'
run: |
git config user.name "action-user"
git config user.email "action-user@noreply.github.com"
git add backups/wikit/
git diff --staged --quiet || git commit -m "自动备份网站 - ${{ env.BACKUP_TS }}(${{ steps.check_sitemap.outputs.reason }})"
git push
- name: 跳过提交提示
if: steps.check_sitemap.outputs.skip == 'true'
run: echo "[!] 未发生变化,已跳过提交。"