Engineering

GitHub Actions 最低成本 CI 配置

2026 年 5 月 6 日約 9 分鐘閱讀作者:Hao0321 Studio

個人專案不需要 enterprise 級 CI。GitHub Actions 免費版 public repo 無限分鐘、private repo 每月 2,000 分鐘 — 對個人完全夠用。這篇分享工作室實際使用的 8 個 workflow 模板,每個都解決一個具體問題。

1. Lint / Type Check(每 PR 跑)

name: Lint
on: [pull_request]
jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: '20', cache: 'npm' }
      - run: npm ci
      - run: npm run lint
      - run: npm run typecheck

關鍵:用 cache: 'npm',避免每次都重新下載 node_modules,加速 30%。

2. 測試(多 Node 版本)

name: Test
on: [push, pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node: ['18', '20', '22']
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: '${{ matrix.node }}' }
      - run: npm ci
      - run: npm test

3. 自動部署 Cloudflare Pages

name: Deploy
on:
  push:
    branches: [main]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: '20' }
      - run: npm ci && npm run build
      - uses: cloudflare/pages-action@v1
        with:
          apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
          accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
          projectName: hao0321-studio
          directory: ./dist

4. 自動發布 npm package

name: Release
on:
  push:
    tags: ['v*']
jobs:
  publish:
    runs-on: ubuntu-latest
    permissions:
      id-token: write  # for npm provenance
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
          registry-url: 'https://registry.npmjs.org'
      - run: npm ci && npm run build
      - run: npm publish --provenance --access public
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

5. PR Preview Deployment

name: Preview
on:
  pull_request:
    branches: [main]
jobs:
  preview:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: '20' }
      - run: npm ci && npm run build
      - uses: cloudflare/pages-action@v1
        id: deploy
        with:
          apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
          accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
          projectName: hao0321-studio
          branch: ${{ github.head_ref }}
          directory: ./dist
      - uses: actions/github-script@v7
        with:
          script: |
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: `Preview: ${{ steps.deploy.outputs.url }}`
            });

6. 定時執行(cron)

每天清舊資料、產生報表、抓外部 RSS:

name: Daily Tasks
on:
  schedule:
    - cron: '0 4 * * *'  # 每天 UTC 04:00
jobs:
  cleanup:
    runs-on: ubuntu-latest
    steps:
      - run: |
          curl -X POST https://api.example.com/cleanup \
            -H "Authorization: Bearer ${{ secrets.API_TOKEN }}"

7. Lighthouse CI(效能 budget)

name: Lighthouse
on:
  pull_request:
jobs:
  lhci:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: '20' }
      - run: npm ci && npm run build
      - run: npx @lhci/cli@latest autorun
        env:
          LHCI_GITHUB_APP_TOKEN: ${{ secrets.LHCI_GITHUB_APP_TOKEN }}

8. Issue / PR 自動化標籤

name: Auto Label
on:
  pull_request:
    types: [opened]
jobs:
  label:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/labeler@v5
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}

個人專案不該做的事

節省 CI 分鐘的技巧

  1. cache: 'npm' 全部 workflow 一定要
  2. 分開 push 跟 pull_request 觸發(不要兩個都跑)
  3. paths: ['src/**'] 過濾 — 改 README 不跑測試
  4. concurrency.cancel-in-progress — 新的 push 取消舊的
  5. 大 task 拆成 parallel jobs 而不是 sequential

結語

GitHub Actions 是個人專案 CI 的甜蜜選擇 — 不用自架、不用學 yaml DSL(基礎夠用就好)、跟 GitHub 無縫整合。8 個 workflow 模板複製貼上,CI 系統就建立完成。