とことんDevOps | 日本仮想化技術のDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けする「とことんDevOps」では、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果、TipsなどDevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、コンテナ開発、IaCなど

開催予定の勉強会

読者登録と各種SNSのフォローもよろしくお願いいたします。

pre-commitでGitのフックを使いこなす

Gitのhook便利ですよね。コミット前やpush前などのイベントにhookして何かしらの処理を実行するあれです。非常に強力な仕組みなのですが、自分で色々な処理を書かなくてはいけなくて使いこなせていない人も結構いるのではないでしょうか。pre-commitというフレームワークを使うことで誰でも簡単に便利な機能を使うことができます。

pre-commit ???

pre-commit.com

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:に列挙されているのがそれぞれの処理になります。どういう処理がされるのかというのはリポジトリをみてみるとわかります。

github.com

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については以下で説明しています。

devops-blog.virtualtech.jp

.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を直接編集しなくていいので、この手の作業が苦手な方でも導入が楽そうなのはいいなと思いました。