RubyMine + Docker でデバッガーが使えなくなった時に行なったこと


状況

RubyMine + Docker でデバッグモードを起動しようとしたら
「Cannot start debugger. Gem 'ruby-ide-debug' isn't installed」と表示される。

環境

RubyMine 2019.3.3
Docker desktop 2.2.0.3
macOS Mojave 10.14.6

Ruby 2.6.3
Rails 5.2.3
bundler 2.0.1

ここではDocker環境やRubyMineのリモートデバッグの環境構築方法は述べない。
(リクエストがあれば書こうかな)

原因

RubyMineのどこかのバージョンから ruby-debug-ide のバージョン0.7.0以上でないと動作しなくなった模様。

Gemfileでruby-debug-ideのバージョンを指定しないと0.6.1がインストールされる。

簡易な対応

基本的にはruby-debug-ideのバージョン0.7.0以上にするだけで良いはず。

Gemfile修正

Gemfile
gem 'ruby-debug-ide', '~> 0.7.0'
gem 'debase', '~> 0.2.4'

Docker上でbundle installを実行

それぞれのDocker環境に適した方法でbundle installを実行する。
私の環境ではdocker-compose実行時にbundle installが実行されるようになっている。

RubyMine Preference > Language&Framework > Ruby SDK and Gems

Remote SDK の設定で ruby-debug-ide が 0.7.0 であることを確認する。
「↓」ボタンを押してGemfileをローカル環境にダウンロードする。
RubyMine内のIndex再作成が終わるまで待つ。

デバッグモードでサーバーを起動する

これで起動すればラッキー。

面倒な対応

基本的にはruby-debug-ideのバージョン0.7.0以上にするだけで良いのだが、試行錯誤などによって環境がおかしくなってしまっていることがある。その場合諸々の環境をリセットする必要がある。

Dockerイメージ全消し

イメージを消さなくても bundle install が動いてイメージが更新されれば問題ないのだが、キャッシュなどによってイメージが更新されないことがある。その場合はイメージを消す。

RubyMineのアンインストール

Gemなどのキャッシュや設定が残るのでそれらもキレイに消去する。

Jetbrain社のアンインストール手順はこちら
https://pleiades.io/help/ruby/uninstall.html?section=macOS

~/Library/CachesとPreferencesにあるRubyMine2019.3を消す。

プロジェクトフォルダにある .idea フォルダを消す。隠しフォルダ。
(カスタマイズ設定が消えてしまうのは辛いが、リセットする場合は必要)

vendorフォルダの下

もしプロジェクトフォルダの下のvendorフォルダ以下にbundleフォルダがあれば消す。

Dockerを使った開発環境では「bundle install」によってGemがインストールされるのはDockerコンテナーの中なのでプロジェクトフォルダのvendor/bundleフォルダにはGemはインストールされない。しかし、vendor/bundleフォルダにGemがあると何かの拍子にRubyMineがそこを参照することがあるので消しておく。

bundlerのバージョン

Docker内のbundlerのバージョンを2.0.xにする。
bundlerのバージョンが2.1.xの場合、Remote SDKのGemファイル一覧が正しく表示されない。
もしかするとDocker内のbundlerのバージョンとローカルのbundlerのバージョンの差異によるものかもしれないが未確認。

Mac再起動

RubyMineの再起動だけではうまく認識されないことがある。
作業中はマメにMacを再起動した方が良さそう。

簡易な対応

前述の簡易な対応を行う。

P.S.

RubyMine + Docker のデバッグ環境についての情報が少なくて苦労したが、調べていく中でRubyMineの凄さを知れた。
Dockerコンテナ内のRailsサーバーをデバッグするには、通常であればデバッグ用のポートを開けてrails-debug-ideを起動するという記述をDockerFileにしておいて、さらにIDEからはそのポートに対してデバッガーをアタッチするようにしなければならない。
しかし、RubyMineは起動中のイメージを元にデバッグ用のポートを開けてrails-debug-ideを起動し、そのポートに対してデバッガーをアタッチするところまでやってくれる。RubyMineのtmpフォルダに自動生成されdocker-composeファイルを見ることができる。