自动备份网站 #22
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: 自动备份网站 | |
| concurrency: | |
| group: backup-wikit | |
| cancel-in-progress: false | |
| on: | |
| schedule: | |
| - cron: '30 4 */4 * *' | |
| 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 | |
| URL="https://github.com/kakushi-w/wikit/releases/latest/download/wikit-linux-amd64" | |
| curl -fSL "$URL" -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" ] && [ -d "$PREV" ]; then | |
| echo "→ Copying previous backup from $PREV" | |
| cp -r "$PREV" "$THIS_DIR" | |
| else | |
| echo "→ No previous backup found, creating fresh directory" | |
| mkdir -p "$THIS_DIR" | |
| fi | |
| echo "→ Running wikit backup into $THIS_DIR" | |
| # 记录开始时间 | |
| START_SEC=$(date +%s) | |
| "$WIKIT_BIN" backup "$WIKI_NAME" \ | |
| --base-dir "$THIS_DIR" \ | |
| --no-update-check | |
| # 计算耗时 | |
| END_SEC=$(date +%s) | |
| ELAPSED=$((END_SEC - START_SEC)) | |
| echo "→ Backup elapsed time: ${ELAPSED}s" | |
| 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) | |
| echo "CURRENT=$CURRENT" | |
| echo "PREV=$PREV" | |
| CURRENT_SITEMAP="$CURRENT/$WIKI_NAME/meta/sitemap.json" | |
| PREV_SITEMAP="$PREV/$WIKI_NAME/meta/sitemap.json" | |
| ELAPSED="${{ env.BACKUP_ELAPSED }}" | |
| THRESHOLD="${BACKUP_TIME_THRESHOLD}" | |
| echo "→ Backup elapsed: ${ELAPSED}s (threshold: ${THRESHOLD}s)" | |
| # 如果备份耗时超过阈值,强制提交 | |
| if [ "$ELAPSED" -ge "$THRESHOLD" ]; then | |
| echo "→ Backup took >= ${THRESHOLD}s, force commit" | |
| echo "skip=false" >> $GITHUB_OUTPUT | |
| echo "reason=timeout" >> $GITHUB_OUTPUT | |
| exit 0 | |
| fi | |
| if [ -z "$PREV" ] || [ ! -f "$PREV_SITEMAP" ]; then | |
| echo "→ No previous sitemap found, must commit" | |
| echo "skip=false" >> $GITHUB_OUTPUT | |
| echo "reason=new" >> $GITHUB_OUTPUT | |
| exit 0 | |
| fi | |
| if diff -q "$CURRENT_SITEMAP" "$PREV_SITEMAP" > /dev/null; then | |
| echo "→ sitemap.json unchanged, skip commit" | |
| echo "skip=true" >> $GITHUB_OUTPUT | |
| echo "reason=unchanged" >> $GITHUB_OUTPUT | |
| else | |
| echo "→ sitemap.json changed" | |
| echo "skip=false" >> $GITHUB_OUTPUT | |
| echo "reason=changed" >> $GITHUB_OUTPUT | |
| fi | |
| - name: 清理旧备份 | |
| run: | | |
| set -euo pipefail | |
| cd "$BACKUP_ROOT" | |
| ls -1trd */ 2>/dev/null | head -n -"$MAX_BACKUPS" | while IFS= read -r old; do | |
| echo "→ Removing old backup: $old" | |
| rm -rf "$old" | |
| done | |
| echo "→ Current backups:" | |
| ls -1d */ 2>/dev/null || echo "(none)" | |
| - name: 更新 LATEST 软链接指向最新备份 | |
| run: | | |
| set -euo pipefail | |
| cd "$BACKUP_ROOT" | |
| NEWEST=$(ls -1d */ 2>/dev/null | sort -r | head -1) | |
| if [ -z "$NEWEST" ]; then | |
| echo "::error::No backup directory found!" | |
| exit 1 | |
| fi | |
| rm -f LATEST | |
| ln -s "$NEWEST" LATEST | |
| echo "→ LATEST -> $NEWEST" | |
| - name: 提交并推送备份结果 | |
| if: steps.check_sitemap.outputs.skip == 'false' | |
| uses: stefanzweifel/git-auto-commit-action@v5 | |
| with: | |
| commit_message: "自动备份网站 - ${{ env.BACKUP_TS }}(${{ steps.check_sitemap.outputs.reason }})" | |
| file_pattern: "backups/wikit/" | |
| commit_user_name: "github-actions[bot]" | |
| commit_user_email: "41898282+github-actions[bot]@users.noreply.github.com" | |
| push_options: "--force-with-lease" | |
| - name: 跳过提交提示 | |
| if: steps.check_sitemap.outputs.skip == 'true' | |
| run: echo "[!] 未发生变化,已跳过提交。" |