【入門編】Composerの「Hooks」によるCI/CDワークフロー自動化:Git連携でコミット前にコード品質を強制する方法 – ビルド・パッケージ管理ツール生産性向上バイブル

こんにちは!日々のPHP開発、お疲れ様です。

皆さんは、チームで開発しているときに「あ、またフォーマット崩れのコードがコミットされちゃった…」「CI(継続的インテグレーション)が落ちてから、静的解析エラーに気づくの、地味にタイムロスだな…」と感じたことはありませんか?

実は、「コードを書き終わって、Gitのコミットボタンを押した瞬間(あるいは `git commit` を叩いた瞬間)」に、自動でコードの品質チェックを走らせる仕組みを作ることができます。これができれば、CIが落ちるのを待つ無駄な時間ともおさらばですし、何より自分の手元で綺麗に整えられたコードだけをリポジトリに送り出せるようになります。

今回は、PHPのパッケージマネージャーである Composer の強力な機能と Gitフック を組み合わせ、コミット前にコード品質を自動で強制するスマートなワークフローの作り方を、優しく丁寧にお伝えしていきますね。

これをマスターすれば、あなたの毎日のコーディング体験は劇的にストレスフリーになりますよ。一緒に見ていきましょう!

—

1. そもそもなぜ、ComposerとGitフックを連携させるのか?

多くのプロジェクトでは、コードの書き方を統一するための「PHP_CodeSniffer(phpcs)」や、バグを未然に防ぐ静的解析ツールの「PHPStan」などが導入されています。

しかし、これらのツールは「人間が手動でコマンドを叩く」か「GitHub ActionsなどのCIで動かす」という運用になりがちです。これだと、
1. 手動実行を忘れて、汚いコードをプッシュしてしまう。
2. CIでエラーを指摘され、わざわざ修正して再コミットする(手戻りが発生する)。

という問題が起きます。

ここで登場するのが Gitの「Pre-commitフック」 です。Gitには、特定のイベント(コミットする直前など)のタイミングで任意のスクリプトを自動実行する機能があります。これを利用して、「コミットしようとしたファイル群に対して、Composer経由で静的解析とフォーマットチェックを強制し、エラーがあればコミットを中断する」という仕組みを構築します。

Composerの `scripts` 機能を使えば、プロジェクトのローカルにインストールされたツール(`vendor/bin/` 以下にあるもの)を安全かつ簡単に呼び出せるため、環境差異に悩まされない堅牢な自動化が実現できるのです。

—

2. 基礎セットアップ:品質チェックツールの導入

まずは、プロジェクトにComposerでコード品質を担保するためのツールをインストールしましょう。まだプロジェクトの初期段階だとして話を進めますね。

ターミナルを開き、プロジェクトのルートディレクトリで以下のコマンドを実行してください。

コーディング規約チェック用の PHP_CodeSniffer と、型安全などを検査する PHPStan を開発用依存関係としてインストール
composer require –dev squizlabs/php_codesniffer phpstan/phpstan

なぜ `–dev` オプションをつけるのか?

これらのツールは、プロダクトの実行には直接関係ありません(本番サーバーには不要な開発支援ツールです)。`–dev` をつけることで、本番環境へデプロイする際の無駄なファイル肥大化を防ぎ、軽量な状態を保つことができます。

—

3. Composerの `scripts` に品質チェックを定義する

次に、Composerの設定ファイルである `composer.json` に、これらのツールを実行するためのショートカット(スクリプト)を定義します。

`composer.json` を開き、以下のように `scripts` セクションを追加・編集してください。

{
“name”: “my-project/sample”,
“type”: “project”,
“require”: {
“php”: “^8.2”
},
“require-dev”: {
“squizlabs/php_codesniffer”: “^3.7”,
“phpstan/phpstan”: “^1.10”
},
“scripts”: {
// PHPStanによる静的解析を実行するコマンドの定義
“stan”: “vendor/bin/phpstan analyse src –level=max”,

// コーディング規約(PSR-12など)に違反していないかチェックするコマンドの定義
“cs-check”: “vendor/bin/phpcs src”,

// 上記の品質チェックをまとめて実行するグループコマンド
“quality:check”: [
“@cs-check”,
“@stan”
]
}
}

ここがポイント!

Composerの `scripts` 内では、`vendor/bin/` にあるバイナリを直接パスを指定して実行できます。これにより、グローバル環境にPHPStanやPHPCSがインストールされていなくても、プロジェクトごとの正確なバージョンで実行が保証されるという大きなメリットが生まれます。

動作確認として、ターミナルで以下を叩いてみましょう。

composer quality:check

これで、定義したチェックが一括で走れば、基盤の準備は完璧です!

—

4. Gitフック(Pre-commit)の仕込み:今回のキモ

いよいよ本丸です。Gitのコミット直前に、先ほど作った `composer quality:check` を自動で走らせる仕組みを作ります。

Gitのリポジトリ内にある `.git/hooks/` ディレクトリには、デフォルトでサンプルスクリプトが入っています。ここに `pre-commit` という名前の実行ファイルを作成します。

プロジェクトのルートから、以下の手順でファイルを作成してください。

.git/hooks/pre-commit ファイルを新規作成(※ .git ディレクトリは通常隠しフォルダです)
touch .git/hooks/pre-commit

実行権限を付与する(これがないとGitがスクリプトを実行してくれません)
chmod +x .git/hooks/pre-commit

次に、作成した `.git/hooks/pre-commit` ファイルをエディタで開き、以下のシェルスクリプトを記述します。

!/bin/sh

ターミナルの文字コードや環境差異による誤動作を防ぐため、安全な設定にする
set -e

echo “🔍 [Git Hook] コミット前のコード品質チェックを開始します…”

Composer経由で品質チェックコマンドを実行する
途中でエラー(終了コードが0以外)が発生した場合、ここでスクリプトが止まり、コミットもキャンセルされます
composer quality:check

if [ $? -eq 0 ]; then
echo “✨ [Git Hook] すべてのチェックをクリアしました!コミットを続行します。”
exit 0
else
echo “❌ [Git Hook] エラーが検出されました。修正してから再度コミットしてください。”
exit 1
fi

💡 アーキテクトからの重要な補足:チーム開発における注意点

実は、`.git/` ディレクトリの中身は Gitのバージョン管理の対象外 です。つまり、上記の設定をそのままでは他の開発者(チームメンバー)と共有できません。

もしチーム全員にこの仕組みを強制させたい場合は、
1. プロジェクトのルートに `scripts/git-hooks/pre-commit` などのフォルダを作り、そこに管理用ファイルを置く。
2. 初回セットアップ時にそれを `.git/hooks/` にシンボリックリンクまたはコピーするシェルスクリプトを用意する(あるいは Composer の `post-install-cmd` スクリプトで自動配置する)。

というアプローチをとるのが、プロの現場でのスマートな定石です。今回は仕組みの理解を深めるため、直接 `.git/hooks/pre-commit` を書き換える方法をとっています。

—

5. 精度高い動作確認:実際に試してみよう!

それでは、この仕組みが本当に意図通りに動くか、実際に試してみましょう。

わざと「PHPStanが怒り出すような汚いコード」を書いてみます。例えば、存在しないメソッドを呼び出すようなコードを `src/Sample.php` として適当に作成・保存します。

その後、いつも通りGitにステージングして、コミットを試みます。

適当なファイルをステージング
git add src/Sample.php

コミットを実行
git commit -m “feat: テスト用のコードを追加”

【実行結果のイメージ】

🔍 [Git Hook] コミット前のコード品質チェックを開始します…
> vendor/bin/phpcs src
> vendor/bin/phpstan analyse src –level=max
3/3 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%

—— ————————————————–
Line Sample.php
—— ————————————————–
12 Call to an undefined method App\Sample::notExistMethod().
—— ————————————————–

[ERROR] Found 1 error
❌ [Git Hook] エラーが検出されました。修正してから再度コミットしてください。

…どうでしょう!
PHPStanが見事にエラーを検知し、コミット処理そのものが美しく中断(アボート)されました。

開発者はこのフィードバックを即座に受け取り、コードを修正して再び `git commit` を叩くだけで済むため、サーバーサイドのCIパイプラインを何回も回す無駄な待ち時間が完全にゼロになります。

—

おわりに

今回は、Composerの `scripts` と Gitのプレコミットフックを華麗に連携させ、コミット前にコード品質を強制する実践的なワークフローをご紹介しました。

  • Composerのscripts でプロジェクトローカルなツールを安全に一元管理する
  • Gitのpre-commitフック で人間の「うっかり」をシステムで物理的に防ぐ

この2つを組み合わせるだけで、チーム全体のコードベースの健康状態は見違えるほど美しく保たれるようになります。「品質が高いコードを書くこと」が自然と習慣化される最高の開発環境を、ぜひあなたのプロジェクトでも導入してみてくださいね。

毎日のコーディングが、もっと楽しく、もっと気持ちの良いものになりますように。次回の記事もお楽しみに!

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