自动备份网站 #24
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 | |
| 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 "[!] 未发生变化,已跳过提交。" |