ブログタイトルがバージョン番号ばっかになってる…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が…
duplicateで消されていたので、重複元はここ
一応パッチが中田さんによって作成されており、修正済みでした。じゃあ別に動くじゃん。
とおもったら、最後に卜部さんのコメントが。
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.
まあ要するに、いつそれがリリースされるかがわからないって状態だそうです。
とはいえ、もうプロダクトをデプロイしないといけないので、動かないとは言えないわけです。
解決方法の模索
中田さんのコミットのメッセージにヒントが有りました。
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ってのを使うとうまくいくらしい。
そんなわけで、インストール
# 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 と実施していました。彼がいなければ僕が爆発していました