なおすけの落書き帳

毎日がエブリデイ。

CentOS6.9でもRuby2.5.0でRails5.1.4したい!

ブログタイトルがバージョン番号ばっかになってる…w

表題の通り、CentOS6系列にRuby2.5+Rails5.1.4のアプリケーションをデプロイした話です。
普通にやると、CentOS6ではRuby2.5.0は動きませんでした。それの解決策です。

tl;dr

  • devtoolset-3以降をyum install
  • devtoolsetを有効にし、gcc4.9になっていることを確認
  • ruby-2.5.0で./configure && make && make install
  • devtoolsetを有効にしたままbundle install

何が起こったか

CentOS 6.9でRuby2.5.0をインストールしようと、rbenv install 2.5.0した時に、prelude.oでmakeがエラーを吐いて止まりました。 調べてみるとこんなissueが…

bugs.ruby-lang.org

duplicateで消されていたので、重複元はここ

bugs.ruby-lang.org

一応パッチが中田さんによって作成されており、修正済みでした。じゃあ別に動くじゃん。
とおもったら、最後に卜部さんのコメントが。

There are good news and bad news.

The good news is the fix has already merged into 2.5 so next release includes it. However, there can be security releases at any unpredictable moment. So no, we can't tell you when the next version will come.

まあ要するに、いつそれがリリースされるかがわからないって状態だそうです。
とはいえ、もうプロダクトをデプロイしないといけないので、動かないとは言えないわけです。

解決方法の模索

中田さんのコミットのメッセージにヒントが有りました。

bugs.ruby-lang.org

prelude.c.tmpl: get rid of errors with old gcc

どうやらold gccでエラーが発生するらしい。
確かにCentOS6に乗っているgccは4.4系列なので、そんなに新しいとはいえません。
とはいえ、CentOS7では同様のバグは発生指定なさそうな雰囲気を感じて調べてみると、

$ gcc -v
gcc version 4.8.5 20150623

これだ…! というわけで、GCC4.8だと動くということがわかりました。
問題は、CentOS6にどうやってGCCを入れるか、という話です。

解決方法

devtoolsetのインストール

調べると、こんなページを見つけました。devtoolsetってのを使うとうまくいくらしい。

www.task-notes.com

そんなわけで、インストール

# yum install devtoolset-3

インストールが終わったら、devtoolsetを有効化

# scl enable devtoolset-3 bash
# gcc -v
gcc version 4.9.2 20150212 (Red Hat 4.9.2-6) (GCC)

ヤッター!

Rubyのインストール

devtoolset-3をenableしたあと、rubyをインストールします。

# ./configure && make && make install 

これでエラーをはかなくなりました!

Railsでも…?

Railsプロジェクトを引っ張ってきて、早速bundle install を叩いてもエラーが…(スクショ貼り忘れた)
エラーの内容は、therubyracerがうまくインストールできたないというものでした。

therubyracerって、JSのV8エンジンなので、内部的にC++がいっぱい使われています。
そのため、c++コンパイラであるg++が割と新しくないと動かないです。
「じゃあg++インストールか〜…」まってください、さっきいいもの入れましたよね?
以下のコマンドでうまくいきます。

$ scl enable devtoolchain bash
$ bundle install --path vendor/bundle

まとめ

素直にCentOS7を使いましょう、と思いました。
パッチはそのうち降ってくると思うので、緊急手段として使ったほうがいいのかもしれません。


Acknowledgement

  • この作業は id:wakatakeru と実施していました。彼がいなければ僕が爆発していました

参考文献