puma-devで動いているRailsアプリをRubyMineでデバッグする3つの方法と最適解

# 前置き
RubyMine入門したての @rakudalms です。
定義ジャンプが強力過ぎてもうRubyMine無しでは開発したくないほどに惚れ込んでおりますｗ

さて本題ですがIntelliJ系IDEをお使いの皆さん **`puma-dev` 環境でのデバッグどうしてますか？**

色々な記事を参考にしたり先輩に聞いたりして3つの方法を検証しましたので共有させていただきます。

:::note info
RubyMineでの検証しかしていませんが他のIntelliJ系IDEでも方法1と方法3は参考になると思いますたぶん。
:::
### 対象読者
`puma-dev` のサーバー起動を自動起動設定（Railsアプリのシンボリックリンクを貼るやり方）にしているけどデバッグってどうやんの？て方。

### 環境
MacBook Pro 14インチ, 2021(M1)
mac OS 13.3.1 (Ventura）
RubyMine 2022.3.2

# 先に結論！
結論から言うと、余計な設定が全くいらない**方法3が個人的には最適解**なんじゃないかなと思ってます。
ただ個々人の環境によって違うとは思うのでそれぞれ試してみて1番しっくりくるものを選んで頂けたらと思います。


# 解説
ここからは各方法の解説をしていきます。

### 方法1. RubyMineの `Attach to Process` で `puma-dev` のプロセスに直接アタッチ
この方法や `puma-dev` に関しては @jnchito さんが超わかりやすい記事を公開してくれています。
（いつも分かりやすい記事感謝です🙏）

https://qiita.com/jnchito/items/338bc2d7fed1ed981243

以下冒頭引用
> RubyMine 2016.3から、ローカルで動いているRubyプロセスにアタッチしてデバッグ実行できる機能が追加されました。
これにより、PowやPuma-devで動いているRailsアプリに対してもRubyMineからアタッチしてデバッグ実行することができます。


とある通り `Run` > `Attach to Process` で起動中の `puma-dev` プロセスに直接アタッチできます。
![CleanShot 2023-03-08 at 23.43.57 attach to process.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542581/ec4d70cc-5d75-4ab6-855a-06b7d3bcbcb5.jpeg)
ただ @jnchito さんも書いてるのですが、アタッチまでにクセがありうまく繋げないことも。

使いこなせる方はRubyMine標準となった機能ですしこれが1番良さそうな気がします。

私の場合は成功率が低かったので更に他の方法を検証していきます。

### 方法2． Railsアプリ上で自作Debuggerを起動させてRubymineの `Ruby remote debug` を実行
次に @rakuma_devrel さんの以下の記事を参考にして試してみた結果です。

https://qiita.com/rakuma_devrel/items/041a6ba44a513ec4a1ef

正しいやり方・お作法かは置いておいて私のやった手順を紹介します。

#### 1） デバッグ用のgemをインストール
@rakuma_devrel さんの記事ではgemをローカルインストールしてましたがとりあえず私はGemfileに記載
```ruby:Gemfile
gem 'ruby-debug-ide'
gem 'debase-ruby_core_source'
gem 'debase'
```
その後 `bundle install`
```bash:terminal
$ bundle install
```

#### 2） Rails起動で必ず実行されるRubyファイルにDebuggerコードを仕込む
私の場合は、 `config/initializers` 配下に `remote_debugger.rb` を作ってその中にコードを書きました。
Rails起動で必ず実行されるファイルであれば何でもOKです（極端な話、`application_controller.rb`とかに仕込むとかでも。一応試し済）
```ruby:config/initializers/remote_debugger.rb
ruby_home = `which ruby`.strip.split('/')[0..-3].join('/')
debase_path = Dir[ruby_home + '/lib/ruby/gems/*/gems/debase-0*'][-1]
debug_ide_path = Dir[ruby_home + '/lib/ruby/gems/*/gems/ruby-debug-ide-0*'][-1]

$LOAD_PATH.push(debase_path + '/lib')
          .push(debug_ide_path + '/lib')

require 'ruby-debug-ide'

begin
  TCPSocket.new('127.0.0.1', 1235).close
rescue Errno::ECONNREFUSED => e
  Debugger.start_server nil, 1235
else
  p 'Debugger.start_server failed. port is already in use'
end
```
上記の `1235` がこのDebuggerのポート番号です。ユニークであれば任意の番号でOK。後ほど使います。

#### 3） Rubymineで `Ruby remote debug` のConfigurationを作成

`Run` > `Edit Configuration` を開き、
![CleanShot 2023-03-08 at 23.43.57.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542581/8b2aeb0a-41d2-6621-8001-967151854629.jpeg)

左上の `+` ボタン押下 > `Ruby remote debug` を選択
![CleanShot 2023-03-08 at 23.44.48.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542581/8d5c2038-1be1-8e3f-e309-2b600fe37b12.jpeg)

下記のように設定
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3534323538312f61306432313438382d613130632d386666302d316466362d6237663266373063343362372e6a706567.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542581/833e1579-0279-4f46-c847-e61231a078cf.jpeg)


#### 4） `puma-dev` サーバーの再起動
```bash:terminal
$ puma-dev -stop
```


#### 5） `RubyMine` の `remote debugger` を起動
Rubymine の `Run` > `Debug 'remote debugger'`(3で作ったやつ）を実行
Debug Tool Window の `Variables` に `Connected` と表示されていたら接続成功です。


接続時のクセもなく成功率100%でデバッグ可能です。

ただ、gemをインストールする必要があったり、デバッグコードを仕込んだりする必要があるのが難点だと思います。

もう少し他の方法がないか社内MTGの後半で先輩エンジニアに質問。

これで下記の個人的最適解にたどり着きました。

### 方法3. 　【個人的最適解】 `puma-dev` をプロキシモードで起動するようにする
この方法だと、方法2のようにファイルも汚さないし、 `rails s` でサーバー起動するだけで簡単にデバッグ出来るようになるのでかなり良さそう。

手順は以下の通り
#### 1） `puma-dev` の設定を[プロキシモード](https://github.com/puma/puma-dev#proxy-support)での起動に変更する
```bash:terminal
# .puma-devディレクトリに移動
$ cd ~/.puma-dev

# シンボリックを解除
$ unlink MY_APP

# `rails s` のポート番号が書いてあるだけのファイルを作成
$ touch MY_APP; echo 3001 >> My_APP
```
※ `MY_APP` は自分のRailsアプリ名(リポジトリ名)に置き換えてください
※ `3001` の部分は `rails s` 時のサーバーのポート番号なので自身の環境でお好みに

これで `puma-dev` のサーバー起動設定がプロキシモードになりました。


#### 2） RubyMineで起動するサーバーのポート番号を変更
`rails s` のポートをデフォルト(3000)以外にしている場合はRubymine上のサーバーのポート設定も変更します

`Run` > `Edit Configuration` > `Rails` > `rails server` > `Port:`
![CleanShot 2023-03-09 at 10.04.42.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542581/1ccb3a26-c187-bcef-9838-e234a9d3b6bf.jpeg)
※ `rails server` は自身の環境により名前が違いますたぶん(Rubymine で最初にプロジェクトを開いたらデフォルトで作成される？やつです)


#### 3) RubyMineでサーバー起動
後は Rubymine 上で `Run` > `rails server` を起動（ショートカット設定しとくと楽）

なんともうこれでデバッグできる状態になってます。
ブレークポイント貼って好きなだけデバッグしましょう！

すごくないですか？たったこれだけです！超簡単！！

まとめると
- 接続のクセなし（100%繋がります）
- プロジェクト上にファイルを増やす必要なし
- 新たにgemをインストールする必要なし
- RubyMine上に余計なConfigurationを作る必要なし

ようするに **`puma-dev` を使ってない状態と全く同じようにデバッグ出来る**のです！！！

以上の理由から今回のデバッグ方法模索の旅は終了、方法3を私の中での最適解とさせていただきます。

# 補足
本編であまり触れてなかった `puma-dev` のサーバー起動モードについての補足をしておきます。

`puma-dev` の起動モードには2種類あり、ブラウザでRailsアプリへのアクセス時に `.puma-dev/` 配下にあるアプリ名を見に行っていてそれの中身がシンボリックリンクかポート番号が書いてあるかでモードを振り分けているようで、
- シンボリックリンク → 自動で該当アプリの `puma-dev` が起動（`rails s` 不要）
- ポート番号(プロキシモード) → 通常通り手動で `rails s` でのサーバー起動が必要
という挙動の違いがあります。

今までプロキシモードでのサーバー起動って結局 `rails s` しなきゃだしなんでこれにする必要あるの？って思ってましたが、今回の検証をしたことで納得出来ました。

:::note info
RubyMineにはRailsサーバーと一緒に起動させたいスクリプトをまとめる機能（Compound）があるので、そもそも自動で起動させずに自身でサーバーの起動をコントロールした方が良い点もあることも教わりました。
:::

もちろんプロキシモードにすると `puma-dev` の利点である自動起動がしなくなるので、方法1で問題なく `puma-dev` サーバーにアタッチ出来る人は方法1がベストな気もしてます。

# あとがき
長々書きましたが、ネット上にある情報をそれぞれ比較検証してみました。

一長一短ですが、サーバーが自動で起動しないのと引き換えにRubyMineでデバッグしやすくなるならそれは大きな利点だと思います。

色々勉強になりましたし、なによりRubyMineがより一層好きになりましたｗ

この記事によって皆様の開発の一助になれば幸いです🙇🏻