[Rails5] Ruby on Rails環境構築入門 ～初心者がVSCodeでリモート上のRailsサーバーアプリをステップ実行できるようにするまで。～


# 環境構築は大変
Railsの学習を行おうとコードをステップ実行できるまで環境構築を行ったのですが、非常に大変だったので誰かの手助けになればと思い下記環境構築法を記載しておきます。
色んなサイトを見ながら構築するのもいいのですが、
本ページの目的はオールインワンで構築方法の方法を紹介する事です。

# 環境構築の前提
下記条件で環境構築で行います。
Windows10上にはVirtualBoxとVSCodeだけインストールを行い、
メインはCentOS7.6上にRailsサーバーを立てホストOSからステップ実行を行います。

##### ホストOS
* Windows 10
* VirtualBox 6.0
  * ネットワークはブリッジアダプター
* VS Code 1.32.3

##### ゲストOS(VirtualBox上にインストールするもの)
* CentOS 7.6
  * userというユーザー名を作成してます。
* Ruby 5.5(rbenvを使用したインストール)
* Ruby on Rails (最新バージョン)

##### 筆者の能力
* Railsをこれから始めようとする完全初心者
* 過去CentOS6を操作した経験あり。

##### ここでは伝えない事
* Vagrantを使った環境構築
  - vagrantで[この問題が何度も発生した](https://qiita.com/leon-joel/items/4de455c507c85f78b3d5)為。
* VirtualBox上にCentOS7をインストールする方法
  - あくまでもVirtualBox上にCentOS7をインストールした後からの説明になります。

# 以下環境構築方法

### CentOS 7.6の初期設定(CentOS7側)
rootでログイン後 /etc/sysconfig/network-scripts/ifcfg-exxxxx0を編集しネットワーク接続できるようにします。
ここではviを使ってますが好きなエディタでよいです。

  ```  
  vi /etc/sysconfig/network-scripts/ifcfg-exxxxx0
  ```

  「ONBOOT = no」の行を「ONBOOT = yes」に変更して保存します。

その後再起動を行う。

  ```sh
  reboot 
  ```

再起動後 ip addrコマンドで出てきたIPアドレスを元にRLoginなどのターミナルソフトからリモートで接続可能です。

![0001.net setting.png](https://qiita-image-store.s3.amazonaws.com/0/383232/bcce7cdc-6719-aa2f-66d0-045e1548e2ae.png)


### 各種アプリケーションのインストール(CentOS7側)
rootでログインを行い、CentOS7上で必要と思われるアプリケーションを一気にインストールします。
  
  ``` sh:立ち上げ直後
  yum -y update 
  yum -y install telnet vim
  yum -y install epel-release
  yum -y groupinstall "Development Tools"
  yum -y install dkms bzip2 gcc make kernel-devel kernel-headers mariadb-devel mariadb-server sqlite-devel sqlite nodejs
  ```
※mariadbなどは後々使うことを想定してインストールしています。

### 一般ユーザーがsudoコマンドを使えるようにする。(CentOS7側)
下記コマンドを入力し、

  ```sh
  visudo
  ```

root    ALL=(ALL)       ALLの行の下に、
**user    ALL=(ALL)       ALL**
を追加して保存します。

### ホストOSのフォルダをゲストOSから参照できるようにする。(CentOS7+Windows10側)
* Windows10のVirtualBoxの上部メニューから下図のように、
 「GuestAddisiton CDイメージの挿入」メニューを選択します。

  ![0002.guest image.png](https://qiita-image-store.s3.amazonaws.com/0/383232/84fc6021-3d47-c504-7847-5d83bc052a7a.png)


* 上記メニュー選択後、CentOS7に接続しているターミナルソフトからGuestAdditionをインストールします。
  最後のhaltコマンドは仮想マシンの電源を落とします。
  
  ``` sh
  mkdir -p /mnt/cdrom
  mount -r /dev/cdrom /mnt/cdrom
  sh /mnt/cdrom/VBoxLinuxAdditions.run
  halt -p
  ```

### Windows上で共有したいディレクトリを作成する。(Windows10側)
Windows上の操作なので説明するまでもないですが、今回はrails_shareというディレクトリを作成します。

![0003.win folder.png](https://qiita-image-store.s3.amazonaws.com/0/383232/c8b37c6c-8bcc-bc33-3bee-78ec26c65624.png)


のちの確認の為、任意の名前のファイルをWindows側から保存しておきましょう。
ここでは**a.txtを保存**しておきました。

### VirtualBox上でWindowsのフォルダを参照出来るようにする。(Windows10側)
これはVirtualBoxの機能を使うだけなので簡単です。

VirtualBox上の仮想マシンの電源が落ちている状態で、
下図のように先ほどのフォルダを設定していきます。

![0004.vmsettings.png](https://qiita-image-store.s3.amazonaws.com/0/383232/4d938e39-3288-ba05-0700-e0ccdbeb9315.png)

設定後は下図のようになります。

![0005.vmsettings.png](https://qiita-image-store.s3.amazonaws.com/0/383232/61c11e19-aae7-d214-dede-cc1949d6afc9.png)


この後再びVirtualBoxから仮想マシンの電源を入れます。
CentOS7からWindowsのフォルダを閲覧できる状態にします。


### 共有フォルダのマウントする。(CentOS7側)

一般ユーザーとしてターミナルからログインを行い、下記操作を行います。

```sh
mkdir -p /home/user/rails_share
sudo mount -t vboxsf rails_share /home/user/rails_share
```

lsコマンドでrails_shareディレクトリ内にWindowsから作成しておいた[a.txt]が存在するか確認する。

```sh
ls /home/user/rails_share
```

### 共有フォルダを再起動後に自動でマウントされるようにする。(CentOS7側)
任意のテキストエディタを用いて/etc/rc.d/rc.localに最下行に下記追記します。

**mount -t vboxsf rails_share /home/user/rails_share**

その後実行権限を変更します。

```sh
sudo chmod u+x /etc/rc.d/rc.local
```

その後ゲストOSの再起動を行い問題なくマウントされているか確認します。

```sh
sudo reboot
ls /home/user/rails_share
```

再起動後に一般ユーザーでログインし
lsコマンドでa.txtが存在していれば問題なくマウントは行えています。

### CentOS7のファイアウォールの設定を行う。(CentOS7側)
まずrailsをリモートからアクセスする為には下記ポートを開ける必要があります。

* 3000 ... ブラウザからrailsサーバーにアクセスする際に使用
* 1234 ... railsデバッグポート
* 7658 ... railsのsolargraphで使用。

CentOS6ではiptablesを使用していたはずですが、
CentOS7ではfirewallコマンドを使用するみたいです。
firewallコマンドの詳細は [こちらが詳しい](https://qiita.com/kenjjiijjii/items/1057af2dddc34022b09e) ので詳細が知りたい方は参照

```sh
sudo cp /usr/lib/firewalld/services/http.xml /usr/lib/firewalld/services/rails.xml
sudo vim /usr/lib/firewalld/services/rails.xml 
```

テキストエディタで開いたrails.xmlの下記部分を
`<port protocol="tcp" port="80"/>`

下記のように変更し保存する。
`<port protocol="tcp" port="3000"/>`
`<port protocol="tcp" port="1234"/>`
`<port protocol="tcp" port="7658"/>`

rails.xmlで作成した内容をファイアウォールに登録し確認を行います。

```sh
sudo firewall-cmd --add-service=rails --zone=public --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
```
最後の firewall-cmd --list-allを行った結果、
下記情報が出力されればポートの開放が出来ているはずです。
services: ssh dhcpv6-client **rails**

この後rebootコマンドで再起動を行う。
再起動後、一般ユーザーでログインし sudo firewall-cmd --list-allで再度railsが登録されているか確認します。

### rbenvを使用してrubyをインストールする。(CentOS7側)

rbenvのインストールを行います。
下記は[こちらのサイト](https://qiita.com/ksugawara61/items/e3bb87d5e0dd49d20c8f)の説明をまとめたものです。

```
sudo yum install -y git gcc gcc-c++ openssl-devel readline-devel
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
rbenv install 2.5.5
rbenv global 2.5.5
rbenv rehash
```

### rubyのgemを用いてrailsをインストールする。(CentOS7側)

```
gem install rails
gem install bundler
rbenv rehash
```


### Railsアプリケーションの作成を行う(CentOS7側)

CentOS7からrails newコマンドを使用してアプリケーションを作成します。


```
cd /home/user/rails_share
rails new example_app
```

ここでだいたいの人はsqlite3のエラーが発生しますが、
下記Gemfileの修正を行うことで問題なくRailsアプリケーションを作成することが出来ます。

```
cd ./example_app
vim Gemfile
```

gem 'sqlite3'の行を
**gem 'sqlite3', '~> 1.3.6'** に変更する。

gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]の行を
**gem 'tzinfo-data'** に変更する。

Gemfileの最下行に下記を追加します。
**gem 'solargraph'**
**gem 'ruby-debug-ide'**
**gem 'debase'**

この後テキストを保存し下記コマンドを入力してbundleを更新します。

```
bundle update
rbenv rehash
```

### Railsアプリケーションの動作確認(CentOS7側)

```
rails s -b 0.0.0.0
```

rails sコマンドでサーバーを立ち上げます。
後ろの-b 0.0.0.0はホストOSからアクセスする際に必要となるオプションです。

ホストOS側のWindowsのブラウザからゲストOSのIP+3000番ポートにアクセスする事でテストページが出れば成功です。
私の環境ではhttp://192.168.1.27:3000/でアクセスできました。

それでは一旦 CTRL+CをゲストOSのターミナルから入力し、
Railsサーバーを終了させておきましょう。

### VS Codeの設定①(Windows10側)
ここではインストール手順は省きますが、
ステップ実行に必要となるプラグインと便利なプラグインを追加します。

筆者は下記をインストールしました。

* endwise
* Ruby
* Rails
* Ruby on Rails
* Rails Run Specs

ここでVSコード側から必要な設定は下記です。
* ruby solargraph

### VS CodeのRuby Solargraphの設定を行う。

Railsか何かのプラグインをインストールすると勝手にインストールされるプラグインなのですが、
リモートにアクセスする設定を行う必要があります。

メニューからファイル→基本設定→設定→拡張機能→SolargraphSettings内の設定を
* Transport → external
* External Server → settings.jsonで編集を行い、下図のように設定を変更する。

![0006.vscode01.png](https://qiita-image-store.s3.amazonaws.com/0/383232/8f0d00cc-5beb-0d36-1859-82b93288a83f.png)

これでSolargraphの設定は完了です。

<a name="pil1" > </a>
### VS Codeのプロジェクトの設定を行う。(Windows10側)

CentOS7側で共有フォルダに作成したディレクトリをWindows10のVS Codeで開きます。
下図の赤枠を選択し、railsアプリケーションのルートディレクトリであるexample_appディレクトリを選択する。

![0007.vscode02.png](https://qiita-image-store.s3.amazonaws.com/0/383232/50536435-ed34-708f-27a0-7d5919b96fe8.png)


それが終われば、下図VSコードのデバッグ設定を行います。
基本的に下記設定は各ディレクトリに.vscode/launch.jsonに作成されます。

![0008.vscode03.png](https://qiita-image-store.s3.amazonaws.com/0/383232/094bc47e-0b8b-d178-0341-602b695addc1.png)

![0008-2.vscode03.png](https://qiita-image-store.s3.amazonaws.com/0/383232/620a8214-cb5d-cd0a-d06d-0826446963c4.png)


主に重要なのは下記です。

* remoteHost ... CentOSのアドレス
* removePort ... 1234固定としてください。
* remoteWorkspaceRoot ... CentOS7側から見た共有フォルダの位置です。

それ以外は図と同じ設定で問題ないはずです。


### Railsサーバーをデバッグで受け付けるようにする。(CentOS7側)
本設定はVM上のCentOS7を再起動する度に行う必要があります。


```sh:Solargraphのサーバーを立ち上げる
solargraph socket --host 0.0.0.0 &
cd /home/user/rails_share/example_app
```

```sh:Railsサーバーをデバッグモードで立ち上げる
bundle exec rdebug-ide --host 0.0.0.0 --port 1234 --dispatcher-port 26126 -- bin/rails s -b 0.0.0.0
```

<a name="pil2" > </a>
### VS Codeからデバッグを行う。(CentOS7+Windows10側)

VS Codeの再起動を行い再度example_appのフォルダをWindows側から選択し、
下図のように赤枠選択後、緑色の再生ボタンを押下します。


![0009.vscode04.png](https://qiita-image-store.s3.amazonaws.com/0/383232/bf30b200-a5b1-1b10-232b-61c50e6f9b0c.png)


押下するとCentOS側では下記のような出力が出ます。

```
Fast Debugger (ruby-debug-ide 0.6.1, debase 0.2.2, file filtering is supported) listens on 0.0.0.0:1234
=> Booting Puma
=> Rails 5.2.2.1 application starting in development 
=> Run `rails server -h` for more startup options
....
Use Ctrl-C to stop
```

ここまで表示されれば問題なくVSCodeからデバッグが出来ています。
一旦 CTRL+CでCentOS7側のRailsサーバーを止めておきましょう。

ここからは簡単なRailsアプリケーションを作成しブレークポイントを止める方法を学びます。

### 簡単なRailsアプリの作成しステップ実行の確認

簡単なRailsアプリケーション作成の為、CentOS上で作成したexample_app配下のコードをVSCode上で下記のように修正します。

```Ruby:example_app/app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  def hello 
    a = 10
    b = 20
    c = 31
    d = a + b + c
    render html: "hello, world!!!!" + d.to_s
  end
end
```

```Ruby:example_app/config/routes.rb
Rails.application.routes.draw do
  root 'application#hello'
end
```

VS Code上からApplicationController内のhelloメソッド内に
ブレイクポイントを仕掛けます。

この後上の項目で記載した
* [Railsサーバーをデバッグで受け付けるようにする。(CentOS7側)](#railsサーバーをデバッグで受け付けるようにするcentos7側)
* [VS Codeからデバッグを行う。(CentOS7+Windows10側)](#vs-codeからデバッグを行うcentos7windows10側) 
の項目を参考に、
Railsサーバーを再度立ち上げVSCodeからデバッグを開始します。

```
bundle exec rdebug-ide --host 0.0.0.0 --port 1234 --dispatcher-port 26126 -- bin/rails s -b 0.0.0.0
```

その後、VSCode側から緑色の再生ボタンを押下します。
そこでブラウザからRailsサーバーにアクセスすると、
VSCode側でブレイクポイントの箇所で処理が止まります。

筆者の環境ではhttp://192.168.1.27:3000/にブラウザからアクセスする事でVSCode上でブレイクすることが出来ました。

### ブレイクポイントで処理が止まらない人向け

Rails5.2からですが、bootsnapのせいでうまくブレイクポイントが機能しない人が多くいるようです。
詳細は[こちら](https://github.com/rubyide/vscode-ruby/issues/337)を参照。

なので、ブレイクポイントで止まらない人は
example_app/config/boot.rb内の
require 'bootsnap/setup'の行を
**#require 'bootsnap/setup'**にコメントアウトする事で
うまく処理を止める事が出来るかもしれません。

筆者は上記設定でブレイクポイントを仕掛けた箇所で処理を止める事が出来ました。
少なくとも開発時は上記コメントアウトをしておく方が良いかもしれません。

# お疲れさまでした。

以上開発環境構築方法でした。

これを見ている方でもし誤りや間違いなどを見つけた方はご指摘下さい。



# 参考にしたサイト
* https://qiita.com/ksugawara61/items/e3bb87d5e0dd49d20c8f
* https://qiita.com/dekosuke-menti/items/11d5f1066d58245fb8b0
* https://qiita.com/homines22/items/946acbf7b0f043887e64
* https://qiita.com/chimame/items/56e48ab3145312ff1786
* https://qiita.com/naoto_koyama/items/313e45a0f26e1e641728