RubyMine 2019.1.2でdocker compose環境でのRailsアプリのデバッグを試してみた


はじめに

RubyMine 2019.3 + Rails6版の記事を新たに作成しました⏩RubyMine 2019.3 でDocker Compose環境でのRails 6アプリのデバッグを試してみた

RubyMine 2019.1では、以下のJetBrainsのブログやオンラインヘルプで紹介されているように、Docker連携が機能アップデートされています。

  1. How to work with Docker/Docker Compose from RubyMine
  2. Using Docker as a Remote Interpreter
  3. リモートインタープリターとしてのDockerの使用

本記事では、上記ドキュメンテーションを参考にしながら、Docker Composeで起動するサンプルRailsアプリをデバッグするための設定および、実際にブレークポイントでプログラムが停止するまでの手順を紹介します(ほとんどオンラインヘルプと同じですが)。加えて、(私が試したところ)記載通り実行してもうまく行かなかった箇所の回避方法😅も紹介します。

ちなみにRubyMineもRailsもRubyKaigiをキッカケに触り始めたばかりですので、改善のためのコメント等大歓迎です。

テスト環境

  • OS: macOS 10.13.6
  • RubyMine: 2019.1.2
  • Docker Desktop(for Mac): Version 2.0.0.3

手順

サンプルプロジェクトのダウンロード

Welcome画面から「Check out from Version Control」を選択します。

Clone Repositoryのダイアログで*1の記事にある以下のURLを指定し、Cloneボタンをクリックし、Dockerfileを含むサンプルコードをgit cloneします。
https://bitbucket.org/rubyminedoc/sample_rails_app_docker/

ダウンロードが完了すると、ローカルのrakeコマンドが勝手に実行されてErrorが出ますが、無視します。

docker composeのためのdatabase.yml変更

*2の手順に従い、config/database.ymlを開き、development構成で使用するdatabaseをsqliteからPostgreSQLに変更します。

[省略可]2019.1のexperimental featureの有効化

*1のブログにはexperimental featureを有効にすることが紹介されていましたが、オンラインヘルプでは記載がありません。詳細はIssueで確認中ですが、とりあえず設定しなくても動作するようです。

ruby.docker.internal.via.execにチェックを入れ、OKボタンをクリックします。

docker-compose upの実行&リモートインタープリタ設定

docker-compose.ymlを開き、2行目のservicesの左にある「緑色の早送りみたいなアイコン」をクリックし、docker-compose upを実行します。

webコンテナをstopします。

stopしたことを確認します。

Settings/Preferences dialog (⌘,)ダイアログから、 Languages & Frameworks | Ruby SDK and Gems を選択し、+ボタンから「New remote」を選択し、Docker Compose環境のRubyインタプリタを指定します。

「Docker compose」を選択し、Servicesには「web」を指定し、OKボタンをクリックします。

成功すると、docker-composeのRemoteインタプリタが表示されるので、選択し、OKボタンをクリックします。

この画面が出ずにフリーズしてしまう場合、OSのターミナルからdocker-composeコマンドを実行すると問題を回避できることがあるようです。
プロジェクトディレクトリに移動し以下を実行:

$docker-compose stop
$docker-compose up db

RubyMineからのdb:createとdb:migrateの実行

Docker上のRailsアプリに対するdb:createおよびdb:migrateの実行については、*2には以下のように書かれていました、私の環境ではcontrol*2(Run Anything)の場合、そのままでは、rakeコマンドとして認識されないようで、動作しませんでした。

Before debugging our Rails application, we need to create the database. To do this in RubyMine, press Ctrl twice and type db:create. Select rake db:create in the dropdown and press Enter. Leave the default settings in the invoked Execute 'db:create' dialog and click OK.

Finally, to migrate the database, press Ctrl twice, type db:migrate, select db:migrate in the dropdown and press Enter. Click OK in the invoked dialog.

代わりの方法として以下を実行しました。
まず、実行構成に「Development:sample_rails_app_docker」を指定します。

メニュー Tools | Run Rake Tasks を実行し、「Reload Rake Tasks」を選択します。

そうするとRubyMineがRake Tasksを認識できるようになるようですので、再度
メニュー Tools | Run Rake Tasks を実行し、「Rake Tasks」 または Find Action(Shift + command +A)から Rake と入力します。

「Rake Tasks」を実行した場合、メニューをたどり「db」「create」を選択します。これで「db:create」コマンドを実行したことと同等になります。

同様にメニューをたどり「db」「migrate」を選択します。これで「db:migrate」コマンドを実行したことと同等になります。

ちなみに、一旦コマンドを実行後はRun Anything(control*2)からも、db:migrateコマンドは実行できるようになりました。おそらく、Docker環境の場合、Rakeコマンドがプロジェクトのロード後は解決できないので、なんらかのトリガーがないとRakeコマンドを認識できないようです。

サンプルRailsアプリの実行確認

実行構成を「Development:sample_rails_app_docker」にします。

緑色の▶ボタンをクリックし、サンプルRailsアプリを実行します。

http://localhost:3000 にアクセスし、以下の画面が表示されることを確認します。

確認できたら、赤色の■ボタンからRailsアプリを停止します。

デバッグに必要なgemのインストールとデバッグ実行

Gemfileを開いて、以下の行の#を取り除き、有効化します。

# gem 'debase'
# gem 'ruby-debug-ide'

黄色の電球アイコンが表示され、クリックする(またはoption+Enter)と"Install missing gems using 'bundler' gem"が表示されるので選択し、実行します。

bundle installの実行が完了するのを待ちます。

users_controller.rbを開いてbreakpointをセットします(23行目の赤い丸)。

画面上部、緑色の虫のアイコンからデバッグを開始します。

が、以下のエラーが表示されてうまくいかないようです。Gemfile上は問題ないように見えますが、私の設定ミスか、何らかの理由でうまく動作しない(動的に適用できない?)のかもしれません。

ということで、(以前から有効な方法として)RubyMineのターミナルからdocker-compose buildを実行します。

再度、画面上部、緑色の虫のアイコンからデバッグを開始します。今度はうまく起動しました。

http://localhost:3000 にアクセスし”Sign Up Now"画面に移動して、適当にUser ID、メールアドレス、パスワードを入力します。

今度はブレークポイントで止まりました🎉

まとめ

RubyMineのオンラインヘルプに従い、docker compose環境でRailsサンプルアプリのデバッグを試してみました。
- control*2 からの Rake db:xxx の実行
- Debug用Gemインストールの有効化
ではドキュメント通りだとうまくいかないところがありましたが、別の方法で回避することが出来、無事ブレークポイントで止まることを確認できました。

デバッグのために、必要になる手順は
- Ruby SDKの設定 Docker composeを選択し、Railsアプリが実行されるserviceで、Remote Interpreterを選択
- RailsアプリがRubyMineから実行できることを確認
- Debugに必要なGemのInstall
- docker-compose build (*公式ドキュメントが正しいならば、本来は不要なはず。。。)
- BreakPointを貼って、RailsアプリをRubyMineでデバッグ実行
という感じでしょうか。

なお、つまずいた点については https://youtrack.jetbrains.com/issue/RUBY-24275 で確認中です。