← 教程列表

⚙️ 配置 GitHub Actions 每周自动更新

中级 · 15 分钟 · 2026-08-16

让 CI 每周一自动跑数据 + 重新 build + 部署 GitHub Pages。15 分钟配完,一劳永逸。

1. 创建 workflow 文件

仓库根目录已经有 .github/workflows/update-data.yml。如果你 fork 了一份,先看下:

.github/workflows/update-data.yml

2. 完整 workflow 代码

name: Update DSH Radar data

on:
  # 每周一 UTC 02:00(北京时间 10:00)自动跑
  schedule:
    - cron: '0 2 * * 1'
  # 允许手动触发(Actions → Run workflow)
  workflow_dispatch:
  # 脚本改动时也触发(方便调试)
  push:
    paths:
      - 'scripts/**'

jobs:
  build-data:
    runs-on: ubuntu-latest
    timeout-minutes: 30
    steps:
      - uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '22'

      - name: Cache npm + GitHub data
        uses: actions/cache@v4
        with:
          path: |
            ~/.npm
            data/.cache
          key: cache-${{ runner.os }}-${{ hashFiles('scripts/**') }}
          restore-keys: |
            cache-${{ runner.os }}-

      - name: Fetch + score plugins
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          LIMIT: '0'  # 0 = 全量 711;初次试跑可设 100
        run: node scripts/build-data.mjs

      - name: Build search index
        run: node scripts/build-search-index.mjs

      - name: Build changelog
        run: node scripts/build-changelog.mjs

      - name: Build authors index
        run: node scripts/build-authors.mjs

      - name: Commit updated data
        uses: stefanzweifel/git-auto-commit-action@v5
        with:
          commit_message: 'data: refresh plugin scores [skip ci]'
          file_pattern: 'data/**'

  build-web:
    needs: build-data
    runs-on: ubuntu-latest
    # deploy-pages@v4 必须要这三个权限,少一个就是 Permission denied
    permissions:
      contents: read
      pages: write
      id-token: write
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    steps:
      # 注意:要拉上一个 job 刚提交的最新数据
      - uses: actions/checkout@v4
        with:
          ref: main

      - name: Setup pnpm
        uses: pnpm/action-setup@v4
        with:
          version: 9

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '22'
          cache: 'pnpm'
          cache-dependency-path: web/pnpm-lock.yaml

      - name: Install + build web
        working-directory: web
        run: |
          pnpm install --frozen-lockfile
          pnpm build

      - name: Upload Pages artifact
        uses: actions/upload-pages-artifact@v3
        with:
          path: web/dist

      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v4

3. 步骤拆解

这套 workflow 分成两个 job,六个关键步骤,各自负责一件事:

步骤 干什么 耗时
① checkout 把仓库拉到 runner。build-web 里要指定 ref: main,否则拿不到上一个 job 刚提交的新数据 ~5s
② setup-node 装 Node 22。抓数据脚本零依赖,只需要内置 fetch(Node ≥ 18) ~10s
③ cache 缓存 data/.cache(npm metadata + GitHub 响应),二次跑省掉绝大部分网络请求 ~5s
④ build-data build-data.mjs 抓包 + 算 5 维分 + 写 data/,再跑 search-index / changelog / authors 三个衍生脚本,最后自动 commit 2-25min
⑤ build-web pnpm builddata/*.json 编译进 Astro 静态站,产物在 web/dist/ ~60s
⑥ deploy upload-pages-artifact 打包 web/distdeploy-pages 发布到 Pages 环境 ~30s

两个 job 用 needs: build-data 串起来:数据没抓完就不会 build 站点, 避免把半截数据推上线。commit message 里的 [skip ci] 则防止自动提交再次触发 workflow 造成死循环。

4. 配置 secrets

GitHub Actions 里需要这些 secrets。仓库 → Settings → Secrets and variables → Actions → New repository secret:

Secret 名 必需?
GITHUB_TOKEN 自动提供 ✅ 必需
PUBLIC_WEB3FORMS_KEY 你的 web3forms access_key ⚪ 可选(不填则表单回退 mailto)

GITHUB_TOKEN 是 GitHub Actions 自动提供的,不用手动设。 它让你的 build 能调 5000 次/小时 GitHub API(vs 60 次/小时未认证)。

5. cron 语法速查

GitHub Actions 的 cron 是 UTC 时区:

┌──────── 分钟 (0 - 59)
│  ┌───── 小时 (0 - 23, UTC)
│  │  ┌── 日 (1 - 31)
│  │  │  ┌─ 月 (1 - 12)
│  │  │  │  ┌ 周 (0 - 7, 0 和 7 都是周日)
│  │  │  │  │
*  *  *  *  *

# 常见例子:
'0 2 * * 1'     # 每周一 02:00 UTC = 北京周一 10:00(本项目默认)
'0 0 * * 0'     # 每周日 00:00 UTC
'0 14 * * *'    # 每天 14:00 UTC
'0 */6 * * *'   # 每 6 小时一次

⚠️ GitHub Actions 的定时 schedule 有时延迟(10-30 分钟),不要用来做精确任务。

6. 启用 GitHub Pages

  1. 仓库 → Settings → Pages
  2. Source: GitHub Actions(不是 "Deploy from a branch")
  3. 保存
  4. 第一次跑 workflow 后会自动创建 Pages 环境

7. 手动触发测试(workflow_dispatch)

  1. 仓库 → Actions 标签
  2. 左侧选 "Update DSH Radar data"
  3. 右侧 "Run workflow" → 选 main 分支 → Run
  4. 等 5-30 分钟,看日志

8. 常见故障排查

❌ Rate limit exceeded

GitHub API 限速。解法:确保 workflow 用了 secrets.GITHUB_TOKEN(提供 5000/h 而非 60/h)。 也可以分批跑(设 LIMIT=100 跑几次)。

❌ Build timeout

全量跑 711 个插件 + GitHub 要 ~25 分钟。解法:workflow 里加 timeout-minutes: 30(已加)。 或者用 LIMIT=200 先跑头部。

❌ npm install 失败

多半是 lockfile 与 package.json 不同步,--frozen-lockfile 直接失败。解法:本地跑一次 pnpm installweb/pnpm-lock.yaml 提交上去;临时绕过可以去掉 --frozen-lockfile

❌ Pages 部署失败:Permission denied

两处都要检查。解法 A:Settings → Actions → General → Workflow permissions 设为 "Read and write permissions"解法 B:build-web job 里必须带 permissions: pages: writeid-token: writedeploy-pages@v4 靠 OIDC 换取部署凭据,少了 id-token 一定失败。

⚠️ 数据没更新 / 缓存太旧

actions/cache 的 key 是 hashFiles('scripts/**')——只要脚本没改, 就会一直命中同一份 data/.cache,npm metadata 可能是一周前的。

  • 想让缓存按周失效:key 里加上周数,例如 cache-${{ runner.os }}-week${{ github.run_number / 7 }}
  • 想立刻清空:仓库 → Actions → Caches → 手动删除条目,再手动触发一次
  • 只是想验证一次全新抓取:改 key 前缀(cache-v2-...)比删缓存更快

另一个常见误判:数据其实更新了,但 build-web 的 checkout 拿的是旧 commit。 确认它带了 ref: main,否则你会永远部署上一周的 data/

⚠️ schedule 到点没跑

两个已知行为:一是 GitHub 高峰期排队,延迟 10-30 分钟属正常; 二是仓库连续 60 天没有任何 push,schedule 会被自动停用, 邮件提醒里点一下 re-enable 即可。fork 出来的仓库默认关闭 Actions,也要先手动 Enable。

🎯 优化建议

每周跑一次够用。如果想更频繁,加多个 cron(每小时跑一次头部 100 个插件,weekly 跑全量)。

或者接 GitHub Actions cache 缓存 npm metadata(已配),二次跑只 5-30 秒。