まず測る
| チェック | 見る場所 |
|---|---|
| どのjobが遅いか | Actionsのjob一覧 |
| どのstepが遅いか | job内のstep時間 |
| installが遅いか | npm ci / pnpm install |
| testが遅いか | test step |
| buildが遅いか | build step |
| queue待ちがあるか | workflow開始までの時間 |
高速化は、遅い場所を見つけてから始めます。
cache
Node.js:
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- run: npm ci
pnpm:
- uses: pnpm/action-setup@v4
with:
version: 9
- uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
- run: pnpm install --frozen-lockfile
確認:
- lockfileがコミットされているか
- package managerとcache設定が合っているか
- cache hitしているか
concurrency
同じブランチの古いCIをキャンセルします。
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
PRへ何度もpushする開発では効果が出やすいです。
paths
不要な変更でCIを動かさない設定です。
on:
pull_request:
paths:
- "src/**"
- "package.json"
- "package-lock.json"
- "tsconfig.json"
- ".github/workflows/**"
注意:
- 除外しすぎない
- 設定ファイルを忘れない
- docsだけの変更でCI不要か確認する
job分割
直列:
install -> lint -> test -> build
並列:
lint
test
build
独立している処理はjob分割を検討します。ただし、各jobでinstallが走るため、小さいプロジェクトでは直列の方が速いこともあります。
artifact
build成果物を後続jobへ渡します。
- uses: actions/upload-artifact@v4
with:
name: dist
path: dist/
- uses: actions/download-artifact@v4
with:
name: dist
path: dist/
同じbuildを複数回実行しないために使います。
hookとの役割分担
| 場所 | 実行内容 |
|---|---|
| pre-commit | staged filesのformat/lint |
| pre-push | 必要なら軽いtest |
| PR CI | lint/typecheck/test/build |
| main CI | deploy/E2E/security scan |
pre-commitに重い処理を詰め込みすぎないようにします。
Lefthook移行
Husky + lint-staged が遅い場合、Lefthookを検討します。
pre-commit:
parallel: true
commands:
eslint:
glob: "*.{ts,tsx,js,jsx}"
run: pnpm exec eslint --fix {staged_files}
stage_fixed: true
prettier:
glob: "*.{ts,tsx,js,jsx,json,md,css}"
run: pnpm exec prettier --write {staged_files}
stage_fixed: true
見ること:
- staged filesだけ対象か
- commandが並列化されているか
- typecheckをpre-commitに入れすぎていないか
- 移行前後の時間を測ったか
よく効く改善
| 改善 | 効果 |
|---|---|
| setup-node cache | install短縮 |
| concurrency | 古いCIを止める |
| paths | 不要なCIを減らす |
| job分割 | 待ち時間短縮 |
| staged files lint | pre-commit短縮 |
| Lefthook | hook起動と並列実行の改善 |
| artifact | build重複削減 |
READMEに書く項目
## CI/CD Performance
- setup-node cacheで依存関係インストールを短縮
- concurrencyで古いCIを自動キャンセル
- pre-commitはLefthookでstaged filesのみチェック
- lint/test/buildを役割ごとに分離
ポートフォリオでは、before/afterの時間も書くと伝わりやすいです。
まとめ
GitHub Actionsの高速化では、まず測り、cache、concurrency、paths、job分割、hookの役割分担を見ます。
CI/CDを組めるだけでなく、開発者が毎日使いやすい速度まで整えると、実務で評価されやすくなります。