ブログ

読んで思い出す。忘れるために書く

Docker 環境の Rails プロジェクトで RSpec を監視・実行する (fswatch)

Docker 環境であっても コンテナが気軽に増設できるなら guard-rspec を立ち上げてもいい

今回は ShellScript で何とかするパターン

ゴール

  1. docker compose up で立ち上げたコンテナ内で、rspec を実行したい
  2. ローカル環境で *_spec.rb ファイルを更新したら、そのテストを実行したい

ShellScript を書く

watch_rspec.sh, rspec.sh の2ファイルを用意

#!/bin/sh

# file: watch_rspec.sh

fswatch -0 -e ".*" -i "\.rb$" --event=Created spec | while read -d "" path; do
  clear
  ./rspec.sh $path
done
#!/bin/sh

# file: rspec.sh

set -e
target=$(echo $1 | awk -F 'my_project_root_dir/' '{print $2}')
container=app
echo $target

docker compose exec -e RAILS_ENV=test $container bundle e rspec $target

メモ

fswatch

  • -0 でヌル文字区切りでファイルパスを渡す
  • --event=Created で「ファイルが作成された」ものを絞り込んで検出する
  • -e ".*" で一旦すべてのファイルを監視対象から除外
  • -i "\.rb"Ruby ファイルのみを監視対象にする

rspec.sh

  • fswatch から渡されるファイルパスは ローカル環境のフルパスなので... awk で加工して、プロジェクトディレクトリ以降のパスを渡す

docker compose exec に渡すときにコンテナ内のファイルパス指定と等価になる

Links