Gitのhook便利ですよね。コミット前やpush前などのイベントにhookして何かしらの処理を実行するあれです。非常に強力な仕組みなのですが、自分で色々な処理を書かなくてはいけなくて使いこなせていない人も結構いるのではないでしょうか。pre-commitというフレームワークを使うことで誰でも簡単に便利な機能を使うことができます。
pre-commit ???
pre-commitフックを管理するためのフレームワークです。コミット前に実行したいあれやこれやを.pre-commit-config.yaml
ファイルに記述しておくことでコミット前に実行できます。実行したい処理は自分で書くこともできますし、公開されているものを利用することも可能です。
インストール
https://pre-commit.com/#install
Python製のツールなので、pipでインストールすることができます。HomebrewでもインストールできるのでMacな人はHomebrewの方が楽です。asdf勢はコチラを参考にインストールすることで使い始めることができます。
使ってみる
なにはともあれpre-commitの実行には.pre-commit-config.yaml
が必要です。サンプルの設定ファイルをジェネレートしましょう。
pre-commit sample-config > .pre-commit-config.yaml
設定ファイルが作成できました。この記事執筆時点では以下のような設定になっています。
# See https://pre-commit.com for more information # See https://pre-commit.com/hooks.html for more hooks repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v3.2.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer - id: check-yaml - id: check-added-large-files
repo:
は処理を公開しているリポジトリで、hooks:
に列挙されているのがそれぞれの処理になります。どういう処理がされるのかというのはリポジトリをみてみるとわかります。
sampleの設定で説明するとtrailing-whitespace
は行末のスペースの削除、end-of-file-fixer
はファイルが改行で終わっているかの確認、check-yaml
はYAMLファイルの構文チェック、check-added-large-files
は巨大なファイルがコミットされるのを防ぎます。
このように、自分で処理を書くには少々手間な設定がロードするだけで実行できるようになります。YAMLは使ってないよとか、大きいファイルを入れたいよという場合はhooksの中身を自分なりに追加削除するとよいと思います。
自分なりに調整ができたら以下のコマンドでフックスクリプトをインストールします。
pre-commit install
作ってみる
フックスクリプトを直接.pre-commit-hooks.yaml
に書くこともできます。開発言語や設定値は以下から確認してください。
https://pre-commit.com/#supported-languages https://pre-commit.com/#creating-new-hooks
色々設定項目があって混乱しそうですが、必須項目はid
name
entry
language
だけです。(optional: default xx)
を確認して、デフォルトから変更したい場合は設定を追加するといいでしょう。
今回はコミット前にhadolintを実行してみます。hadolintについては以下で説明しています。
.pre-commit-config.yaml
を以下のように修正してみました。
repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v3.2.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer - id: check-added-large-files - repo: local hooks: - id: dockerfile-linter name: ... entry: hadolint args: ['Dockerfile'] language: system file: ^Dockerfile$
repo: local
以下でhadolintの実行をしています。
実際にコミットしてみると……
このようにhadolintのエラーでcommitを中止してくれました。動作確認をしたいだけなら実際にコミットしなくてもpre-commit run
で手動実行も可能です。
まとめ
.git/hooks
で個別に書かなくてもリポジトリで公開していれば複数のプロジェクトで読み込めるので、社内共通で使いたい処理なんかを作っておくのはよさそうです。また、.git/hooks/pre-commit
を直接編集しなくていいので、この手の作業が苦手な方でも導入が楽そうなのはいいなと思いました。