0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

mac OSX Sierra で herokuのRubyチュートリアル実践(2017/1)

Posted at

bitbacket+codeship+rubyとかいう個人向けでできる最低限の開発環境を整えよう企画。

ここにherokuを付け加えるべくとりあえずHeroku dev centerにあるGetting Started on Heroku with Rubyに挑戦した。

二回目をじっくりどういうものか理解しながらやるついでにQiitaに意訳しながら書くとさらに理解が深まるメソッドを利用しています。

ちなみにrubyはやったことあるけど1、いつも通り完璧に忘れているのでこれも初めてみたいな感覚で使います。
では行ってみよう。

適当に訳しているし大部分意訳なので間違いがあれば指摘していただけるとありがたい。

  1. Introduction
  2. Set up
  3. Prepare the app
  4. Deploy the app
  5. View logs
  6. Define a Procfile
  7. Scale the app
  8. Declare app dependencies
  9. Run the app locally
  10. Push local changes
  11. Provision add-ons
  12. Start a console
  13. Define config vars
  14. Use a database
  15. Next steps

一回もうやったけど、多いなおい…。
でも内容はあまりないようです。

Introduction

Rubyのチュートリアルだよ。
前提条件として下記が入ってるものとしておおくりするよ!

  • freeのHerokuアカウント
  • ローカル環境へのRuby 2.2.5のインストール
  • ローカル環境へのBundlerのインストールgem install bundler

これはまぁとりあえず適当にこなしました。
localのバージョンが新しすぎたのとバージョン変更など入ってなかったので諸々インストール。

$ brew update
$ brew upgrade ruby-build
$ rbenv install 2.2.5
$ rbenv gloval 2.2.5
$ gem install bundler

Set up

Heroku Command Line interface(CLI)のダウンロードとインストールをする。
これをインストールするとherokuコマンドがそれぞれのShell環境で使えるようになる・・・はずです。
私の場合はMAC OS Xを選択して普通にインストールができました。
下記コマンド実行で作ってあるherokuアカウントにログインできるはずです。

$ heroku login
Enter your Heroku credentials.
Email: heroku_test@gmail.com
Password (typing will be hidden): 
Logged in as heroku_test@gmail.com

私の場合は大丈夫でしたが、環境がfirewall内にある場合は外部HTTP/HTTPSサービスへの接続にはプロキシーを使う必要があるそうです。
herokuコマンドを実行する前にローカル環境変数にHTTP_PROXYもしくはHTTPS_PROXYを設定しましょう。
リンクしとくので適切に設定を行ってください。

Prepare the app

ここではherokuのルビーの解説用スターターキットをローカルにダウンロード。

$ git clone https://github.com/heroku/ruby-getting-started.git
$ cd ruby-getting-started

Deploy the app

いよいよherokuにアプリをdeploy2する。

$ heroku create
Creating app... done, ⬢ evening-tor-82984
https://evening-tor-82984.herokuapp.com/ | https://git.heroku.com/evening-tor-82984.git

herokuコマンドでcreateするときコマンドを実行したローカルフォルダにあるgit repositoryが関連づけられてその上でheroku上にremote repositoryが作られる。
アプリの名前は何も入れなければ勝手に作られる。
なんかこの状態でつける方法もあるみたいだけど、まぁコマンドのヘルプでも見れば書いてあるかも。

$ git push heroku master

ここちょっとわかんないなぁ。
herokuにpushするのはわかるんだけど、ここら辺rubyを見つけたからherokuが勝手に色々やってくれてるってことなのかな?
これって別のruby入れても同じような動作になんのかね?3

最後に$ heroku openでWEBで見れることを確認。

View logs

なんかherokuは単一のチャンネルで全てのイベントを管理しているそうなので、一箇所見れば全部見れるらしい?
この翻訳(俺です)大丈夫か?

heroku logs --tailコマンドで見れる。
さっきの作ったサイト(私の場合はhttps://evening-tor-82984.herokuapp.com/もうないよ!)にアクセスしてみるとログが吐かれるのが見れると思います。
あといつも通りCtrl+Cでログの表示を閉じれます。

Define a Procfile

アプリケーションのrootディレクトリにあるProcfileテキストファイルについてウニャウニャと。
アプリケーションがスタートする時のコマンドを指定できるらしいです。
サンプルのProcfileには下記のように書かれてます。

web: bundle exec puma -C config/puma.rb

なんかごちゃごちゃ書いある・・・・。

プロセスタイプ(web)と実行するコマンドについて書かれている。
webがここでは重要。herokuのweb系の接続関連はこれを指定すればいいのかな?
んでpumaっていうwebサーバーを実行してconfig設定を渡している・・・みたいな感じ。

一応複数のバックグラウンドワーカーを動かすことも可能みたいなことが書いてあるかな。

Scale the app

アプリケーションのスケールについて。
なんか今のところdynoっていうコンテナで動いているらしい?
psコマンドで現在動いてるdynoを確認できるらしい

$ heroku ps
Free dyno hours quota remaining this month: 996h 36m (99%)
For more information on dyno sleeping and how to upgrade, see:
https://devcenter.heroku.com/articles/dyno-sleeping

=== web (Free): bundle exec puma -C config/puma.rb (1)
web.1: up 2017/01/31 13:08:03 +0900 (~ 8m ago)

まぁ一つだけ動いてるよと。
デフォルトではフリーのdynoが動いているそうです。
これは30分アクセスがなければスリープするそうです。
なんかここでもごちゃごちゃ書いているけどくわしく知りたければdynoをみてください。
まぁ、スリープが嫌ならアカウントをhobbyもしくはprofessionalにアップグレードしてねだって。
例えばもしprofessionalにすれば動作するdynoの数をコマンドラインから操作することで簡単にスケールできるって書いてあるのかな?

コマンドラインでの操作はフリーでも体験は可能で試しに下記コマンドを実行してopenしてみるとwebサーバーはエラーを返すはず。

$ heroku ps:scale web=0
$ heroku open

同様に下記コマンドでとりあえずは復活するはず

$ heroku ps:scale web=1
$ heroku open

Declare app dependencies

アプリケーションの依存関係宣言?

herokuはrootディレクトリにあるGemfileによってrubyアプリケーションだと認識しているらしい。
サンプルAPPはすでのGemfileを持っている。下記みたいな感じになっているはず。

source 'https://rubygems.org'
ruby '2.2.5'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.2.5'
# Use postgresql as the database for Active Record
gem 'pg'
gem 'rails_12factor', group: :production
# Use SCSS for stylesheets
gem 'sass-rails', '~> 4.0.3'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
...

今回のサンプルのGemfileはpostgressqlにのみ最初にインストールが必要でそれをローカルにインストールする必要がある。
そこらへんは適当にやっといてください。
ちなみにインストールだけならbrew install postgresqlで終わるはず。
後は知らん。

bundle installでローカルにも依存関係のある色々をインストールする。
これでローカルでもこのAppが動く準備は整った…はず。

1回目やった時ここら辺で実は詰まった。
localにインストールされてるrubyのバージョンが2.3.2だったのとpgがローカルになかった。
2回目で英語ちゃんと読んだらpgインストールしとけよって書いてあったやん…。
チュートリアル用に2.2.5のインストールと2.2.5用のbundlerのインストールとpgのローカルインストールをして解決(brew install postgresql)
と思いきや動かなかった。
なんでやっと思ってたらpgが起動してなかった。

Run the app locally

ローカルでAppを実行する。

そのためにはローカルでは色々とやることがある。
このサンプルではデータベースはPostgresを使っている。ローカルへのインストールについての諸々はこちら4を参照。
なんかローカルとDBの内容を合わせる方法みたいなことかいてあるぞ…まぁいいや。

rakeを使ってデータベースをローカルにも作る。

bundle exec rake db:create db:migrate

あれ?
なんか一回目はデータベースが起動してなくてここで詰まった気がする。
Postgres起動(postgres -D /usr/local/var/postgres)してないとうまく動かないのはここかな?
今回は起動してたからかなんの問題もなくうまくいきました。

ここまでくるとherokuコマンド使ってローカルを起動できるはず。

heroku local web

うまくいってればhttp://localhost:5000でローカルで起動しているはず。
通常通り、コントロール+cで抜けれるよ。

Push local changes

ローカルでの変更をpushしようぜ。
Gemfileを編集して、gem 'cowsay'を追加する。下記みたいな感じ。

Gemfile
source 'https://rubygems.org'
ruby '2.2.5'

gem 'cowsay'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.2.5'
...

app/views/welcome/index.erbをこのgemを使った形に変更する。

index.erb
<pre>
<%= Cowsay.say("Hello", "Cow") %>
</pre>
...

ローカルで実行してみる。

$ bundle install
$ heroku local

ローカルで可愛い牛さんが挨拶してくれている。http://localhost:5000

では次にローカルでの変更をherokuにdeployする。
つってもやることは簡単。
gitに変更をcommitして、pushするだけ。

$ git add .
$ git commit -m "Demo"
$ git push heroku master
$ heroku open

web上でも変更が確認できただろうか?

Provision add-ons

アドオンについて。つらつらとどういうものか書いてある。
ここら辺は読んでるけど訳さないので適当にどうぞ。

誤訳があるかもしれないけど、簡単にだけ。
アドオンはサードパーティー製のクラウドサービス。ログイン無しにあなたのサービスのモニタリングだったり色々やってくれる。
herokuは基本的に1500行文のログを保存しててくれるんだけど、アドオンとして提供されているものには全部の諸々のログ(search, and email and SMS alerts.)を保存してくれるものがある。

今回はその中の一つPapertrailの導入をしてAdd-onsについて学ぶらしい。

まずはPapertrailをherokuに作る。

heroku addons:create papertrail

乱用防止のために、add-on提供にはアカウント認証が必要になリます。
まぁクレジットカード情報の登録ですね。
必要があれば直接登録しにいってください。(アカウント認証できる場所
私は登録しちゃってるのですんなりいきましたけど、無理そうならこの行程できないのかな? add-onの提供だけ?利用もかな?
よくわからないですけど。

とりあえず上の実行するとadd-onが展開されてアプリケーションに設定がされているはず。下記コマンドでAppのAdd-onリストを見ることができます。

$ heroku addons

後これでPapertrailのコンソール画面を開けます。

$ heroku addons:open papertrail

このアドオンの動きを見たければ、herokuのアプリにアクセスしてみればログが吐き出されるはずです。反映にはちょっと時間かかるかも。

Start a console

コンソールを始める…?
ちょっとここよくわからない。
one-off dynoについてがよくわかんない。
とりあえずコンソールで色々できるよってことかな。
あ〜・・・対象の環境で一度限りのdynoとしてコマンドを実行できるってことか。

$ heroku run rails console

上のコマンドでやった場合はrailsの環境をその場限りの環境として作成してconsoleでコマンドを実行できるってことかな、多分。

もしError connecting to processが出る場合はfirewallの設定が必要らしい。
出ないのでスルー。

irb(main):001:0> puts Cowsay.say("hi", "Cow")
 ____ 
| hi |
 ---- 
      \   ^__^
       \  (oo)\_______
          (__)\       )\/\
              ||----w |
              ||     ||
=> nil
irb(main):002:0> exit

exitでコンソールを抜ける。
さっきはrailsでやったけど、bashを指定した場合はshellを開けます。

$ heroku run bash
Running bash on ⬢ evening-tor-82984... up, run.6383 (Free)
~ $ ls
app	  config     Gemfile	   log	     Rakefile	tmp
app.json  config.ru  Gemfile.lock  Procfile  README.md	vendor
bin	  db	     lib	   public    test
~ $ vim Gemfile
bash: vim: command not found
~ $ exit
exit

vimなかった・・・。
でもあれか実行してるherokuの環境の中でできる内容なのかな。
ここら辺詳しくはこちら(one-off dyno)らしい。
あとでちゃんと読むかも。読まないかも。読まないと思う。使わないし。

Define config vars

環境変数定義関連のあれこれ。
詳しくはこちらを参照(config vars)
まぁ環境変数を設定することで色々便利だよと。
試しに使ってみようぜという内容。

まずはapp/views/welcome/index.erbを編集というか下記のように一番上らへんに追記。

<% for i in 0..(ENV['TIMES'] ? ENV['TIMES'].to_i : 2) do %>
  <p>Hello World #<%= i %>!</p>
<% end %>

heroku localでは自動的に.envファイルの中のコンテンツを読み込んで環境変数として利用するらしい?
herokuに同様の環境変数をセットするには下記。

heroku config:set TIMES=10

一応それぞれのアプリケーションのネット上の管理画面からも環境変数は設定できるよ!
内容をコンソールから確認したい場合は下記。

$ heroku config

Use a database

データベースを使う。
なんかデータ保管用のadd-onはmarketplaceにいっぱいあるよと。
Redis/MongoDB/Postgres/MySQLなどなど。
今回はrailsで勝手にごにょごにょしてくれるfreeのpostgresについて学ぶらしい。
CLIでaddonsってやると利用してるadd-onの一覧が見れるので見てみようねと。

$ heroku addons

configのリストを見ると勝手にdbで使われてるURLを教えてくれるよ。
herokuで提供されてるpgコマンドを使うともっと色々な情報が見れるよ。

$ heroku pg
=== DATABASE_URL
Plan:        Hobby-dev
Status:      Available
Connections: 0/20
PG Version:  9.6.1
Created:     2017-01-30 10:49 UTC
Data Size:   7.2 MB
Tables:      0
Rows:        0/10000 (In compliance)
Fork/Follow: Unsupported
Rollback:    Unsupported

まぁ色々情報を確認できるよねと。

サンプルアプリではすでにデータベースの機能を持っているらしい。試しにアプリケーションを開いてURLに/widgetsを加えてみよう。
エラーページが現れると思う。heroku logsかPapertrailでエラー内容を確認すると大体こんな感じになってると思う。

$ heroku logs
...
2017-02-01T20:44:40.993070+00:00 app[web.1]: Started GET "/widgets" for 111.106.184.81 at 2017-02-01 20:44:40 +0000
2017-02-01T20:44:40.995614+00:00 app[web.1]: Processing by WidgetsController#index as HTML
2017-02-01T20:44:41.003190+00:00 app[web.1]:   Rendered widgets/index.html.erb within layouts/application (4.7ms)
2017-02-01T20:44:41.003725+00:00 app[web.1]: Completed 500 Internal Server Error in 8ms (ActiveRecord: 1.7ms)
2017-02-01T20:44:41.006703+00:00 app[web.1]: 
2017-02-01T20:44:41.006706+00:00 app[web.1]: ActionView::Template::Error (PG::UndefinedTable: ERROR:  relation "widgets" does not exist
...

まぁテーブルがないよっていうエラーだよね。作ってねぇもん。
というわけでrake db:migrateコマンドを使ってテーブル作ってみようぜと。
あれ?こういう時に使うのかone-off dyno...

$ heroku run rake db:migrate
Migrating to CreateWidgets (20140707111715)
== 20140707111715 CreateWidgets: migrating ====================================
-- create_table(:widgets)
   -> 0.0137s
== 20140707111715 CreateWidgets: migrated (0.0139s) ===========================

これやった後にさっきのURL(https://your-url/widgets)に飛ぶと見れるようになってるはず。
ローカルでもrake db:migrateすれば動くようになるよ。
DBの中身は下記コマンドでherokuのpostgresにアクセスできるからそこで確認してね。

$ heroku pg:psql

::DATABASE=>  select * from widgets;

もっと多く知りたければ[Heroku PostgresSQL](https://devcenter.heroku.com/articles/heroku-postgresql)を見るといいよ。

psqlからexitでもCtr+cでも抜けられなくてちょっと焦ってしまった。
検索したらstackoverflowでみんな困っててわろた
How to exit from PostgreSQL command line utility: psql
¥q+enterで抜けれるってさ。

evening-tor-82984::DATABASE-> \q
ruby-getting-started $ 

Next steps

・Herokuがどのように動いているかの技術的な概要を知りたい場合はHow Heroku Works
・Rubyについてさらに多くを知りたい場合はRuby categoryを訪れるといいよ
・HerokuでRubyのさらに深く潜りたい場合は[Getting Started with Rails 4.x on Heroku]もしくは[Getting Started with Ruby on Heroku]を読むこと

以上、流しで1回目やってから4日もかかってしまった…。
ただ、理解してない部分は大体理解できたかなって感じ(one-off dyno抜かして)
これ全部やると大変だなぁ。でも理解にはちょうどいいかなとは思う。

  1. すごい大きい会社の会員情報みたいなものをごにょごにょするのにこれ使えと指定されて作ったんだけどあういうのに使うには不向きな言語なんじゃないかなぁ?どうなんだろう。あと正確にはたぶんrails?になるの?よくわかんないけど。

  2. どうでもいいけど普通に展開するって言っちゃダメなの?まぁ若干ニュアンスが違う・・・のか?

  3. 自分のGITアプリをherokuに乗っけてみたら同じだった(pgじゃないとダメとか、そもそもローカルにpgがないとか色々戸惑ったけど上手くいきました。)

  4. これ見りゃ良かったやん!

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?