#はじめに
RubyMine 2019.3 + Rails6版の記事を新たに作成しました⏩RubyMine 2019.3 でDocker Compose環境でのRails 6アプリのデバッグを試してみた
RubyMine 2019.1では、以下のJetBrainsのブログやオンラインヘルプで紹介されているように、Docker連携が機能アップデートされています。
- How to work with Docker/Docker Compose from RubyMine
- Using Docker as a Remote Interpreter
- リモートインタープリターとしての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"が表示されるので選択し、実行します。
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 で確認中です。