Rails5つづき / Git

こちらも少しずつ進めている、Ruby on Rails チュートリアル - 実例を使ってRailsを学ぼう を見ながら、チュートリアルのメモです。

今回はソースコードをGitの管理下に置くこと、Bitbucketのプライベートリポジトリにソースコードを登録すること、そしてHerokuへデプロイするまで。

さすがにBitbucketは慣れているので、そんなに問題は無し。 それよりも、Railsのチュートリアルでも、GitHubではなくて Bitbucketのリポジトリを勧めているのが「むむ!」と思いました。

個人で無料でプライベートリポジトリが持てるというのは、学習中にとってはやはりとてもありがたいのですよね….。

Herokuへデプロイ

Railsアプリケーションのデプロイと言えばHeroku, が思い浮かびますが、Engine Yard Cloudというのもあるのですね。

まずは既にインストール済みのherokuのCLIを確認。 このままheroku updateでアップデートできるので、更新しておきます。

$ heroku version
heroku-gem/3.43.16 (x86_64-darwin16) ruby/2.3.2
heroku-cli/5.6.22-f9f7585 (darwin-amd64) go1.7.5
You have no installed plugins.

$ heroku update
heroku-cli: Updating to 5.8.9-8573dea... 15.6 MB/15.6 MB
heroku-cli: Updating plugins... done
 !    `heroku update` is only available from Heroku Toolbelt.
 !    Download and install from https://toolbelt.heroku.com
mb:hello_app akiko$ heroku version
heroku-gem/3.43.16 (x86_64-darwin16) ruby/2.3.2
heroku-cli/5.8.9-8573dea (darwin-amd64) go1.7.5
You have no installed plugins.

$ heroku version
heroku-gem/3.43.16 (x86_64-darwin16) ruby/2.3.2
heroku-cli/5.8.9-8573dea (darwin-amd64) go1.7.5
You have no installed plugins.

つぎに、heroku loginして、herokuのアプリケーション作成。 heroku create だとランダムな名前が割当たるようですが、今回はapps:create で名前を明示して作成してみます。

※ アプリケーションはherokuのリポジトリに登録されるので、名前は https://git.heroku.com/ 以下でユニークになる名前でないとダメそうです…。 (Rails5のチュートリアルのhello-appはすでに存在してた&名前には “_” は使えないそう)

とりあえず、こちらで作成。

$ heroku apps:create akiko-hello-app
Creating ⬢ akiko-hello-app... done
https://akiko-hello-app.herokuapp.com/ | https://git.heroku.com/akiko-hello-app.git

Herokuの画面でも空のアプリケーションが確認できました。

image

さて、herokuのアプリケーションとして登録すると、Gitのリモートリポジトリにherokuが追加されました! originはBitbucketですが、herokuも登録されています。

$ git remote -v
heroku	https://git.heroku.com/akiko-hello-app.git (fetch)
heroku	https://git.heroku.com/akiko-hello-app.git (push)
origin	git@bitbucket.org:akiko_pusu/hello_app.git (fetch)
origin	git@bitbucket.org:akiko_pusu/hello_app.git (push)

git push heroku してみる

さっそくherokuに登録してみますが….。

$ git push heroku master
Counting objects: 90, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (75/75), done.
Writing objects: 100% (90/90), 19.61 KiB | 0 bytes/s, done.
Total 90 (delta 5), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Ruby app detected
remote: -----> Compiling Ruby/NoLockfile
remote:  !
remote:  !     Gemfile.lock required. Please check it in.
remote:  !
remote:  !     Push rejected, failed to compile Ruby app.
remote:
remote:  !     Push failed
remote: Verifying deploy...
remote:
remote: !	Push rejected to akiko-hello-app.
remote:
To https://git.heroku.com/akiko-hello-app.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/akiko-hello-app.git'

Gemfile.lockが無いので怒られて失敗してしまいました! Gitのグローバルな設定で、Gemfile.lockはignoreに含める設定になっていたのですね…。

あらためて、Gemfile.lockをこのリポジトリではファイルに含めるようにして、pushしなおし。

$ git push heroku master
Counting objects: 93, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (78/78), done.
Writing objects: 100% (93/93), 21.05 KiB | 0 bytes/s, done.
Total 93 (delta 6), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Ruby app detected
remote: -----> Compiling Ruby/Rails
remote: -----> Using Ruby version: ruby-2.3.4

... [中略] ...

remote:        https://akiko-hello-app.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/akiko-hello-app.git
 * [new branch]      master -> master

デプロイされたようです。良かった…。

ということで、再確認。

$ heroku apps:info akiko-hello-app
=== akiko-hello-app
Addons:         heroku-postgresql:hobby-dev
Auto Cert Mgmt: false
Dynos:          web: 1
Git URL:        https://git.heroku.com/akiko-hello-app.git
Owner:          akiko.pusu@gmail.com
Region:         us
Repo Size:      35 KB
Slug Size:      36 MB
Stack:          cedar-14
Web URL:        https://akiko-hello-app.herokuapp.com/

エラー画面になっている!!

ブラウザでアクセスしてみると…. ああ、エラー画面!

image

ここでもう挫折したいのですが、とにかくログが、ログがあればなんとかなります。 コマンドを確認すると、heroku logsというのがあるので、早速確認。

$ heroku logs -t

2017-04-26T23:21:19.953264+00:00 heroku[router]: at=info method=GET path="/" host=akiko-hello-app.herokuapp.com request_id=bb76e551-4da6-41ff-9bbb-85fdecec9da8 fwd="160.13.230.224" dyno=web.1 connect=0ms service=6ms status=404 bytes=1744 protocol=https
2017-04-26T23:21:19.943692+00:00 app[web.1]: I, [2017-04-26T23:21:19.943580 #4]  INFO -- : [bb76e551-4da6-41ff-9bbb-85fdecec9da8] Started GET "/" for 160.13.230.224 at 2017-04-26 23:21:19 +0000
2017-04-26T23:21:19.944653+00:00 app[web.1]: F, [2017-04-26T23:21:19.944597 #4] FATAL -- : [bb76e551-4da6-41ff-9bbb-85fdecec9da8]
2017-04-26T23:21:19.944790+00:00 app[web.1]: F, [2017-04-26T23:21:19.944677 #4] FATAL -- : [bb76e551-4da6-41ff-9bbb-85fdecec9da8] ActionController::RoutingError (No route matches [GET] "/"):
2017-04-26T23:21:19.944850+00:00 app[web.1]: F, [2017-04-26T23:21:19.944808 #4] FATAL -- : [bb76e551-4da6-41ff-9bbb-85fdecec9da8]
2017-04-26T23:21:19.944968+00:00 app[web.1]: F, [2017-04-26T23:21:19.944889 #4] FATAL -- : [bb76e551-4da6-41ff-9bbb-85fdecec9da8] vendor/bundle/ruby/2.3.0/gems/actionpack-5.0.2/lib/action_dispatch/middleware/debug_exceptions.rb:53:in `call'

なにやら、routeが無いと…。 ローカルの環境では、ルートのページを指定せず、デフォルトのWelcome画面でも大丈夫みたいですが、deploy先では、rootを明示しないといけないのかな?

Rails.application.routes.draw do
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
  root 'application#hello'
  get :hello, to: 'application#hello'
  get :goodby, to: 'application#goodby'
end

上記のように、rootを明示して、なんとかエラーが回避されました。良かった…