Ruby on RailsをCloud9からHerokuへデプロイする

## Herokuとは？
アプリケーションが動作可能なPaasサービス。はじめにRuby言語のサービスが提供されたが、現在はJava、Node.js、Scala、Clojure、Python、PHPなど多言語にわたる。開発環境としてだけでなく、本番環境としても利用でき、クラウド環境としての地位も確立しつつある。heroku toolbeltやheroku pipelineなどツールも充実しており、デベロッパーがインフラ構築を意識せずにGUIやコマンドラインで起動可能な点が大きな特徴となっている。
2010年にSalesforceに買収されるが、サービス規模は拡大の一途をたどる。

## Cloud9とは？
開発環境のクラウドPaasサービス。Herokuが本番稼働を意識した価格帯を持つサービスであるが、Cloud9は開発環境として特化したIDEクラウドとなっている。環境構築にはGUI操作を必要とするが、Django (Python)、WordPress、Metor(Node.js)、C++、Ruby on Rails、Node.js、PHP、HTML5と、豊富なラインナップに加え、Dockerを利用することで、どんな開発環境でも構築でき、優れたIDE機能を利用することが可能となっている。各環境にはリモートユーザを招待することができ、そのままプロジェクト単位で適した開発者に開発してもらうことがスムーズにできるよになっている。2016年にAmazonに買収されたが、サービスは変わらず継続している。

# Cloud9でRuby環境を構築

プロジェクト名を入力して、下段のRubyを選択し、「Create Workspace」をクリックするだけで環境が構築できます。
![20170222_cloud9_ruby.png](https://qiita-image-store.s3.amazonaws.com/0/2567/6d8bb06b-edec-69c3-2f65-69df3e6a421b.png)


### IDE上でできること
左側にプロジェクトフォルダ配下のツリーが表示され、右側にコードペインが表示されます。デフォルトではREADME.mdファイルが展開されており、Cloud9 IDEのAAが表示されてます。下段にはコンソールウインドウになっていて、サーバにターミナル接続したとき同じbashコマンドが実行可能になっています。ほかにもメニューボタンが多数そろっており、IDEとして満足できるだけの機能がそろっています。
![20170222_cloud9_IDE.png](https://qiita-image-store.s3.amazonaws.com/0/2567/da05e986-6cbb-8f8b-6d02-272d8b90f883.png)


### ターミナルでバージョン確認

下段のコンソールをクリックしてターミナル上でバージョン確認コマンドを実行してみます。

```bash
fk_2000:~/workspace $ ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]
fk_2000:~/workspace $ gem -v 
2.5.1
fk_2000:~/workspace $ rails -v
Expected string default value for '--rc'; got false (boolean)
Rails 4.2.5
```

ruby、gem、railsがデフォルトでインストールされていることが確認できます。
※コンソールの高さはお好みで調整ください。
![20170222_cloud9_IDE2.png](https://qiita-image-store.s3.amazonaws.com/0/2567/8ce78264-4e26-a312-c014-3fcdb8a889dd.png)


サーバのコンソールそのままなので、dfコマンドも実行できます。
※sarコマンドはありませんでした。

```bash
fk_2000:~/workspace $ df -h
Filesystem                Size  Used Avail Use% Mounted on
none                      2.2G  4.0M  2.0G   1% /
tmpfs                      26G     0   26G   0% /dev
tmpfs                      26G     0   26G   0% /sys/fs/cgroup
/dev/mapper/volg1-lvdata  1.2T  766G  416G  65% /nix
shm                        64M     0   64M   0% /dev/shm
```

### Hello World

ソースコードを修正して、「Hello World」と表示するだけのアプリケーションを作成します。
※コンソール上でviコマンドでもいいですが、ツリーから該当ファイルをダブルクリックすることでソースが右ペインに表示されます。

![20170222_cloud9_IDE3.png](https://qiita-image-store.s3.amazonaws.com/0/2567/9c659e14-2db4-6f02-3e0d-c026afd69324.png)



```ruby:~/workspace/app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception

+  def hello
+    render text: "Hello World"
+  end
end
```

IDEの便利機能として、ソースコードの自動補完やエラーチェックがあります。また、保存していない編集中のファイルのタブには丸印で未保存状態であることを表示してくれます。忘れずに保存しましょう。

![20170222_cloud9_IDE4.png](https://qiita-image-store.s3.amazonaws.com/0/2567/51c5dac6-d225-1417-bb9e-47e1f2367c61.png)



route.rbに下記1行を追加します。

```ruby:~/workspace/config/routes.rb
  # You can have the root of your site routed with "root"
+  root 'application#hello'
```

上記編集が終わって保存が完了したら以下コマンドでサーバを立ち上げます。
※Cloud9上のブラウザで確認します。

`$ rails server -b $IP -p $PORT`

サーバが立ち上がると、コンソールの右端に緑色のタグが表示され、URLが記載されています。クリックするとブラウザの新しいタブが開いて、Webアプリケーションが表示されます。
![20170222_cloud9_IDE5.png](https://qiita-image-store.s3.amazonaws.com/0/2567/354368ec-1299-93ff-7574-6e088371c841.png)

以下のように表示されれば正常です。
![helloworld.png](https://qiita-image-store.s3.amazonaws.com/0/2567/13687d18-d410-0812-7ce5-3f3a6663caca.png)

#Gemfileの編集
Cloud9でRuby環境を選択するとSQLiteのバージョンが1.3.10でしたが、これはHerokuではサポートされていないので、Gemfileでtest,developmentのときだけSQLite(sqlite3)を使用し、productionの場合はPostgreSQL(pg)を使用するように編集します。以下のようにGemfileを編集して、Bundle installしておきます。

`$ vi Gemfile`

```bash:Gemfile
# Use sqlite3 as the database for Active Record
- gem 'sqlite3'
+ gem 'sqlite3', groups: %w(test development), require: false
+ gem 'pg', groups: %w(production), require: false
```

```bash
~/workspace (master) $ bundle install
```


#Gitの設定
以下のコマンドをBashターミナルでタイプし、Gitの設定をします。
名前とEmailアドレスは自分のものを入力します。

```bash
~/workspace $ git config --global user.name "My Name"
~/workspace $ git config --global user.email sample@sample.com
~/workspace $ git config --global push.default matching
~/workspace $ git config --global alias.co checkout
```

Gitをイニシャライズして、ファイルをコミットします。

```bash
~/workspace $ git init
~/workspace (master) $ git add -A
~/workspace (master) $ git commit -m "first commit"
```

#Bitbucketでリモートレポジトリの作成

BitbucketでGitリポジトリを作成します。上段メニューのリポジトリから「リポジトリの作成」をクリックします。

![20170223_bitbucket.png](https://qiita-image-store.s3.amazonaws.com/0/2567/c542b33a-fba8-635d-fb7c-a95c3ffccae6.png)


リポジトリ名に「your-project-name」、Gitをチェックし、「リポジトリの作成」ボタンをクリックすることで作成されます。

![20170223_bitbucket2.png](https://qiita-image-store.s3.amazonaws.com/0/2567/a34c0183-af37-dbf3-b287-aa3bf0876ebf.png)


すると、「概要」というページが表示されます。

![20170223_bitbucket3.png](https://qiita-image-store.s3.amazonaws.com/0/2567/d7c140aa-6778-13b5-53ab-52274dd9096b.png)

下のほうに「> 既にプロジェクトがあります。」というリンクがあるのでクリックすると、Step1、Step2の手順が表示されます。

![20170223_bitbucket4.png](https://qiita-image-store.s3.amazonaws.com/0/2567/c839660a-9b03-4c90-4e2a-0555c6c58270.png)

Step1、Step2のコマンドをCloud9のBashターミナルに入力して実行します。（Bitbucketのユーザ名によってコードは異なる）

```bash
$ cd /path/to/your/repo
$ git remote add origin https://<bitbucket user>@bitbucket.org/<bitbucket user>/your-project-name.git
$ git push -u origin --all # pushes up the repo and its refs for the first time
$ git push -u origin --tags # pushes up any tags
```

#Herokuにデプロイする

まずはherokuにログインします。Herokuで登録したEmailアドレスとパスワードを聞いてくるので、それを入力します。

```bash
~/workspace (master) $ heroku login
```

次にHerokuプロジェクトを新しく作り、GitデータをHerokuにプッシュします。

```bash
~/workspace (master) $ heroku create
~/workspace (master) $ git push heroku master
```

無事プッシュが終わったら、ターミナル上に書いてあるURLに飛んで、無事 Hello Worldが表示されれば成功です。



## 参考
[Ruby on RailsをCloud9からHerokuへデプロイするセットアップ覚書](http://qiita.com/jhorikawa/items/84a0f4a7f40f5914ad1a)


#まとめ
このように、Ruby on Railsの環境を手軽に構築できるCloud9で、スムーズにアプリケーション開発ができる時代になりました。Herokuもそうですが、AWSやGCPなどクラウド本番環境に選択肢が生まれ、いかにスケールさせるかに注力できるので、様々なアプリケーションやシステムにチャレンジできるというのはエンジニアとって幸せな時代が来たのではないでしょうか。

#宣伝
イレブンナイン株式会社では、エンジニア採用に力を入れています。本稿以外のノウハウも弊社は有しており、日々向上を是として取り組んでおります。自社サービスの開発もその一つです。

弊社のサイトです。
http://www.elevennines.co.jp

弊社のサイトにも採用に向けた応募フォームがありますが、採用強化週間としてIndeed.comに求人広告を載せています。

[Indeed.com - イレブンナイン株式会社の求人広告](http://jp.indeed.com/%E6%B1%82%E4%BA%BA?q=%E3%82%A4%E3%83%AC%E3%83%96%E3%83%B3%E3%83%8A%E3%82%A4%E3%83%B3%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE&l=&rq=1)

ご興味がありましたらぜひコンタクトをいただければ幸いです。