CentOSでrbenvを使ってバッチのRubyバージョンを切り替える
Motivation
Ruby1.8.7で作った大量のバッチがある。 それを1.9(さらには2.0)に移行していきたいんだけど、 一気に移行するまで待ってると時間がかかるので、 少しずつ移行したい。また、同じサーバ内で並行運用したい。 そこで、rbenvで複数のRuby環境を用意し、切り替えて運用したい。 バッチは全てcronで動いているので、cron環境でのPATHをうまく設定すればいけるはず。
環境
CentOS6.4
事前準備
gitをインストール
1
|
|
epelをインストール
後で必要になるライブラリを入れるため、EPELを追加しておきます。
1 2 3 |
|
rbenv
参考:CentOSでsystem wideなrbenv+ruby-build環境を構築する
rbenvをインストール
rbenvとruby-buildを/usr/localの下にインストールします。
1 2 3 4 5 6 7 8 9 10 |
|
環境変数を設定
グローバルな環境変数にrbenvへのパスを追加。
vi /etc/profile.d/rbenv.sh
1 2 3 |
|
書いたら読み込みます。
1
|
|
インストール可能なruby一覧を見てみる
1
|
|
ruby install
依存ライブラリのインストール
1
|
|
ruby自体のインストール
ここでは以下の3つのバージョンを入れてみます。
1 2 3 |
|
(Dockerの場合のみ)fdのシンボリックリンク作成
Docker上のCentOS6.4で試していたらエラーが出るので、以下のコマンド実行
参考:unable to set global or or local ruby on freebsd
1
|
|
インストールされたrubyの確認
1
|
|
globalのrubyバージョン設定
1 2 |
|
localのrubyバージョン設定
1 2 |
|
rbenv-rehash,bundlerのインストール
いちいちrehashするのも面倒なので、自動でrehashしてくれるrbenv-rehashを入れます。 ついでに後々必要になるbundlerも入れておきましょう。 インストールした全てのバージョンで行なっておく必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
Rubyバージョン設定
それぞれのディレクトリでrbenv local
以下のようなディレクトリ構成で、batch_18はRuby1.8、 batch_19はRuby1.9で動かしたいとします。 exec_batch_a.shはバッチを起動するためのshellスクリプトです。
1 2 3 4 5 6 7 8 9 10 |
|
この場合、それぞれのディレクトリに入って、rbenv localでRubyのバージョンを指定します。 これで、それぞれのディレクトリに.ruby-versionが作成されるはずです。 同時にbundlerでgemを入れておきますが、ここではpathを指定せず、グローバルに入れていしまいます。 このあたりは必要に応じて変えてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
Gemfileはここでは普通に作成していますが、クックパッドさんでは バージョンごとのGemfileを作成して管理しているようで、参考になります。
Cookpad の本番環境で使用している Ruby が 2.0.0-p0 になりました
起動shell
バッチ実行前に意図した.ruby-versionが有効となるディレクトリに移動したいので、 起動shellは以下のような感じにしました。
1 2 3 4 5 6 7 8 |
|
確認
使いたいRubyが本当に使えているか、確認します。 BatchAのmainは、RUBY_VERSIONをputsするだけのメソッドです。
1 2 3 4 5 |
|
cronの設定
rbenvをglobalにインストールしているので、上記参考先とは rbenvのbinとshimsのpathが異なるので注意してください。 PATHに/usr/local/rbenv/binと/usr/local/rbenv/shimsを追加します。
crontab -e
1 2 3 4 5 |
|
以上でcronから実行されるバッチのRubyバージョンを切り替えることができました。