【プログラミング】Ruby on Railsでherokuにデプロイできない時の設定方法

Ruby on Railsチュートリアルと格闘していると、さも当たり前のように登場する「heroku経由でローカル環境をデプロイしてみよう」という文言。

 

初心者目線だと、herokuとは何か、ローカル環境をデプロイするための設定とは何かといった基本的なことから理解しないといけないのに、重要な説明の工程を端折られているので余計に分かり辛いことこの上ない。

色々と設定をいじってようやくheroku経由でローカル環境をデプロイするための設定が完了したので記録として残しておきます。

remote:  !     Failed to install gems via Bundler.
remote:  !     Detected sqlite3 gem which is not supported on Heroku:
remote:  !     https://devcenter.heroku.com/articles/sqlite3
remote:  !     Push rejected, failed to compile Ruby app.
remote: 
remote:  !     Push failed
remote: Verifying deploy...
remote: 
remote: !	Push rejected to desolate-island-03149.
remote: 
To https://git.heroku.com/desolate-island-03149.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/desolate-island-03149.git'

僕の開発環境での解決方法は以下のとおりです。

【前提条件】

Homebrew導入済み

rbenv導入済み(rvmと競合したためrbenvに統一)

ruby 2.7.0(rbenvにより設定)

ruby on rails 6.0.2.1(rbenvにより設定)

rbenvとrvmの競合と削除方法に関する記事は下のリンクから確認ください。

【プログラミング】rvmとrbenvがうまく共存できない上に邪魔し合っていたのでrvmを削除した

Rails6でrails sが動作しない場合の対処法は下のリンクから確認ください。

【プログラミング】Ruby on Rails6.0.2.1で「rails s」が起動しないので解決法を記録しておく

 

Rails newでアプリケーションを作成

rails new blogtest #アプリ名は好みで
cd blogtest #作ったアプリフォルダへ移動
rails g scaffold blog title:string body:text
#scaffoldでサンプルアプリ作成
rails db:migrate
rails s
#ローカルホストを立ち上げる

http://localhost:3000/blogsをURLに入力して実行。

サンプルで作成したアプリケーションが開いたら問題無し。

 

続いて、config/routes.rbに以下のコードを記述して保存。

Rails.application.routes.draw do
   resources :blogs
   root 'blogs#index'
#トップページをblogsコントローラのindexアクションに設定
end

root ‘blogs#index’を記述しておかないと、本番環境(herokuへデプロイした際)で「URLが正しくありません」と表示されるため注意。

「Homebrew経由でHeroku導入」と「Homebrew経由でpostgresql」が既に完了している場合は、2つの工程をスキップして構いません。

「sqlite3→postgresqlへの変更時の留意」内の処理を行ったら、bundle installを実行しましょう。

 

 

Homebrew経由でHeroku導入

まずはHomebrew経由でHerokuを導入します。

ターミナルで以下のコードを記述して実行。

brew tap heroku/brew && brew install heroku

少し待つと、自動的にHeroku環境がbrewに導入されます。

 

<留意事項>

事前にRailsチュートリアルに従って、”heroku create”を実行している場合、heroku上にアプリケーションが自動生成されているケースがあります。

Herokuの無料版では1ユーザーあたりの所有アプリケーション上限は5個までですので、それを超えている場合には、以下のURLより削除します。

【Heroku管理画面】https://dashboard.heroku.com/apps

削除する場合は、不要なアプリ名を選択→settings→画面下のdelete→ポップアップ内で不要なアプリ名をコピペしてdelete実行。

 

Homebrew経由でpostgresql導入

この工程に関する説明がRailsチュートリアルでは抜けています。pgエラーが頻発する場合は、この作業が抜けているケースが当てはまる可能性が高いので、しっかりとpostgresql導入を行いましょう。

 

ターミナルで以下のコードを実行

brew install postgresql

※完了したら無事にgem pg 1.2.2がインストールされる(時期によりバージョン名は異なる場合があります)

※Homebrewでバージョン管理しているため、postgresqlのgemはここでインストールする必要がある。

 

sqlite3→postgresqlへの変更時の留意

 

作成したrailsアプリケーション内のGemfileに以下のコードを記述

#gem 'sqlite3', '~> 1.4'は使用しないに変更(コメントアウト)

#ローカル環境ではsqlite3を使用(group: :developmentの記載により指示)
gem 'sqlite3', group: :development

#本番環境ではPostgreSQLを使用(group: :productionの記載により指示)
gem 'pg', group: :production

Gemfile内のコード記述変更が完了したら、変更内容を反映させるためにbundle installを実行します。

bundle install
#または
bundle install --without production
#Railsチュートリアルでは上のコードを推奨しているが、ローカル環境でエラー発生注意

ここまでできたらあと少しです。

 

config/databese.yml内の書き換え

 

これまでの作業が完了したら、作成したアプリフォルダ内にあるconfig/databese.ymlの中で以下のコードを記述します。

#以下の書き換えを実行(本番環境ではpostgresqlを用いるよう書き換えている)
#production=本番環境、development=開発環境(ローカル)

production:
  <<: *default
 adapter: postgresql
 encoding: unicode
 pool: 5

忘れずに上書き保存しておきましょう。

なお、=begin,=endはruby用のコメントアウト記法のため、.ymlでは正常に動作しませんでした(誤った記述を残すとエラーの元になるので注意)。

 

本番環境での動的な画像の表示をONにする設定

Railsでは本番環境での動的な画像の表示をデフォルトでOFFにする設定となっています。

これを際にONにするため、config/enviroments/production.rbを開いて以下の記述を修正します。

config.assets.compile = true

 

gitで管理するコードを記述して実行する

Herokuへデプロイする前に、gitで管理するコードを記述して実行しておきます。

git initは「このアプリケーションでgitを使用します」という宣言なので、実行は1アプリで1回だけで十分です。一方で、git add -Aとgit commit -mはアプリ内のファイルを変更した際には必ず実行する必要があります。

#ターミナルで以下のコードを順番に実行
#このアプリでgitを使用する宣言(1アプリ1回)
git init

#保存するファイルの選択-A = All(更新ごとに実行)
git add -A

#上でaddしたファイルの確定(上の流れで実行)
git commit -m "[コメント]"
#[コメント]はcommit -m(変更内容確定のログ用)
#git commit --amendでこれまでの変更確定ログを確認可能
#vim編集画面を中止する場合は、escキー→:q又は:q!でenter

 

Branchによる管理をしている場合

 

Branch管理している場合は、main(旧:master)に変更箇所をmerge(結合)した上でgit pushを実行する必要がある点に注意しましょう。

#ローカルファイル変更後
git checkout main 

git merge modity-README("変更を行ったブランチ名")

#上記のコマンドにより、main環境に変更箇所をマージする処理を実行
#その後
git push

#により変更箇所をgithubへmain環境で変更した内容をプッシュする

 

 

Herokuにデプロイしてみる

ここまでの一連の作業が完了したら、実際にheroku(本番環境)にrails newで作成したアプリケーションをデプロイしてみましょう。

heroku login
heroku create [アプリ名] 
#[アプリ名]は英数字と-のみ指定可能

【留意事項】

アプリケーションごとにheroku create [アプリ名]を行わないといけない(既に他のアプリと連動している[アプリ名]を指定したらエラーとなった)。

 

heroku create [アプリ名]による新規アプリの作成(heroku環境へのデプロイ準備)ができたら下のコードを記述して実行します。

git push heroku main

 

「Failed to install gems via Bundler.」の表示が出る場合

 

git push heroku main で「Failed to install gems via Bundler.」の表示が出る場合は、ターミナル上で以下の操作を実行します。

 

以下のコードをターミナルで実行

 gem update —system
 bundle update —bundler

 

GithubからHerouへアップロードする際に「Failed to install gems via Bundler.」が発生した場合

※原因:herokuのbundlerとローカルでのbundlerのバージョンに相違があるため

 bundle lock --add-platform x86_64-linux

 

確認のため、heroku openでデプロイが完了しているか確認します。

heroku open

実はこれだけだとまだ完成していません。

下のコードを記述して実行することで、heroku(本番環境)でのマイグレーションが完了するため、こちらの処理を忘れずに行いましょう。

heroku run rails db:migrate

今回はhttps://[アプリ名].herokuapp.comで正常に開発環境と同じ画面表示が確認できました。

 

Railsチュートリアルは無料で内容ぎっちりの素晴らしい教本なのですが、細かい部分の説明や初心者が陥りがちなエラーへの対処などへの説明が抜け落ちているのが辛いところですね。

 

この記事で書いた手順を一つずつ実行していくことで、開発環境で作成したRailsアプリケーションをローカルの開発環境とHeroku上の本番環境で表示することが可能になりますので、学習がストップしている方は一度試してみてください。

この記事も人気ですよ