🪝

インフラリポジトリ(terraform, kubernetes)のgit hook管理にどれを使うか

2023/01/31に公開

解決したい課題

commit前に terraform fmt やprettierによるyamlマニフェストのフォーマットをしたい。
その方法としてgit hookを使いたいが、git hookの定義ファイルはそのままではgitでバージョン管理できないため、チームで同じ定義を使う場合は工夫が必要になる。

SREチームでgit hookを共有する場合、以下の選択肢の中で良さそうな選択肢はどれか:

  • ツールなし(手動で .git/hooks 下を管理)
  • husky v4 (npm)
  • husky v8 (npm)
  • simple-git-hooks (npm)
  • overcommit (gem)
  • precommit (python)
  • lefthook (golang)

良さそうな選択肢

lefthook、ついでhusky v8がよさそう。

理由1: golangで揃えられる

terraformもkubernetesもgolangで書かれており、kubernetes系のツールもgolangのものが多い。
SREは常にgolangを書いているわけではないが、terraform providerやkubernetes関連の調査・開発でgolangを使う場合が多い。そんなとき、golang系のツールであるlefthookは相性が良さそうである。

理由2: 依存関係が少ない

golangで書かれたlefthookは依存関係が少ない。

huskyのようにlint-stagedと組み合わせることなく、同等の機能を持っている。

理由3: インストール方法の自由さ

https://github.com/evilmartians/lefthook/blob/master/docs/install.md

に書かれている通り、gemやpip, npmなどgolang以外のパッケージマネージャーでもインストールすることができる。
huskyがnpmでしかインストールできないことと対象的である。

懸念点

lefthookのgithubのスターの数やウェブ上のドキュメントの数を見る限り、huskyやpre-commitと比べるとまだ利用者は少なそうではある。利用者が少ないとよりバグを踏みやすかったりウェブ上にドキュメントが少なかったりする。
しかし、このgit hook管理はもし仮に問題を感じたとしても比較的切り替えやすいため、問題にぶち当たってそのまま使い続けることが出来ないと事態になったとしてもコストは少なくて済む。

Discussion