Vagrant + VirtualBoxでつくるRails 6系の環境構築

ここ数年Rails触ってなかったので、以前の[こちら](https://qiita.com/GenTamura84/items/0f97c117df6b1b6e8c0f)で書いたRails5系の記事を6系に更新したいと思います。

バージョンは

```
Vagrant 2.2.6
VirtualBox 6.0.14
```

です。

## 1. VagrantとVirtualBoxをインストール

### Vagrant
以下のリンクより、利用されている端末のOSを選択して、インストーラーをダウンロードし、Vagrantをインストールしてください。
https://www.vagrantup.com/downloads.html

### VirtualBox
以下のリンクより、利用されている端末のOSを選択して、インストーラーをダウンロードし、VirtualBoxをインストールしてください。
https://www.virtualbox.org/wiki/Download_Old_Builds_6_0

※ 2019/12/24現在、VirtualBox 6.1だと、 `vagrant up` を実行時に、以下エラーが発生するので、ご注意ください

```shell
$ vagrant up
No usable default provider could be found for your system.

Vagrant relies on interactions with 3rd party systems, known as
"providers", to provide Vagrant with resources to run development
environments. Examples are VirtualBox, VMware, Hyper-V.

The easiest solution to this message is to install VirtualBox, which
is available for free on all major platforms.

If you believe you already have a provider available, make sure it
is properly installed and configured. You can see more details about
why a particular provider isn't working by forcing usage with
`vagrant up --provider=PROVIDER`, which should give you a more specific
error message for that particular provider.
```

## 2. Vagrantを初期セットアップ

プロジェクトのディレクトリを作成して、そのディレクトリで、Vagrantの設定ファイルを生成します。

```shell
$ mkdir your_project_directory && cd your_project_directory
$ vagrant init
```

Vagrantfileが生成されるので、編集します

```ruby:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/xenial64" # Ubuntu 16.04 を使用
  config.vm.network "forwarded_port", guest: 3000, host: 3000 # Railsで利用するポートを設定
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "2048" # メモリを多めに設定
  end
end
```

以下のコマンドで、VirtualBoxを起動します

```shell
$ vagrant up # ubuntu/xenial64 のboxがダウンロードされていない場合は、しばらく時間がかかります
```

起動が済んだら、ログインします

```shell
$ vagrant ssh
```

## 3. Ubuntuのパッケージをセットアップ

パッケージをアップデートして、必要なパッケージをインストールします

```shell
$ sudo apt-get -y update
$ sudo apt-get -y install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev python-software-properties libffi-dev pkg-config
```

## 4. Rubyのセットアップ

rbenvでRubyをセットアップします

```shell
$ git clone git://github.com/sstephenson/rbenv.git .rbenv
$ git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc
$ echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
$ echo 'gem: --no-ri --no-rdoc' > ~/.gemrc
$ exec $SHELL
```

Rubyとbundlerをインストール

```shell
$ rbenv install 2.6.5 # ※結構時間がかかります
$ rbenv global 2.6.5
$ rbenv rehash
$ gem install bundler
```

## 5. Railsプロジェクトの追加

```
$ cd /vagrant
$ mkdir blog && cd blog
$ bundle init
```

生成されたGemfileのrailsをコメントインします。

```ruby:Gemfile
# frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem "rails"
```

Railsをプロジェクトのgemとしてインストールします

A. ホストがMacの場合

```shell
$ bundle config path vendor/bundle
$ bundle install
```

B. ホストがWindowsの場合

※ 共有フォルダの/vagrant配下にnative extensionsを利用するgemをインストールすると、エラーなるための処置です。/vagrant配下以外なら問題ないはず。

```shell
$ sudo mkdir /usr/local/src/bundles
$ sudo chown -R vagrant:vagrant /usr/local/src/bundles
$ bundle config path /usr/local/src/bundles/blog
$ bundle install
```

## 6. アプリケーションを作成する

以下のコマンドでカレントディレクトリにRailsアプリケーションを作成します

```
$ bundle exec rails new . --skip-spring --skip-webpack-install
       exist
      create  README.md
      create  Rakefile
      create  .ruby-version
      create  config.ru
      create  .gitignore
    conflict  Gemfile
Overwrite /vagrant/blog/Gemfile? (enter "h" for help) [Ynaqdhm] Y # Gemfileは上書きするの Y を入力

...（省略）...

Installing webpacker 4.2.2
Bundle complete! 15 Gemfile dependencies, 73 gems now installed.
Bundled gems are installed into `./vendor/bundle`
         run  bundle binstubs bundler
The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
```

なにやらWarningがでているが、Warningなので、このまま進む。

続いて、以下の各コマンド実行

```
$ bin/rails db:create
$ bin/rails g scaffold post title:string content:text
$ bin/rails db:migrate
```

ローカルサーバー立ち上げ

```
$ bin/rails s -b 0.0.0.0
```

するとエラー

```
/vagrant/blog/vendor/bundle/ruby/2.6.0/gems/webpacker-4.2.2/lib/webpacker/configuration.rb:95:in `rescue in load': Webpacker configuration file not found /vagrant/blog/config/webpacker.yml. Please run rails webpacker:install Error: No such file or directory @ rb_sysopen - /vagrant/blog/config/webpacker.yml (RuntimeError)
```

Webpackerは今回入れないので、webpackerをGemfileからコメントアウト

```ruby:Gemfile
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby '2.6.5'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 6.0.2', '>= 6.0.2.1'
# Use sqlite3 as the database for Active Record
gem 'sqlite3', '~> 1.4'
# Use Puma as the app server
gem 'puma', '~> 4.1'
# Use SCSS for stylesheets
gem 'sass-rails', '>= 6'
# Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker
# gem 'webpacker', '~> 4.0'
# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
gem 'turbolinks', '~> 5'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.7'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 4.0'
# Use Active Model has_secure_password
# gem 'bcrypt', '~> 3.1.7'

# Use Active Storage variant
# gem 'image_processing', '~> 1.2'

# Reduces boot times through caching; required in config/boot.rb
gem 'bootsnap', '>= 1.4.2', require: false

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end

group :development do
  # Access an interactive console on exception pages or by calling 'console' anywhere in the code.
  gem 'web-console', '>= 3.3.0'
  gem 'listen', '>= 3.0.5', '< 3.2'
end


group :test do
  # Adds support for Capybara system testing and selenium driver
  gem 'capybara', '>= 2.15'
  gem 'selenium-webdriver'
  # Easy installation and use of web drivers to run system tests with browsers
  gem 'webdrivers'
end

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
```

改めて、ローカルサーバー立ち上げ

```
$ bin/rails s -b 0.0.0.0
=> Booting Puma
=> Rails 6.0.2.1 application starting in development
=> Run `rails server --help` for more startup options
Puma starting in single mode...
* Version 4.3.1 (ruby 2.6.5-p114), codename: Mysterious Traveller
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
```

`localhost:3000` にブラウザでアクセス

![rails6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2540/205147ea-fb08-b160-2cb5-88b1a344e792.png)


無事立ち上がりました 🙌

---
以上、参考になれば、幸いです :elephant: