Overview
git commit コマンド実行時にRspecを回して、その結果をGit管理のファイルに出力するよ。
ちょっと複雑かもしれないので時系列にしてみました。
- ファイルを変更
- git commitコマンドを実行
- 自動でbundle exec rspecが実行される
- 実行結果がdocs/rspec_result.mdっていうファイルに出力される
- (4)で出力されたものに差分があればその差分だけが残る
という感じです。
Context/Motivation
- Rspecの実行結果を綺麗にフォーマットしてGit管理したい。
- 絶対にRspecがすべて成功する状態でPR出したい。
- もしRspecに変更があれば、それも差分として表示したい。
- git commit時にこれらを全部自動でやりたい
Get Started!!
pre-commitの登録
まずそもそも、gitにはprecommitっていう機能がついています。
本名的には、git hoolsっていうんですかね?
これを登録すればgit commitコマンド実行時にシェルコマンドを実行してくれます。
今回はこんな感じで登録しました。
$ touch .githooks/pre-commit
#!/bin/sh
echo "Start pre-commitコマンド"
SELF=$$
ls /proc/$SELF/fd/0 -l | grep /dev/pts > /dev/null
if [ $? -eq 0 ]; then
echo "input device is TTY device"
OPTION=-it
else
echo "input device is non TTY"
OPTION=
fi
# rspecの実行結果をファイルに出力
docker compose exec -T rails scripts/output_rspec.sh
$ touch scripts/output_rspec.sh
#!/bin/bash
bundle exec rspec | head -n -4 > docs/rspec_result.md
上記のファイルにある以下のコマンドが重要です。
bundle exec rspec | head -n -4 > docs/rspec_result.md
これは、Rspecを実行し、最後の4行を削除した上で、docs/rspec_result.mdにその内容を上書きするっていうコマンドです。
最後の4行を削除したのは、Rspecの完了までにかかった時間が最後の4行に記載されているからです。
テストに変化がなくても、実行結果は毎回異なります。
その度に差分がGItに反映されるのはイケてないですよね!
必ず実行するコマンド
以下のコマンドはリポジトリで最初の1回だけ必ず実行する必要があります。
githooksを利用できるようにするこまんどです。
# githooksを作動させるために必須なコマンド
git config --local core.hooksPath .githooks
commitしてみる
実際に、Rspecファイルをちょっとだけ変更してcommitしてみるとどうなるでしょう。。。
Locations
POST /locations
ログインしていない場合
ログインページにリダイレクト
ログインしている場合
管理者ではない場合
トップページにリダイレクト
管理者である場合
削除できる
PATCH/PUT /locations/1
ログインしていない場合
タイトルを変更しようとしても変更されない
ログインしている場合
管理者ではない場合
タイトルを変更しようとしても変更されない
管理者である場合
タイトルを変更できる
DELETE /location
ログインしていない場合
ログインページにリダイレクト
ログインしている場合
管理者ではない場合
トップページにリダイレクト
管理者である場合
削除できる
こんな感じの内容でファイルが生成されました。
いい感じですね。
差分が出ていることを確認
では、ちょっとだけテストファイルを修正して、再度commitしてみましょう。
どうなるでしょう。
めちゃくちゃいい感じですね。
編集した箇所だけテストのタイトルが修正されています。
テストを修正したこと(仕様が変わったこと)がはっきりわかりますね。
よくあるご質問
Artisanの活動頻度を教えてください
エンジニアなのですが、Artisanに参加できますか?
wordpressのテーマ作れますか?
Artisanってデザイナー?