【ツール活用|豆知識】Git pre-push hookで「重い検証」を自動化!CIを汚さない水際ブロック術

導入: なぜpre-push hookが必要なのか

日々の開発において、コミットのたびにE2Eテストやフルビルドを走らせていませんか?これらはコード品質を守るために必須ですが、実行時間が長すぎると開発のリズムが削がれます。一方で、検証をサボると壊れたコードがCIサーバーへ送られ、チーム全員のビルドを止めてしまうリスクがあります。そこで活用したいのが「pre-push hook」です。プッシュの直前にのみ重い検証を実行することで、開発の快適さと品質維持を両立させる「水際ブロック」の戦略を解説します。

基礎知識: Git Hookの仕組み

Gitには、特定のイベントが発生した際に自動的にスクリプトを実行する「フック」機能があります。その中でも.git/hooks/pre-pushは、git pushコマンドが実行された直後にトリガーされます。このスクリプトが終了コード0以外を返すと、プッシュ自体がキャンセルされます。つまり、テストが失敗している状態でリモートにコードを上げることを物理的に防ぐことができるのです。

実装/解決策: pre-pushの設定手順

まずは、プロジェクトのルートディレクトリにスクリプトを配置します。Gitのフックはデフォルトでは共有されないため、チーム開発ではHusky(Node.js環境)などのライブラリを使うか、各メンバーにスクリプトを配置してもらう運用が必要です。今回は、シンプルにシェルスクリプトで実装する方法を紹介します。

サンプルプログラム: pre-pushの実装例

以下のコードを .git/hooks/pre-push として保存し、chmod +x .git/hooks/pre-push で実行権限を付与してください。

!/bin/bash

実行する検証コマンド(E2Eテストや脆弱性スキャンなど)
ここでは例としてnpm testと脆弱性スキャンコマンドを定義します
echo “— プッシュ前の重い検証を開始します —”

1. E2Eテストの実行
echo “E2Eテストを実行中…”
npm run test:e2e
if [ $? -ne 0 ]; then
echo “エラー: E2Eテストに失敗しました。プッシュを中断します。”
exit 1
fi

2. コンテナイメージの脆弱性スキャン(例: trivy)
echo “脆弱性スキャンを実行中…”
trivy image my-app:latest
if [ $? -ne 0 ]; then
echo “エラー: 脆弱性が検出されました。プッシュを中断します。”
exit 1
fi

echo “— 検証が完了しました。プッシュを続行します —”
exit 0

応用・注意点: 現場で陥りやすいバグの回避

1. 無効化の手段を用意する
検証が厳格すぎると、緊急時にデプロイができなくなるリスクがあります。どうしてもプッシュを通したい場合は、git push –no-verify オプションを使用することをチーム内で共有しておきましょう。

2. 実行環境の差異
ローカル環境の検証とCI環境で結果が異なるケースがあります。コンテナイメージの脆弱性スキャンなどを行う場合は、ローカル環境でもCIと同じDocker環境を利用するように徹底してください。

3. 共有の自動化
GitのhooksディレクトリはGit管理外です。チームで運用する場合は、huskyなどのツールを使ってフックを自動的にセットアップさせる仕組みを導入することを強く推奨します。これにより「検証の設定漏れ」を未然に防ぐことができます。

コメント

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