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

#はじめに

**RubyMine 2019.3 + Rails6版の記事を新たに作成しました⏩[RubyMine 2019.3 でDocker Compose環境でのRails 6アプリのデバッグを試してみた](https://qiita.com/masaruhr/items/17296c49f43b140cb81a)**


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

1. [How to work with Docker/Docker Compose from RubyMine](https://blog.jetbrains.com/ruby/2019/03/rubymine-docker/)
2. [Using Docker as a Remote Interpreter](https://www.jetbrains.com/help/ruby/using-docker-as-a-remote-interpreter.html)
3. [リモートインタープリターとしてのDockerの使用](https://pleiades.io/help/ruby/using-docker-as-a-remote-interpreter.html)

本記事では、上記ドキュメンテーションを参考にしながら、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」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/358b6553-21e8-1643-5a19-ac68bf9eef19.png)

Clone Repositoryのダイアログで[*1](https://blog.jetbrains.com/ruby/2019/03/rubymine-docker/)の記事にある以下のURLを指定し、Cloneボタンをクリックし、Dockerfileを含むサンプルコードをgit cloneします。
https://bitbucket.org/rubyminedoc/sample_rails_app_docker/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/9d0668b2-e63c-b1c2-b2e1-6c6506befa8e.png)

ダウンロードが完了すると、ローカルのrakeコマンドが勝手に実行されてErrorが出ますが、無視します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/63c86fb4-f6c8-328b-fd72-62e01d00f862.png)


##docker composeのためのdatabase.yml変更
 [*2](https://www.jetbrains.com/help/ruby/using-docker-as-a-remote-interpreter.html#use_docker_compose)の手順に従い、config/database.ymlを開き、development構成で使用するdatabaseをsqliteからPostgreSQLに変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/3df2b819-60e2-04aa-0b52-50d8d3f1ae54.png)

##［省略可]2019.1のexperimental featureの有効化
[*1](https://blog.jetbrains.com/ruby/2019/03/rubymine-docker/)のブログにはexperimental featureを有効にすることが紹介されていましたが、オンラインヘルプでは記載がありません。詳細はIssueで確認中ですが、とりあえず設定しなくても動作するようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/eba74400-189b-d8af-1090-96f2548d27ec.png)
ruby.docker.internal.via.execにチェックを入れ、OKボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/91157b62-66a2-ac6f-280e-00975d472e46.png)

##docker-compose upの実行&リモートインタープリタ設定
docker-compose.ymlを開き、２行目のservicesの左にある「緑色の早送りみたいなアイコン」をクリックし、docker-compose upを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/923a18b0-8b99-b3be-b68f-cbd126be5001.png)
webコンテナをstopします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/88459350-a102-25db-2d77-04e12a7cff92.png)
stopしたことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/85fd1d21-bdb7-ca59-57ac-e72c19331910.png)

 Settings/Preferences dialog (⌘,)ダイアログから、 Languages & Frameworks | Ruby SDK and Gems を選択し、＋ボタンから「New remote」を選択し、Docker Compose環境のRubyインタプリタを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/2026dd22-ee6e-ab44-903b-610e73b95ce6.png)
「Docker compose」を選択し、Servicesには「web」を指定し、OKボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/484e804e-d478-29a7-1030-91e3e95bd0c1.png)
成功すると、docker-composeのRemoteインタプリタが表示されるので、選択し、OKボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/6187bf30-44d9-5384-8b13-6801eae718ab.png)

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

```
$docker-compose stop
$docker-compose up db
```


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

Docker上のRailsアプリに対するdb:createおよびdb:migrateの実行については、[*2](https://www.jetbrains.com/help/ruby/using-docker-as-a-remote-interpreter.html#set_compose_remote_interpreter)には以下のように書かれていました、私の環境では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」を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/f6422411-d2b7-8c96-1119-4f9fa818912a.png)

メニュー Tools | Run Rake Tasks を実行し、「Reload Rake Tasks」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/e8ea4111-333a-9102-b698-bc33fd6fdb2c.png)

そうするとRubyMineがRake Tasksを認識できるようになるようですので、再度
メニュー Tools | Run Rake Tasks を実行し、「Rake Tasks」　または Find Action(Shift + command +A)から Rake と入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/39ef93e2-2414-7be6-de2a-361d4ac804a5.png)

「Rake Tasks」を実行した場合、メニューをたどり「db」「create」を選択します。これで「db:create」コマンドを実行したことと同等になります。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/c34ba1cc-64de-d5ae-60dd-39f1d17baea7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/fcdc18e8-78d3-c152-a40d-004b6971f8a8.png)

同様にメニューをたどり「db」「migrate」を選択します。これで「db:migrate」コマンドを実行したことと同等になります。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/79a7f6b4-d7d3-9186-6c0e-8f301fa6331f.png)
ちなみに、一旦コマンドを実行後はRun Anything(control*2)からも、db:migrateコマンドは実行できるようになりました。おそらく、Docker環境の場合、Rakeコマンドがプロジェクトのロード後は解決できないので、なんらかのトリガーがないとRakeコマンドを認識できないようです。

##サンプルRailsアプリの実行確認
実行構成を「Development:sample_rails_app_docker」にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/e1eacbaa-75fa-e2d3-7efe-f82249fcbfd2.png)

緑色の▶ボタンをクリックし、サンプルRailsアプリを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/cc66b4f8-b600-4d75-55b3-71612b78c577.png)
http://localhost:3000 にアクセスし、以下の画面が表示されることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/84298551-c05b-aeb5-e029-8035f7033d4e.png)
確認できたら、赤色の■ボタンからRailsアプリを停止します。

##デバッグに必要なgemのインストールとデバッグ実行
Gemfileを開いて、以下の行の#を取り除き、有効化します。

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

黄色の電球アイコンが表示され、クリックする(またはoption+Enter)と"Install missing gems using 'bundler' gem"が表示されるので選択し、実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/660d54d0-59ca-5e2a-088f-08e69f58cb55.png)

bundle installの実行が完了するのを待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/90aa6f34-b4dc-fdb8-5e3a-b7bb56ea9acc.png)

users_controller.rbを開いてbreakpointをセットします（２３行目の赤い丸）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/7fa2630e-2cc5-15a9-82e3-8f7b9e9451d9.png)


画面上部、緑色の虫のアイコンからデバッグを開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/d74a6b68-861d-6aba-f1d4-5c0b887b4c1c.png)

が、以下のエラーが表示されてうまくいかないようです。Gemfile上は問題ないように見えますが、私の設定ミスか、何らかの理由でうまく動作しない（動的に適用できない？）のかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/af61ed53-4871-9ef3-b8dc-b8045737c693.png)

ということで、（以前から有効な方法として）RubyMineのターミナルからdocker-compose buildを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/1de34fef-9a25-2a33-443b-cf1671ade213.png)

再度、画面上部、緑色の虫のアイコンからデバッグを開始します。今度はうまく起動しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/d83d290a-bfba-512b-42a2-d0eefb6e9d3b.png)

http://localhost:3000 にアクセスし”Sign Up Now"画面に移動して、適当にUser ID、メールアドレス、パスワードを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/4a0c98d5-ac37-c922-b619-5872ad55751d.png)

今度はブレークポイントで止まりました🎉
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22747/1fe92289-c1b5-3926-6421-b2f73f1faf6a.png)

#まとめ
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 で確認中です。