GitHooksをElixir開発環境へ導入して、コミットやプッシュの際にコード検査やテストが走るようにする


概要

Elixir開発環境にGitフックを導入し、コミットやプッシュのタイミングで自動的にコード検査やテスト等が実行されるようにします。

  • HexのGitHooksを使います。
    • JavaScript(Node.js)で言うところのHusky的なライブラリです。
  • これにより、Gitフックを簡単に生成してElixir開発ディレクトリへ導入することができます。

実行環境

  • MacOS
  • Elixir 1.11.2 (compiled with Erlang/OTP 22)
  • mix

コード

mix.exs
defp deps do
  [
    {...},
    {:git_hooks, "~> 0.5.1", only: [:test, :dev]}
  ]
end
config/config.exs
...

# 例
config :git_hooks,
  auto_install: true,
  verbose: true,
  hooks: [
    pre_commit: [
      tasks: [
        {:cmd, "mix format --check-formatted"}
      ]
    ],
    pre_push: [
      verbose: false,
      tasks: [
        {:cmd, "mix test"}
      ]
    ]
  ]
  • 各人やプロジェクトのGit運用スタイルに合わせて、pre_commitやpre_pushを設定します。

設定手順

  1. 上記各ファイルへ設定追記。
  2. mix deps.get && mix deps.compileを実行。
  3. 念のためmix git_hooks.run pre_commitして、手動で走るか確認する。
  4. mix git_hooks.installを実行。(開発ディレクトリにhooksファイルを書き出す)

これ以降は、git commitやgit pushのたびに自動でhooksが走るようになります。

Git
$ git commit -m "commit NOT-formatted code"

↗ Running hooks for :pre_commit
** (Mix) mix format failed due to --check-formatted.
The following files are not formatted:

  * config/config.exs

× pre_commit failed on `mix format --check-formatted`
** (exit) 1
    ...

補足

pre_commit / pre_push を再設定する

config/config.exsで設定を書き直してから、mix git_hooks.installを実行します。

hooksをスキップしたい

通常のgit hooksと同様に--no-verifyオプションを付加することで、hooksをスキップできます。

Git
$ git commit -m "commit without hooks" --no-verify

おわりに

GitHooksをサクッとElixir開発ディレクトリに導入して、CIを回す前のローカルリポジトリ段階でもコード検査やテスト実行を自動化して開発効率や開発体験を向上させていきましょう。