2024-09-20

commit時にRspecを回す

Overview

git commit コマンド実行時にRspecを回して、その結果をGit管理のファイルに出力するよ。

ちょっと複雑かもしれないので時系列にしてみました。

  1. ファイルを変更
  2. git commitコマンドを実行
  3. 自動でbundle exec rspecが実行される
  4. 実行結果がdocs/rspec_result.mdっていうファイルに出力される
  5. (4)で出力されたものに差分があればその差分だけが残る

という感じです。

Context/Motivation

  1. Rspecの実行結果を綺麗にフォーマットしてGit管理したい。
  2. 絶対にRspecがすべて成功する状態でPR出したい。
  3. もしRspecに変更があれば、それも差分として表示したい。
  4. 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は基本的に1ヶ月に1回、2時間程度開催しています。そこでは、ブログのアイディアやサイトの改修を行なっています。 参加は強制ではないので、ご安心ください。そのとき暇なメンバーがフラッと参加する感じです。

エンジニアなのですが、Artisanに参加できますか?

Artisanは利益組織ではありませんので、給与はでず、有志の集団です。 趣味程度の活動です。 興味がありましたら、インスタグラムよりご相談くださいませ。 現在だと、ウェブデザイナーさんやフロントエンドのエンジニアさんにきていただけると、非常にありがたいです。

wordpressのテーマ作れますか?

ワードプレスのテーマ開発は得意なメンバーがいます。 実際にwordpressでサイト制作を請け負う際は、全てオリジナルテーマを作っております。 また、一般用にwordpressテーマ自体を販売もしております。

Artisanってデザイナー?

どちらかというと、エンジニです。 ウェブデザインやグラフィックも多少やりますが、メインはウェブ開発者ですね。

Wordpressテーマ販売中