【実務・中級編】Gitのフック(Hooks)を使い倒せ!ローカルコミット時にテストを自動実行する方法 – バージョン管理・CI/CD活用バイブル

Git Hooksを「個人の嗜み」から「チームの盾」へ:CI/CD以前の究極の防御線

「CIで落ちるから修正する」。これ、もうやめませんか?
CIパイプラインは「最後の砦」であって、「修正のための往復ビンタ」をする場所ではありません。開発者のローカルマシンで完結させられるミスをわざわざクラウドに投げ、数分待ってから「あ、lint通ってなかった」と気づく。この「フィードバックループの無駄」こそが、開発者の生産性を殺す最大の癌です。

今日は、Git Hooksを極限まで使い倒し、ローカルコミットの瞬間を「最高品質のゲート」に変えるための、現場の知見を叩き込みます。

—

1. なぜ「手動」でlintを叩くのか?(その問いが既に古い)

多くのチームで「コミット前に`npm run lint`してね」と口頭で伝えていますが、人間は忘れる生き物です。「自動化されていないプロセスは、存在しないものと同義」です。

Gitの`pre-commit`フックを使えば、コミットボタンを押した瞬間に以下の処理を強制できます。

  • 静的解析: ESLint / Flake8 / RuboCop
  • フォーマット: Prettier / Black
  • シークレットスキャン: Gitleaks(AWSキーの誤コミット防止)

チーム開発で絶対やるべき「設定の共有化」

`.git/hooks`はリポジトリ管理外です。これを解決する唯一の正解は、[husky](https://typicode.github.io/husky/)(Node.js環境の場合) や [pre-commit](https://pre-commit.com/)(Python/その他環境) を使い、設定ファイルをリポジトリ直下に配置し、`git clone`直後に自動インストールさせる運用です。

—

2. 実践:最強の`.pre-commit-config.yaml`(ベストプラクティス)

「とりあえず全部実行」は遅すぎて開発体験を損ないます。「変更されたファイルのみ」を対象にするのがプロの流儀です。

以下は、私がテックリードとして現場に必ず導入する設定例です。

.pre-commit-config.yaml
repos:

  • repo: https://github.com/pre-commit/pre-commit-hooks

rev: v4.4.0
hooks:

  • id: trailing-whitespace # 末尾の不要な空白を削除
  • id: end-of-file-fixer # ファイル末尾に改行を入れる
  • id: check-yaml # YAMLの構文チェック
  • id: check-added-large-files # 巨大ファイルの誤コミット防止
  • repo: https://github.com/gitleaks/gitleaks

rev: v8.18.0
hooks:

  • id: gitleaks # 認証情報の流出をコミット前にブロック!
  • repo: local

hooks:

  • id: run-tests

name: Run Unit Tests
entry: npm test — –findRelatedTests # 変更したファイルに関連するテストのみ実行
language: system
types: [javascript]
pass_filenames: false

—

3. 開発スピードを劇的に高める「裏技」と設定

① 鬼速になるための「テストの絞り込み」

全テスト実行は重すぎます。`jest –findRelatedTests` を使えば、「今まさに自分が編集したファイルに関係するテストだけ」が走ります。これでテスト時間が数秒に短縮されます。

② 「やべ、今すぐコミットしたい」時の緊急脱出

`git commit -m “wip” –no-verify`
どうしてもフックを無視したい時の最終手段。ただし、これを使った場合は「次のコミットで必ず負債を返す」ことをチームで誓約してください。

③ Git CLIの「神」エイリアス

`.gitconfig`に以下を追加してください。生産性が一段階変わります。

[alias]
# 直前のコミットを修正して、かつフックを走らせず即座に修正コミット
amend = commit –amend –no-edit
# ログをツリー状に見やすく表示(これ無しでGitは使えない)
lg = log –graph –pretty=format:’%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset’ –abbrev-commit

—

4. 現場のテックリードからの提言:チームを動かす力学

技術的にフックを導入しても、チームが嫌がれば形骸化します。導入成功の秘訣は以下の3点です。

1. 「遅い」を許さない: フックが5秒以上かかるなら、それは設定不足です。`lint-staged`のようなライブラリを使い、コミット対象のファイルだけを高速に処理させてください。
2. 教育コストをゼロにする: `pre-commit install`をプロジェクトのセットアップスクリプト(`Makefile`や`package.json`の`prepare`スクリプト)に組み込み、意識させずに導入させてください。
3. 「失敗」を「盾」と定義する: フックでエラーが出た時に「ウザい」と思わせるのではなく、「君が公開する前に、僕たちが君を守ったんだ」という文化を醸成してください。

—

最後に:自動化は「愛」である

Git Hooksの真の目的は、コードの品質を上げることではありません。「コードレビューで些細な指摘をゼロにすること」です。

「インデントがずれている」「使っていないインポートがある」といった、人間がやるべきではない議論に時間を使うのはやめましょう。マシンに任せられることは全て任せ、私たちは「アーキテクチャの妥当性」や「ユーザーに価値を届けるロジック」に集中する。

それが、伝説的なチームが共通して持っている「規律」なのです。

さあ、今すぐ`.pre-commit-config.yaml`をリポジトリに突っ込んでください。今日からあなたのチームは、一歩先の世界へ進みます。

タイトルとURLをコピーしました