bitbacket+codeship+rubyとかいう個人向けでできる最低限の開発環境を整えよう企画。
ここにherokuを付け加えるべくとりあえずHeroku dev centerにあるGetting Started on Heroku with Rubyに挑戦した。
二回目をじっくりどういうものか理解しながらやるついでにQiitaに意訳しながら書くとさらに理解が深まるメソッドを利用しています。
ちなみにrubyはやったことあるけど1、いつも通り完璧に忘れているのでこれも初めてみたいな感覚で使います。
では行ってみよう。
適当に訳しているし大部分意訳なので間違いがあれば指摘していただけるとありがたい。
- Introduction
- Set up
- Prepare the app
- Deploy the app
- View logs
- Define a Procfile
- Scale the app
- Declare app dependencies
- Run the app locally
- Push local changes
- Provision add-ons
- Start a console
- Define config vars
- Use a database
- 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'
を追加する。下記みたいな感じ。
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を使った形に変更する。
<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抜かして)
これ全部やると大変だなぁ。でも理解にはちょうどいいかなとは思う。