コミット前にrubocopを実行する
はじめに
GitフックはGitリポジトリでのタスク自動化やコーディング規約の徹底に非常に強力です。よくあるユースケースのひとつが、コミットを許可する前に自動テストやコード解析ツールを実行することです。この記事では、pre-commitフックの概要、スキップする方法、そしてRubyのコード解析ツールであるRubocopを実行するpre-commitフックの設定方法を紹介します。
Rubocopとは?
Rubocopは、コードのスタイルやセキュリティの問題をチェックするRuby向けの静的コード解析ツールです。コードがRubyスタイルガイドとベストプラクティスに従っていることを保証するために、Ruby開発者の間で広く使われています。Rubocopは手動でも実行できますが、pre-commitフックと統合すれば、コミットのたびに自動でコードがチェックされます。
以下を .git/hooks/pre-commit にコピーしてください(.sample を外します)
#!/usr/bin/env ruby
require 'english'
require 'rubocop'
ADDED_OR_MODIFIED = /A|AM|^M/.freeze
changed_files = `git status --porcelain`.split(/\n/).
select { |file_name_with_status|
file_name_with_status =~ ADDED_OR_MODIFIED
}.
map { |file_name_with_status|
file_name_with_status.split(' ')[1]
}.
select { |file_name|
File.extname(file_name) == '.rb'
}.join(' ')
system("rubocop #{changed_files}") unless changed_files.empty?
exit $CHILD_STATUS.exitstatus
実行権限を付与します
$ chmod +x .git/hooks/pre-commit
これで準備完了です。以降は変更内容に対してrubocopが実行され、違反を修正しない限りコミットできなくなります。
pre-commitをスキップするには? git commit に -n を渡すだけです
$ git commit -n -m "[hotfix] blah blah"
pre-commitフックとは?
pre-commitフックは、コミットが作成される前に実行されるクライアントサイドのGitフックです。自動テストの実行、コードスタイルのチェック、コーディング規約の強制など、さまざまなことができるスクリプトです。pre-commitフックが失敗するとコミットは中断され、問題を修正してから再度コミットする必要があります。
コミット前にRubocopを実行する理由
コミット前にRubocopを実行することには、いくつかの利点があります。
- コード品質:Rubocopはスタイルやセキュリティの問題をチェックするため、コードベースの一貫性と安全性が保たれます。
- 時間の節約:コミット前にRubocopを自動実行することで問題を早期に発見でき、後でデバッグに時間を浪費せずに済みます。
- コラボレーション:pre-commitフックでコーディング規約を強制することで、チームメンバー間の協力と一貫性が促進されます。
pre-commitフックの設定方法
- Rubocopと、好みのpre-commitフックツール(HuskyやPre-commitなど)をインストールします。
- .git/hooks ディレクトリに pre-commit という名前の新しいファイルを作成します。
- pre-commitファイルにRubocopのコマンドを追加します(例:rubocop -a)。
- chmod +x .git/hooks/pre-commit を実行して、pre-commitファイルに実行権限を付与します。
- git commit -m “Test commit” を実行して、pre-commitフックをテストします
注意:pre-commitフックを一時的にスキップしたい場合は、git commit コマンドで --no-verify オプションを使えます。例:git commit -m “Test commit” --no-verify