RubyMine Vagrant上のRailsをデバッグする

前の記事:RubyMineのインストール

JetBrains製のRubyMineを使って、Vagrant上に構築しているRailsアプリケーションをリモートデバッグします。

N879_paipuisutotukue_TP_V

環境

  • ホスト側
    • OS: OS X El Capitan
    • Vagrant 1.7.4
  • ゲスト側
    • OS: Ubuntu Server 14.04
    • Ruby 2.3.1 (rbenv管理)
    • Rails 4.2.6 or 5.0.0
    • ウェブサーバー :Rails標準( Rails 4: Webrick , Rails 5:Puma )
    • NginxとUnicornは使わない。

フォルダ構成

この記事で使用するフォルダです。

ゲスト側( Vagrant上のUbuntu )

  • IP: 192.168.33.11
  • ~/rails/sample : Railsプロジェクトが格納されているフォルダ。

ホスト側( OS X )

  • ~/Documents/Rails/Sample : ローカル作業フォルダ。RubyMineで作成するので、現段階では未作成。
  • Vagrantのsynced_folder機能 (ホスト側のフォルダにゲスト側のフォルダを同期させる機能)は、この記事では使いません。

流れ

  1. Rails – Rubyバージョンの確認
  2. Rails – Gemのインストール
  3. Rails – サーバーを起動
  4. RubyMine – プロジェクト新規作成
  5. RubyMine – Railsアプリケーションへの接続情報の設定
  6. RubyMine – Railsアプリケーションの同期
  7. RubyMine – Gemの更新
  8. RubyMine – リモートデバッグ設定
  9. RubyMine – 動作確認

参考:Codewall


Step0. はじめに

初めてRubyMineを使うならRailsプロジェクトはなるべく初期状態に近いほうがおすすめです。

Gemを色々と追加しているとRubyMineを使う時に原因不明のエラーが起きやすくなり、問題がどこにあるのかわかりにくくなります。

Step1. Railsで使っているRubyバージョンの確認

ゲスト側( Ubuntu )で現在のRubyバージョンを確認します。

$ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]

RubyMineで使うので覚えておきます。

Step2. RailsへのGemのインストール

Gemfileにリモートデバッグ用のruby-debug-idedebaseを追加します。

group :development, :test do
 gem 'ruby-debug-ide'
 gem 'debase'
end

Gemをインストールします。

$ bundle install

Step3. Rails側のサーバーを起動

rdebug-ide付きでRailsサーバーを起動します。

待ち受けるIPは、Vagrantfileで設定したIP(この記事では192.168.33.11)にします。待ち受けるポートは、RubyMineからのリモートデバッグアクセスを1234番で受けて、通常のアクセス は3000番で受けます。

$ rdebug-ide --host 192.168.33.11 --port 1234 --dispatcher-port 26162 -- bin/rails s -b 192.168.33.11 -p 3000
Fast Debugger (ruby-debug-ide 0.6.0, debase 0.2.1, file filtering is supported) listens on 192.168.33.11:1234

Fast Debuggerと表示されて、RubyMineからのアクセス待ちになります。アクセス待ちが終わるまで3000番ポートは動作しません。

Step8の動作確認までこのまま放置します。


Step4. RubyMineのプロジェクト新規作成

ホスト側( OS X )に戻ります。現在ホスト側には何のソースコードもありません。

RubyMineを起動して、空のプロジェクトを新規作成します。Create New Project を選択します。

Welcome_to_RubyMine

RubyNew Application を選択します。(RailsNew Application の場合は、Railsアプリケーションが生成されてしまうので使いません。)

  • Location: プロジェクトの保存先を指定します。
  • Ruby SDK: RubyバージョンをRailsで使っているバージョンに合わせて指定します。該当するRubyバージョンが表示されない場合は、ホスト側(OS X)に該当のRubyバージョンをインストールする必要があります。インストール方法は、OS X rbenv+rubyのインストールを参照ください。

SS_2016-07-07_22_49_08

RubyMineプロジェクトが起動します。

SS_2016-07-07_22_58_09


Step5. RubyMine – Railsアプリケーションへの接続情報の設定

RubyMineにVagrant上のRailsアプリケーションへの接続情報を設定します。

Toolsメニュー – DeploymentConfiguration を開きます。(RubyMineメニュー – PreferecesBuild, Execution, DeploymentDeployment からも開けます)

下図の + ボタンをクリックします。

SS_2016-07-04_22_49_27

サーバーの情報を次のように設定して、OKをクリックします。

  • Name: 任意の名前をつけます。
  • Type: SFTPを選択します。

SS_2016-07-04_22_51_13

Connectionタブは次のようにします。

  • SFTP host: Vagrantfileで割り当てたIP 192.168.33.11を指定します。
  • Port: SFTP接続なので22を指定します。
  • Root path: ゲスト側(Ubuntu)のRailsアプリケーションが格納されているパスを指定します。
    (Autodetectボタンを押すと、/home/vagrantと表示されます。)
  • User name: Vagrantへの接続ユーザ名vagrantを指定します
  • Password: Vagrantへの接続パスワードvagrantを指定します。
  • Web server root URL: ブラウザでルートへアクセスするときのURL 192.168.33.11:3000を指定します。

SS_2016-07-07_23_03_09

続いて、Mappingsタブを開き、次のようにし、OKをクリックします。

  • Local path: ホスト側(OS X)の当プロジェクトの場所を指定します。
  • Deployment path on server ‘Vagrant’: Vagrant上のRailsプロジェクトの場所です。/とします。ConnectionタブのRoot path: からの続きのパスです。
  • Web path on server ‘Vagrant’: RailsアプケーションのURLです。/とします。ConnectionタブのWeb server root URL: からの続きのパスです。

SS_2016-07-07_23_09_27


Step6. RubyMine – Railsアプリケーションの同期

ゲスト側(Ubuntu)にあるRailsアプリケーションをホスト側にダウンロードして、同期します。

矢印のように、プロジェクトを選択します。

SS_2016-07-07_23_13_25

Toolsメニュー – DeploymentSync with Deployed to ... を選択し、Step5で作ったサーバー設定を選択します。すると、下図のようにゲスト側とホスト側のソースコードの差異が表示されます。現在はホスト側には何もソースコードが無いので全ファイルが表示されています。矢印位置のSynchronize Allボタンを押して、全てを同期します。

SS_2016-07-07_23_15_47

この時点で次のようなInstall missing gemsメッセージが出ているかもしれませんが、これは次のステップで解消するので置いておきます。

SS_2016-07-07_23_30_21


Step7. RubyMine – Gemの更新

Railsプロジェクトで使っているGemに合わせて、ホスト側(OS X)のGemを更新します。

ここでToolsメニューの下にBundlerが無い場合は、次のようにしてゲスト側(OS X)にBundleをインストールします。

rbenv globalでRubyのバージョンを合わせて、bundleをインストールします。RubyMineには自動でBundlerメニューが表示されます。

$ rbenv global 2.3.1
$ gem install bundle
$ rbenv rehash

Toolsメニュー – Bundler – Install をクリックします。次のようなウィンドウが開くので、何もせずに Install をクリックします。

SS_2016-07-07_23_34_34

しばらくするとGemのインストールが終わります。Spring(キャッシュ系)のメッセージがでましたが置いておきます。

SS_2016-07-07_23_57_45


Step8. RubyMine – リモートデバッグ設定をする

rdebug-ideとの接続情報を設定します。

Runメニュー – Edit Configurations... を開きます。

左上の + をクリックし、Ruby remote debug を選択します。

SS_2016-07-08_0_09_55

Ruby remote debugの設定を次のようにして、OKをクリックします。

  • Name: 任意の名前をつけます。
  • Sever command: 変えられないのでこのままです。
  • Remote host: Vagrantfileで指定したIP 192.168.33.11 を指定します。
  • Remote port: リモートデバッグ用の1234 を指定します。
  • Remote root folder: ゲスト側(Ubuntu)のRailsアプリケーションフォルダを指定します。
  • Local port: 26162のままにします。
  • Local root folder: ホスト側(OS X)の当プロジェクトの場所です。

SS_2016-07-08_0_13_24


Step9. RubyMine – 動作確認

RubyMineでブレークポイントを貼ります。(ルートアクセス時のコントローラのアクションあたりが手頃)

SS_2016-07-08_0_31_56

Runメニュー – Debug 'リモートデバッグ設定ファイル名'をクリックしてデバッグを開始します。

Step3でサーバーを起動していれば、DebugウィンドウにConnectedと表示されます。

SS_2016-07-09_14_08_19

試しにブラウザからルート(http://192.168.33.11:3000)へアクセスしてみて、次のようにブレークポイントを貼った行で止まれば成功です。

SS_2016-07-09_14_13_05

デバッグを終了するときは、Runメニュー – Debug 'リモートデバッグ設定ファイル名'をクリックします。

ゲスト側のRailsサーバーも自動的に終了します。(ゲスト側のRailsサーバーを起動しっぱなしにする方法は分かりません。)


その他1

RubyMineからアクセスがあると、ゲスト側で次の警告が表示されました。(解決方法が分かりませんでした)

WARN: Unresolved specs during Gem::Specification.reset:
      rake (>= 0.8.1)
WARN: Clearing out unresolved specs.
Please report a bug if this causes problems.

その他2

RubyMineでリモートデバッグしているときに、ゲスト側に次のようなCannot render consoleメッセージが発生しました。

Cannot render console from 192.168.33.1! Allowed networks: 192.168.33.11, 127.0.0.0/127.255.255.255, ::1

Railsの config/environments/development.rb を開き次の一文を追加すると消えます。参考:Cannot render console from 10.0.2.2!と言われました – Qiita

config.web_console.whitelisted_ips = '192.168.33.1'