背景
githooksをチーム開発でも活かせないか試してみました
Githooks
githook はサンプルコードが存在します
gitを使ったプロジェクト内の .git/hooks
にファイルが配置されています
❯ ls -alh .git/hooks
total 128
drwxr-xr-x 16 ※** ※** 512B Jul 9 09:36 .
drwxr-xr-x 12 ※** ※** 384B Jul 9 09:45 ..
-rwxr-xr-x 1 ※** ※** 478B Jul 9 09:36 applypatch-msg.sample
-rwxr-xr-x 1 ※** ※** 896B Jul 9 09:36 commit-msg.sample
-rwxr-xr-x 1 ※** ※** 4.6K Jul 9 09:36 fsmonitor-watchman.sample
-rwxr-xr-x 1 ※** ※** 189B Jul 9 09:36 post-update.sample
-rwxr-xr-x 1 ※** ※** 424B Jul 9 09:36 pre-applypatch.sample
-rwxr-xr-x 1 ※** ※** 1.6K Jul 9 09:36 pre-commit.sample
-rwxr-xr-x 1 ※** ※** 416B Jul 9 09:36 pre-merge-commit.sample
-rwxr-xr-x 1 ※** ※** 1.3K Jul 9 09:36 pre-push.sample
-rwxr-xr-x 1 ※** ※** 4.8K Jul 9 09:36 pre-rebase.sample
-rwxr-xr-x 1 ※** ※** 544B Jul 9 09:36 pre-receive.sample
-rwxr-xr-x 1 ※** ※** 1.5K Jul 9 09:36 prepare-commit-msg.sample
-rwxr-xr-x 1 ※** ※** 2.7K Jul 9 09:36 push-to-checkout.sample
-rwxr-xr-x 1 ※** ※** 2.3K Jul 9 09:36 sendemail-validate.sample
-rwxr-xr-x 1 ※** ※** 3.6K Jul 9 09:36 update.sample
今回は commit する前と push する前に利用するので pre-commit.sample
と pre-push.sample
を利用します。
利用するためには名前から .sample
をtrim すればOKです
mv .git/hooks/pre-commit.sample .git/hooks/pre-commit
mv .git/hooks/pre-push.sample .git/hooks/pre-push
あとは必要に応じて実行権限を与えてあげれば使えるようになります
chmod +x .git/hooks/pre-commit
chmod +x .git/hooks/pre-push
pre-commit
も pre-push
も中身はシェルスクリプトなので、あとは用途に応じてシェルを組んであげてください(AIあたりに生成させてあげると楽かも)
本題
さて上記の手順だと、チーム開発に活かそうと考えた場合、README.mdに上記の手順とhooksで利用するソースコードを記載してあげる必要がありドキュメントの保守コストやメンバーの参入障壁が上昇してしまいます
そこで今回は以下のように symboliclink を駆使してgithooksを導入できる形を検討してみました
まず、hooksを git add
の対象に入れるため適当なディレクトリに配置します
私はわかりやすいように .github/hooks
という名前のディレクトリを作成してそこに配置しています
mkdir -p .github/hooks
cp .git/hooks/pre-commit .github/hooks/pre-commit
cp .git/hooks/pre-push .github/hooks/pre-push
これでgit add
の対象になりました
続いてメンバー参入時などを想定したレポジトリをcloneする場合について説明します
git cloneしただけだと .github/hooks
にファイルが配置されているためgithooksが動きません
そこで symboliclink を用います
# set git hook
ln -s .github/hooks/pre-commit .git/hooks/pre-commit
ln -s .github/hooks/pre-push .git/hooks/pre-push
# 併せて権限も設定
chmod +x .git/hooks/pre-commit
chmod +x .git/hooks/pre-push
これで完成です
これならREADME.mdへの記述はコピペで終わるコマンドでまとめつつチーム開発にも利用できる形となったかと思います
IDEやテキストエディターを用いないユーザーやそもそもそういったツールを使いこなせていないユーザーに対して、コード保存時にlinterやformatterを実行させるということは中々にハードルが高いものかと思います
そこで、このようなCIはとても役立つと思うのでぜひ参考にしてみてください
余談
githooks, 個人的には個人開発でのCIにちょうどいいかなと思ったり
その他の候補
Github Actions
チーム開発ならやっぱりこちらを推奨します
なんといっても参入者が何もしなくて良いのが大きい
ただ、個人開発ならやりすぎ感が否めないかも
husky
npm パッケージを駆使して開発するならhuskyで良いかも
※ npm パッケージが必須となります
サンプル
githooks で commit時に eslint, prettierを、push時に commitlint を動かしていた時のコードのリンクを貼っておきます
(今はGithub Actionsの練習のため移行してしまった)