LoginSignup
1
0

More than 1 year has passed since last update.

ローカルで通るRSpecがCircleCI上でフリーズしタイムアウトする(Docker環境)

Last updated at Posted at 2021-06-19

はじめに

右も左もわからない未経験エンジニアが書く初めての投稿です。
今後も膨大な勉強量の中で、気になったことや発見などを書いていこうと思います。

今回の記事は根本的な解決には至ってはおりませんが、
同じ問題に阻まれた方の助けになればと思い、メモを残しておきます。
間違いやこうした方が良いなどのご指摘も頂けると嬉しいです!

開発環境

ruby 2.5.1
Rails 5.2.4.5
Docker version 20.10.6
RSpec 3.10

アプリの目的はsolidusを使用したECサイト作成の勉強です。
開発環境はDockerで整え、CircleCIでテスト後、HEROKUデプロイする流れです。
AWS S3とも連携してあります。

問題点

ローカルでは問題なく通るrspecがgit push後に通るCircleCIでフリーズ(?)し、タイムアウトしてしまう事態が発生。

問題が発生するのは rspecのSetup database

circleci/config.yml
 - run:
     name: Setup database
     command: |
       docker-compose exec [ディレクトリ名] bash -c 'yes n | bundle exec rails g spree:install --migrate --seed --sample --auto_accept'

スクリーンショット 2021-06-17 12.39.18.png
フリーズする[WARNING]の所までは1分もかからず到達します、
なお、[WARNING]の内容は本件と関係ないと考えております(次のメジャーリリースへ向けてMoney.rounding_modeを変更してくれとの指示であり、様々なサイトでこれが表示されていてもテストが通っているため)
また、Too long with no output (exceeded 20m0s)になっていますが「もしかしたらただ単に処理の時間がかかりすぎているだけかも。。。」という淡い期待の産物ですのでスルーしてください。


〜補足〜

circleci/config.yml
 - run:
     name: Setup database
     command: |
       docker-compose exec [ディレクトリ名] bash -c 'yes n | bundle exec rails g spree:install --migrate --seed --sample --auto_accept'
     no_output_timeout: 20m

と書き加えるとタイムアウト設定を変更出来ます。


原因

config/environments/development.rb
config.cache_classes = false
(アプリケーションのクラスやモジュールをリクエストごとに再読み込みするか(=キャッシュしないかどうか)どうかを指定
)
config.reload_classes_only_on_change = false
(監視しているファイルが変更された場合にのみクラスを再読み込みするかどうかを指定)

を記述した。
(config.cache_classes = false はdevelopmentモードではデフォルトなので実際に記述する必要はないと思いますが、今回の原因として考えられる要因のため記述しております)

参考にさせて頂いたサイト

なぜ原因のコードを記述したか

アプリ開発していてコントローラーの可読性が悪くなって来たので、models配下にdecoratorファイルを作成
module_evalにてscopeで変数の定義をした所、decoratorファイルと、関連するコントローラの内容の変更が反映されなくなった。
反映させるためにはDockerコンテナの再起動が必要で、かなり手間が掛かるので何とかしたい
その解決方法の一つとして色んなサイトで原因のコードが紹介されていたので試してみました。

なぜ原因だと判断したか

問題が発生する前と発生時のファイル差違を確認し、上記コードに目星を付けました。
問題が発生するブランチの上記コード二点を削除し git push した所、CircleCI上でも問題なくテストが通ったことからこの問題の原因と特定しました。

原因を排除した結果

スクリーンショット 2021-06-19 16.01.51.png

原因排除前は21m11sでタイムアウトしていましたが、排除後は1m9sでクリアしています。

解決策

原因のコードは使わず

config/environments/development.rb
#config.file_watcher = ActiveSupport::EventedFileUpdateCheckerを以下に変更
config.file_watcher = ActiveSupport::FileUpdateChecker

に変更することでDockerコンテナの再起動が必要なくなりました

Docker環境では

volumeで共有ファイルとしてホスト側のディレクトリを仮想環境にマウントしており、この方式だと変更イベントが発生しないようです。故にファイルの変更を検知することができず、コンテナを再起動しないとソースコードの変更がされないという事態になります。

と勉強させて頂きました。ありがとうございます!

参考にさせて頂いたサイト

残る疑問点

以下内容に関しては順次、解決次第追記していきます。
もしご教授頂けるのであればとても嬉しいです!
解決しない場合は改めて質問へ投稿させて頂こうと考えております。

  1. なぜ原因のコードを記述するとフリーズしてしまうのか

最後に

勉強を始めたばかりで知識もなく、拙い文章ですがアウトプットすることで頭の中を整理しつつ、どなたかのお役に立てれば良いなと思い投稿させて頂きました。
最後まで見て頂きありがとうございました!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0