ローカルhook・PR CI・main CIの役割分担

中級 | 12分 で読める | 2026.06.27

公式ドキュメント

全部を毎回走らせない

品質チェックは重要です。しかし、すべてのタイミングで全部を実行すると、開発速度が落ちます。

CI/CD設計では、ローカルhook、PR CI、main CIの役割を分けることが重要です。

軽いチェックは早いタイミングで、重いチェックは必要なタイミングで実行します。

役割の全体像

タイミング目的向いている処理
pre-commit手元の小さなミスを即修正format、staged files lint
pre-pushpush前の簡易確認unit test、typecheckの一部
PR CImerge前の品質確認lint、typecheck、test、build
main CI本番反映前後の確認deploy、E2E、重いscan

pre-commitに全部入れるとcommitが重くなります。main CIだけに寄せると、フィードバックが遅すぎます。

pre-commit

pre-commitでは、軽くて自動修正しやすい処理を実行します。

向いているもの:

  • Prettier
  • ESLintのfix
  • import整理
  • staged filesだけのlint
  • 秘密情報の簡易検出

避けたいもの:

  • 全体typecheck
  • 全テスト
  • E2E
  • build
  • 外部APIに依存する処理

pre-commitは頻繁に動くため、数秒以内を目標にします。重い処理を入れると、開発者が --no-verify を使いたくなります。

pre-push

pre-pushは、push前に少し重い確認をする場所です。

候補:

  • unit test
  • typecheck
  • 変更範囲のtest
  • packageの軽いbuild

ただし、pre-pushも重すぎると邪魔になります。チームによってはpre-pushを使わず、PR CIへ寄せる判断もあります。

PR CI

PR CIは、merge前の標準チェックです。

おすすめ:

on:
  pull_request:

jobs:
  lint:
  typecheck:
  test:
  build:

PR CIでは、ローカルhookを飛ばした変更も検出できるようにします。

見るべきもの:

  • lintが通る
  • typecheckが通る
  • unit testが通る
  • buildできる
  • 必要なら軽いintegration testが通る

PR CIは、レビュー前の機械的な品質チェックです。

main CI

main CIは、merge後の信頼できるブランチで動きます。

候補:

  • production build
  • deploy
  • migration dry-run
  • E2E
  • security scan
  • release作成
  • Docker image build/push

main CIは重くてもよい場合があります。ただし、失敗したときの影響が大きいので、通知とロールバック手順を用意します。

重いE2Eの扱い

E2Eは価値がありますが、遅くなりやすいです。

実行タイミングの候補:

タイミング使い方
PRごと重要なsmoke testだけ
main merge後フルE2E
nightly重い全ケース
release前本番相当で確認

PRごとに全E2Eを走らせると、CI待ちが長くなります。重要な導線だけに絞るなど、段階を分けます。

失敗時の責務

どこで失敗したかによって、修正すべき内容が変わります。

失敗場所意味
pre-commit手元のformat/lint違反
pre-pushpush前に気づける品質問題
PR CImerge前に止めるべき問題
main CImerge後の環境差、deploy問題

ローカルhookだけで守ろうとせず、PR CIを最終防衛線にします。

ポートフォリオでの設計例

ポートフォリオなら、次の構成で十分強いです。

pre-commit:
  Lefthook
  staged files lint
  format

PR CI:
  lint
  typecheck
  test
  build

main CI:
  deploy

READMEには、役割分担を書きます。

## CI/CD

- pre-commit: Lefthookで変更ファイルだけlint/format
- Pull Request: lint/typecheck/test/buildを実行
- main: build成功後にデプロイ
- concurrencyで古いCIをキャンセル

これだけで、現場の開発フローを意識していることが伝わります。

まとめ

CI/CDは、全部を毎回走らせればよいわけではありません。

  • pre-commitは軽く速く
  • pre-pushは必要なら中程度の確認
  • PR CIはmerge前の標準チェック
  • main CIはdeployや重い検証
  • E2Eは重要度で段階分けする
  • ローカルhookに依存せず、CIでも必ず確認する

速度と品質のバランスを取れると、CI/CD設計の見え方が一段上がります。

参考リソース

次に読む記事

← 一覧に戻る
PR
PR
PR
PR