RubyMine (IntelliJ) 2019.3 でDocker Compose環境でのRails 6アプリのデバッグを試してみた

[1]:https://qiita.com/masaruhr/items/f6df4f5ea36a4b9af142
[2]:https://pleiades.io/help/ruby/using-docker-compose-as-a-remote-interpreter.html
[3]:https://github.com/JetBrains/sample_rails_app.git

### 追記(20200614)
公式のYoutube ChannelでRubyMineのDocker Compose環境をセットアップするためのビデオ（英語）が公開されています。
https://blog.jetbrains.com/ruby/2020/06/video-tutorial-rubymine-and-docker-compose/

#はじめに
前回[RubyMine 2019.1.2でdocker compose環境でのRailsアプリのデバッグを試してみた][1]を書いてからしばらくたちました。
RubyMine 2019.3になって久々にRubyMineの公式チュートリアル[リモートインタープリターとしてDocker Composeを使用する][2]試してみたところ、以前と比較して、ハマりどころが適切にガイドされるようになり改善が見られた一方、
- サンプルアプリがRails 6になった
- macOSがCatalinaになった
等の影響で、新たなハマりポイントがありました。（色々報告したところ2019.3リリースの時点より改善されましたが、一部残っている）同じような問題に遭遇するかもしれない方のためにシェアしたいと思います。
#テスト環境
- OS:macOS 10.15.2
- RubyMine: 2019.3.1
- Docker Desktop(for Mac)] 2.1.0.5 Engine:19.03.5 Compose: 1.24.1

#チュートリアル手順
[公式チュートリアル][2]の内容を実行する上で、（私が経験した）ハマりどころと対応策を見ていきます。
以下の内容はチュートリアルを同じですが、手早くデバッグできることを確認したいので、マニュアルとは手順が多少異なっている箇所があります。また、以下のほとんどはRubyMineで試していますが、リモートインタプリタの設定以外はIntelliJ IDEA Ultimateでも同じようにデバッグが可能です。

## RubyMineのセキュリティ登録
**落とし穴**:（すべての環境で設定が必要かは不明ですが）macOS Catalinaから様々なセキュリティが強化されたため、追加設定が必要なケースがあるようです。
具体的には後述するリモートインタープリターの設定を行う際に、設定ダイアログからdocker-composeの情報を取得する際に失敗するという問題がありました。この問題を回避するために以下の設定を行いました。
**対応**:[システム環境設定]-[セキュリティーとプライバシー]-[デベロッパツール]から[+]を押し、プログラムの登録ダイアログを表示します。
<img width="649" alt="スクリーンショット 2019-12-24 2.18.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/8ccdf395-d817-0eed-81c6-c67cf9869b2f.png">

画面右上の検索窓からRubyMineを選択（複数ある場合は一番新しくてファイルサイズの大きいもの）を指定します。RubyMineを起動中の場合、RubyMineを終了させる通知が表示されるので従います。
<img width="794" alt="スクリーンショット 2019-12-24 1.58.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/e5c57979-7447-4ed9-8f44-b689c5dd08eb.png">

## サンプルプロジェクトのダウンロード
Welcome画面から「Check out from Version Control」を選択します。
<img width="489" alt="スクリーンショット 2019-12-24 1.04.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/51c6c3a4-6247-2e0e-a318-73a0bcd7f179.png">
URL欄に[チュートリアル][2]に記載のあるURL[https://github.com/JetBrains/sample_rails_app.git][3]を指定します。
<img width="772" alt="スクリーンショット 2019-12-14 17.18.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/bc0f7899-c75e-7361-41ed-297d1527f0e3.png">

ダウンロードが完了すると、RubyMineは[前回のチュートリアル][1]同様、RubyMineが自動的にローカルのRakeを呼ぼうとしてエラーになるかもしれませんが無視します。
<img width="1004" alt="スクリーンショット 2019-12-14 17.22.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/82dc8fce-9722-5aab-3b51-0816aaf08600.png">

##Gemfileの変更
[チュートリアル][2]の指示通りで問題ありません。ただし、docker-compose buildを後で再度実行したくないので、ここで先に変更しています。
- [shift]x2 でSearch Everywhereをダイアログを呼びだし、
「gemf」と入力し、GemFileを選択し、開き'debase'と'ruby-debug-ide'のコメントを解除します。
<img width="652" alt="スクリーンショット 2019-12-24 1.22.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/17339fd2-70b7-43f9-f44e-52197d3316c3.png">

##config/database.ymlの変更
[チュートリアル][2]の指示通りで問題ありません。
- [shift]x2 でSearch Everywhereをダイアログを呼びだし、
- 「database」と入力し、config/database.ymlを選択し、開きます。
- \#developmentセクションでsqlite３の指定をコメントアウトし、postgresqlの方をコメントを外して有効にします。（コメントアウト・コメント外しの両方とも、範囲選択して[command]+[/]でできます）
<img width="597" alt="スクリーンショット 2019-12-24 1.26.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/b2367f28-629e-d41a-d540-fa51db39304f.png">

##docker-compose upの実行（Railsアプリの起動）
RubyMineで使用するリモートインタープリターを設定するためには、インタープリターが実行されているリモート環境にアクセスする必要があります。Docker ComposeでRailsアプリが含まれる一連のサービスを実行します。
実行方法は[チュートリアル][2]の指示通りで問題ありません。docker-compose.ymlファイルの緑二重矢印をクリックします。
または、RubyMineのターミナルから以下のコマンドを実行します。
- docker-compose up -d
<img width="549" alt="スクリーンショット 2019-12-24 1.50.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/4448e351-a654-5bcd-f6be-20fc9bb1e372.png">

##リモートインタープリターの指定
Docker Composeで実行中のRailsアプリのRubyをリモートインタープリターとして指定します。
[チュートリアル][2]の指示通りで問題ありません。docker composeのエラーが出る場合は、前述の「RubyMineのセキュリティ登録」の設定に問題がある場合があります。
**RubyMineの場合**
- [shift]x2 でSearch Everywhereをダイアログを呼びだし、「Ruby SDK」と入力し
（または、
[RubyMine]-[Preferences..]-[Languages & Frameworks]-[Ruby SDK & Gems]から）
インタープリター設定ダイアログ表示し、[+]ボタンをクリックします。
<img width="614" alt="スクリーンショット 2019-12-14 17.26.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/7e80e751-da23-8d83-3866-07629e287fac.png">
[New remote...]を選択します。
<img width="290" alt="スクリーンショット 2019-12-14 17.27.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/5629e4ec-daa8-54da-0fb1-f2b155378ed7.png">
[Docker Compose]を選択します。[Service]プルダウンから、Railアプリが実行されている[web]を選択します。
<img width="656" alt="スクリーンショット 2019-12-14 17.27.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/98bed60c-b4c1-fc2f-490c-8f8b36dae069.png">
- 新しく追加されたリモートインタープリターを選択します。
<img width="405" alt="スクリーンショット 2019-12-14 17.29.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/60a485dd-c646-6170-b11c-d3631ae2141d.png">
RubyMineがリモートインタープリターのファイル群に対してIndexing処理を開始します。**完了までしばらく時間がかかります。**
<img width="338" alt="スクリーンショット 2019-12-14 17.30.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/9078c597-e048-1496-2589-6e9f0d99f10b.png">

**IntelliJ IDEA + Rubyプラグインの場合**
[File]-[Project Structure...]-[Project Settings]-[Project]のProject SDKの[New...]ボタン、または、
<img width="918" alt="IJ_project_settings.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/8d4da189-efd1-4ce6-64d2-3243cd1ef2a6.png">
[File]-[Project Structure...]-[Project Settings]-[Modules]のRuby SDK and Gemsの[+]ボタンから、リモートインタープリタの指定が可能です。
<img width="1015" alt="IJ_module_settings.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/2ba74e7c-db47-34f0-0d5c-137e34b91a3a.png">


##Railsアプリで使用するDBの初期化（Run AnythingでRakeタスクを簡単実行）
[チュートリアル][2]の（注意書きも含めた）指示通りで問題ありません。
このステップでは、RubyMineの[control]x2（Run Anything機能）を用いてコンテナ上でrakeコマンドを実行します。
リモートインタープリタ設定が正しく終わっていると、
- [control]x2でRun Anythingダイアログを表示します。
- [rake]と入力し、表宇される[rake --tasks]を選択し、実行します。
これにより、以降のrakeコマンドがコンテナに対して実行されるようになります。
<img width="674" alt="スクリーンショット 2019-12-14 17.32.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/25e86a3f-c5ca-edff-53e8-10b413465dff.png">
- [control]x2でRun Anythingダイアログを表示します。
- 「db:c」を入力します
- [rake db:create]を選択します。
<img width="463" alt="スクリーンショット 2019-12-14 17.32.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/0cc46a7e-52a8-7b4f-7d9b-0f5aeb1aac62.png">
- 以下のダイアログが表示されるので[OK]を選択します。
<img width="435" alt="スクリーンショット 2019-12-14 17.33.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/bbd570c6-ba62-0ac2-1f48-e11606be9ee3.png">
- [control]x2でRun Anythingダイアログを表示します。
- 「db:m」を入力します
- [rake db:migrate]を選択します。
<img width="664" alt="スクリーンショット 2019-12-14 17.33.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/5bcd4b2b-39bf-4618-01ca-fd93467b43fe.png">
- 以下のダイアログが表示されるので[OK]を選択します。
<img width="501" alt="スクリーンショット 2019-12-14 17.33.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/e2aa14f3-f3fa-bfe9-2d88-a90664cd755b.png">
以上で、Railsアプリを実行するために必要なDBの準備ができました。

##Railアプリの実行とデバッグ
**落とし穴**:RubyMineでRailsアプリをデバッグ実行した場合、http://localhost:3000 に初回アクセス時にpublic/packsが生成されず、エラーになる
**対応**:
RubyMineでRailsアプリをノーマル実行したあと、デバッグ実行する。

### 実行設定の確認
- 画面上部Run/Debug構成で[Development:<プロジェクト名>]を選択します。
<img width="518" alt="RunConfig.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/e4d06bf9-cf51-2bdf-41f1-df6d6a34e4dc.png">
- docker composeの設定でdocker-compose upが選択されていることを確認します。 
- [OK]をクリックします。
<img width="1076" alt="RunConfigDockerCOmpose.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/19eadb19-89a0-5644-7c7d-5de0e77de46b.png">

### Railsアプリのノーマル実行
このステップは前述の落とし穴を回避するために実行するものです。
- Run(再生）ボタンをクリックし、Railsアプリを実行します。
- ブラウザで http://localhost:3000 にアクセスします。
<img width="593" alt="RunDevelopmenet.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/12b45d29-8824-1733-5047-86074493d796.png">
- 表示まで暫く時間がかかるかもしれません。画面下部のRunツールウィンドウWebpackerが実行されているのが確認できます。
<img width="943" alt="WebpackerCompiling.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/f8806b55-8706-0a79-cbbb-d1818435c12a.png">
- ブラウザで以下の画面が表示され、Railsアプリが起動できていることを確認します。
<img width="1071" alt="SampleAppRunning.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/1c486b2c-df3b-88f9-9f0e-d31ccb571191.png">

### Railsアプリのデバッグ実行
[チュートリアル][2]の指示通りで問題ありません。同じようにブレークポイントを設定し、デバッグ実行します。
- [shift]x2 でSearch Everywhereをダイアログを呼びだし、[uc]と入力し[users_controller.rb]を選択します。
<img width="691" alt="findUserController.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/6cad07b1-9ca8-117d-93b6-cee22966de44.png">
- createメソッドにbreakpointをセットします。
<img width="1087" alt="setbreakpoint.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/4435dfdb-7751-bca4-65db-637cee2c1f6a.png">
- 虫のアイコンでデバッグ実行を開始します。
<img width="665" alt="RunDebug.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/63e11002-de9f-c92f-06ec-7a01ff8a3813.png">
- 以下のようなダイアログが表示されるので[Stop and Rerun]を選択します
<img width="425" alt="DebugConfirm.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/5526c829-fe48-3435-8718-ef155dda8732.png">
- http://localhost:3000 にアクセスします。[Sign up now]ボタンをクリックしすると、Sign up画面が表示されます。適当に情報を入力し[Create my account]ボタンをクリックします。
<img width="805" alt="signup.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/377cb9b7-6c45-3cd4-1290-afbb0b0d65d1.png">
- RubyMineのブレークポイントで止まれば成功です🎉
<img width="1355" alt="breakpoint.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/d10c0488-f85f-4fb7-c4a2-28a56acfe097.png">

#まとめ
RubyMine 2019.3でDocker Compose環境でRails6アプリのデバッグを行う[チュートリアル][2]をmacOSで試しながら、自分がハマったポイントを紹介しました。
##結局Docker Compose環境でデバッグするために何が必要なのか？
チュートリアルの手順はそれなりに長いのですが、この文書を書いている現在（２０１９年１２月２４日）においては、[チュートリアル][2]では結局何が必要なの明示的には言及されていないと思います。
私の理解では、必要なことは
- デバッグ用Gemのリモート（コンテナ）環境へのインストール
- Docker Compose用リモートインタープリターの設定
かと思います。それ以外はローカルにインストールされたRuby/Railsアプリと同じような手順でデバッグ開始可能なようです。
一方で、
- 本記事で紹介したmacOS環境におけるセキュリティ設定、デバッグ実行だとWebpackerが実行されない
- Docker Composeのvolumeの設定とyarn installやbundle install、docker-compose buildが実行されるタイミングを気にしないと、思ったとおりに設定されない状態に陥りやすい
がハマリポイントになる可能性があると思います。ご自身のRailsアプリでnodeやgemのインストールがうまく行かない場合は、チュートリアルが動作するかを確認してみたり、チュートリアルに含まれるDockerfileやdocoker-compose.ymlをご自身の環境と比較してみたり、[Services]ツールウィンドウからコンテナのFilesを確認してみると、コンテナ起動時に何が起きるか把握できてトラブルシューティングに役立つと思います。
<img width="1077" alt="docker_files.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/743b77c7-f043-c3ea-49ee-ec7e453146ad.png">