pockestrap

Programmer's memo

Heroku で1つの GitHub リポジトリで複数バージョンの Ruby を使う

目的

  • 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_VERSION2.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が通るようになった。