仮想マシンの構築からRailsプロジェクト作成まで半自動で実行してくれるスクリプトをつくってみた【MacOS対応】

手軽に作ったり壊したりできるのが仮想環境で開発するメリットのひとつです。

手軽とはいえ、仮想環境の構築からRailsプロジェクトの作成まで行うなると、そこそこの量のコマンドを実行する必要があるのでそれなりに面倒です。

ということで、仮想マシンの構築からRailsプロジェクトの作成までを半自動で実行してくれるシェルスクリプトをつくってみました。

今回つくったスクリプトはドットインストールの[ローカル開発環境の構築 [macOS編] ](https://dotinstall.com/lessons/basic_localdev_mac_v2)というレッスン内容を元にしています。**ローカル開発環境や仮想環境の概要、仮想環境への接続方法などが分からないという方は、まずこちらのレッスンを受けることをおすすめします。**

## 動作環境
下記の環境で動作を確認しています。**ただ、あくまで自分用につくったスクリプトなので必ずしも正しく動作するとは限りません。各コマンドを理解した上で使用してください。**

- MacOS Mojave 10.14.4
- VirtualBox 5.2.20
- Vagrant 2.0.3

## 実行ファイル

以下の3つです。

- virtual_env_setup.command
- rails_setup1.sh
- rails_setup2.sh

GitHubで公開しています。`$ git clone`するなどして入手してください。

```
$ git clone https://github.com/Tatehito/rails-dev-setup.git
```

## 何ができるのか
このスクリプトを実行すると、以下の環境が完成します。

- VirtualBox（vagrant）を使った仮想開発環境
- CentOS 7.3
- Ruby（任意のバージョンを指定可）
- Rails（任意のバージョンを指定可）
- 任意の名前のRailsプロジェクト（DBはSQLite）

## 使い方

### 事前準備
- VirtualBoxのインストール
- Vagrantのインストール
- Cyberduckのインストール
- ホームディレクトリ配下に`workspace`という名前のディレクトリを作成する

ホームディレクトリ配下の`workspace`ディレクトリに仮想環境用のディレクトリを作成するようにしているため、事前に`workspace`ディレクトリを作成しておいてください。※`workspace`以外のディレクトリを指定する方法は後述します。

各種ツールのインストール方法はドットインストールのレッスンがわかりやすいです。[ローカル開発環境の構築 [macOS編] ](https://dotinstall.com/lessons/basic_localdev_mac_v2)


### スクリプトを実行する

#### １．virtual_env_setup.commandをMacOSで実行する
「virtual_env_setup.command」は、仮想環境の構築から起動までを実施します。

MacOS上でダブルクリックで実行します。実行すると、仮想マシン用に作成するディレクトリ名を尋ねられるので、任意の名前を入力してEnterを押してください。

```
Please Enter Virtual-Environment Directory Name.
$ 作成するディレクトリ名
```

最後に赤字で下記のようなメッセージが出ますが、問題ありません。

```
Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
（以下略）
```

処理が完了すると、ホームディレクトリ配下の`workspace/入力したディレクトリ/Vagrantfile`が作成されているはずです。**なお、この時点で仮想マシンは起動状態になっています。**

#### ２．構築された仮想環境にシェルを配置する
CyberduckなどのFTPクライアントソフト使って、「rails_setup1.sh」「rails_setup2.sh」を仮想環境のホームディレクトリにアップロードします。

Cyberduckの使い方はドットインストールのレッスン（[ローカル開発環境の構築 [macOS編] ](https://dotinstall.com/lessons/basic_localdev_mac_v2)）が分かりやすいです。

配置したら、ターミナルから`vagrant ssh`で仮想マシンにログインし、配置したシェルの実行権限を下記コマンドで付与します。

```
$ chmod 755 *.sh
```

#### ３．rails_setup1.shを仮想環境で実行する

「rails_setup1.sh」を実行します。「rails_setup1.sh」では、Git、rbenv、ruby-buildのインストールを実施します。

実行したらやることはないので、処理が終わるまで待ちます。

#### ４．rails_setup2.shを仮想環境で実行する
続いて「rails_setup2.sh」を実行します。「rails_setup2.sh」ではRuby、Ruby on Railsのインストール、Railsプロジェクトの作成を実施します。

実行すると、以下のようにRuby、Railsのバージョン、Railsプロジェクト名を入力するよう促されるので、入力します。

```
Please enter the version of "Ruby" to install.
$ 2.5.5

Please enter the version of "Rails" to install.
$ 5.2.2

Please enter Rails Project Name.
$ sample_project
```
処理が進んでいくと、SQLiteインストール時に以下のメッセージが表示されて処理が一時停止するので、`y`を入力して処理を進めます。

```
総ダウンロード容量: 104 k
インストール容量: 366 k
Is this ok [y/d/N]: 
```

#### ５．Railsサーバー起動、アクセス

処理がすべて終了すると、以下のメッセージがコンソールに出力されます。

```
Command to start the Rails server：rails s -b 192.168.33.10
URL：http://192.168.33.10:3000/
```

このメッセージにある通り、`$ rails s -b 192.168.33.10`でRailsサーバーを起動し、ブラウザから`https://192.168.33.10:3000`でRailsアプリケーションに接続できたら完了です。

![スクリーンショット 2019-04-11 23.59.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214962/03471cc1-dec9-4358-b55b-6451f030248b.png)

## スクリプト内容のちょっとした解説

### virtual_env_setup.command

```virtual_env_setup.command
echo "Please Enter Virtual-Environment Directory Name."
read vspace_name

cd ./workspace
mkdir $vspace_name

# VagrantFileを作成
cd ./${vspace_name}
vagrant init bento/centos-7.3
```

`cd ./workspace`でホームディレクトリ配下のworkspaceディレクトリに移動し、仮想環境用のディレクトリを作成するようにしています。

workspace以外のディレクトリを指定したければ、`cd ./workspace` で指定している移動先のディレクトリを任意のディレクトリに変更すればOKです。

```virtual_env_setup.command
# 仮想マシンを起動
vagrant up
```
初回起動は時間がかかるので、処理の最後に起動のコマンドを実行するようにしています。**スクリプトの実行が終わったら仮想マシンが起動状態になっているので注意してください。**

仮想マシンの状態は` $ vagrant status`で確認できます。

### rails_setup1.sh

```rails_setup1.sh
# rbenvのパスを通す
echo '# rbenv' >> ~/.bash_profile
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

# ログインシェルを再起動し設定を反映
exec $SHELL --login
```

rails_setup1.shの最後に、ログインシェルの再起動を行っています。これはrbenvのパスの設定を反映させるためです。

### rails_setup2.sh

必要なライブラリを順番にインストールし、最後にRailsプロジェクトを作成します。ちなみに、Node.jsをインストールしておかないとRailsサーバー起動時にエラーになります。

```rails_setup2.sh
# ExecJSランタイム（Node.js）のインストール
curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -
sudo yum -y install nodejs
```

## 改善したいポイント

前述したように`$ rails s -b 192.168.33.10`コマンドでRailsサーバーを起動し、`http://192.168.33.10:3000/`で接続します。

が、本来は`$ rails s`コマンドで起動、`http://localost:3000/`で接続できるはずです。（本来と言うか、以前仮想環境つくったときはこれで接続できてました）

今回作成したスクリプトではlocalhostで繋げないようになってしまっているので、その点を改善したいと考えています。

## おわりに

自分用につくったため汎用的なスクリプトではないですが、複雑なことをやっているわけではないので理解するのは難しくないと思います。

仮想環境の構築に慣れてきて、いちいち手で作るのが面倒だという方はぜひ参考にしてみてください。