monorepo向けサーバーサイド git hook

git hookを活用すると自動ビルドなどが可能になります。
複数のプロダクトを統合するmonorepo構成の場合、ブランチの判定にくわえてディレクトリの判定も必要になります。

サーバー側のベアリポジトリでは、git branchgit diffが動作しないため、他のサブコマンドを利用して以下のように条件分岐を実装できます。

#!/bin/bash

BRANCH=$(git rev-parse --symbolic --abbrev-ref $1)
if [[ $BRANCH = 'main' ]]; then
  if [ $(git log --name-only --oneline -1 | grep "^service-a" | wc -l) -gt 0 ]; then
    # Do action for Service A
  elif [ $(git log --name-only --oneline -1 | grep "^service-b" | wc -l) -gt 0 ]; then
    # Do action for Service B
  fi
fi

gitリポジトリの変更チェックはgit hook以外の用途にも使えますが、変更ファイルを調べるためのgit logがシャロークローンなどで適切に動作しない場合につき注意が必要です。

典型的にはgit clone --depth 1で取得したレポジトリは、すべての変更が直近のコミットに集約されているような状態になります。
エラーではなく想定と異なる判定挙動になり、因果関係が読みとりづらいでしょう。

中馬崇尋
Chuma Takahiro