目的
- Heroku を使いたい
- 同じコードを複数のバージョンの Ruby で実行したい
- そのためにバージョンの数だけレポジトリを作るとかはやりたくない
解決法
手順1
Gemfile
に以下を追記する
if v = ENV['CUSTOM_RUBY_VERSION'] ruby v end
手順2
Heroku の管理画面からCUSTOM_RUBY_VERSION
環境変数を設定する。
「Settings」タブの「Config Variables」セクションから設定可能。
例えば、Ruby 2.4.1 を使いたければ CUSTOM_RUBY_VERSION
に2.4.1
を指定する。
手順3
使いたい Ruby のバージョンの数だけ、Heroku 上に app を作成する。
以上
試行錯誤など
Specifying a Ruby version via the environment A Gemfile is made of up Ruby code, so you can also specify your Ruby version in the environment. For example:
ruby ENV['CUSTOM_RUBY_VERSION'] || '2.2.4'
https://devcenter.heroku.com/articles/ruby-versions#specifying-a-ruby-version-via-the-environment
ここに解決方があるが、上記のコードだとうまく動かなかった。
何故ならば、上記のコードでは環境変数が指定されていない場合 Ruby 2.2.4 が使われる。
そのため、ローカルでbundle install
した際にGemfile.lock
に以下のようなセクションが追加されてしまう(例は Ruby 2.4.1 のもの)。
RUBY VERSION ruby 2.4.1p111
そしてここに指定されている Ruby のバージョンとGemfile
に指定されている Ruby のバージョンが異なる場合、bundle install
が失敗するため、特定の Ruby のバージョンでしかデプロイが成功しなくなる。
最初、回避策としてGemfile.lock
を Git リポジトリから削除してみたが、今度はデプロイの際にGemfile.lock
ファイルが必須だと怒られて失敗した。
そのため、解決法のコードを使用し、CUSTOM_RUBY_VERSION
環境変数が指定されていなければ Ruby のバージョンを指定しないように変更した。
これによりGemfile.lock
から上記のセクションは消え去った為、どのバージョンの Ruby でもbundle install
が通るようになった。