個人專案不需要 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 }}
個人專案不該做的事
- 跑 visual regression test:對 1 人專案的 ROI 太低
- e2e test 跨多瀏覽器:增加 CI 時間 4 倍
- 每個 commit 都 deploy production:人工觸發比較安全
- 過度使用 matrix:3 種 OS × 5 種 Node 版本 = 15 jobs,免費額度燒很快
節省 CI 分鐘的技巧
cache: 'npm'全部 workflow 一定要- 分開 push 跟 pull_request 觸發(不要兩個都跑)
paths: ['src/**']過濾 — 改 README 不跑測試concurrency.cancel-in-progress— 新的 push 取消舊的- 大 task 拆成 parallel jobs 而不是 sequential
結語
GitHub Actions 是個人專案 CI 的甜蜜選擇 — 不用自架、不用學 yaml DSL(基礎夠用就好)、跟 GitHub 無縫整合。8 個 workflow 模板複製貼上,CI 系統就建立完成。