はじめに
サービス開発統括本部で、運用系の業務担当している寺田です。 主にOptimal Remote等のサービスを担当しています。 Ruby 1.8.7 + Rails 2.3.xで動いていたアプリをRails LTSを利用してRuby 2.5.5で動作させました。 実施した際のメモやハマった点を以下に記します。
課題
OPTiMでは10年以上Ruby on Railsを利用しており、主要なサービスに於いては、随時RubyおよびRailsのバージョンアップを行っていますが、あるサブシステムにおいて、Ruby 1.8 + Rails 2.3のままアップデートがされていない状態となっていました。セキュリティ面やOSのバージョンアップを考えると、バージョンアップを行うべきなのですが、相応の工数がかかることが予想されます。 そこで、解決策としてRails LTSの導入を検討しました。
Rails LTSについて
Rails LTSは、makandra社がRailsのコミュニティに変わり、セキュリティアップデートや、 Ruby 2.xの対応を行い提供している物です(執筆時ではRails 2.3 LTSがRuby 2.5.xまでサポートされています)。 Rails LTSを利用することで、既存のアプリを大きく修正せずに、サポートが行われているRubyのバージョンにアップデートができることや、 Rails自体のセキュリティパッチが提供されることが期待されるため、Rails LTSの導入を試してみました。
導入手順
- Gemfileやtestコードが無い場合は、それぞれを作成する。
- Installing Rails 2.3 LTS with Bundlerに従い、Rails 2.3.16からRails LTSに置き換える。
- Rails LTSで起動を確認後、Ruby 2.5 support for Rails 2.3 LTSを参考にRuby 2.5へアップデートを行う。
- 各種gemの更新を行う、もしくはサポートされていないgemはGemfileから削除する
./script/server
や./script/console
実行時のエラーを潰す- rspecですべてのテストが通るまで、修正をする
- capistorano3に対応するようにCapfile等を書き直す
以下、ハマった点について記載します。 下記2つは、実行時にエラーが出ず、rspecを実行するまで、 正常に動作していないことに、気が付きませんでした。
1. configatronがyamlを読み込まなくなった。
Gemの更新によりconfigure_from_yaml
が使用できなくなったため、
下記のようにconfigure_from_hash
に置き換えました。
-configatron.configure_from_yaml("#{RAILS_ROOT}/config/config.yml", :hash => 'setting') +configatron.configure_from_hash(YAML.load_file("#{Rails.root}/config/config.yml")['setting'])
2. Squirrelを利用した絞りこみがされなくなった。
users = User.find(:all) do id == params[:id] if params[:id].present? paginate :page => params[:page], :per_page => params[:rows] if params[:sidx].present? order_by "#{User.table_name}.#{params[:sidx]} #{params[:sord]}" end end
上記のような検索およびページネーションを行うコードがあったのですが、
Rubyをアップデートしたことにより、
検索条件に関わらずUser.find(:all)
の結果が返されるようになりました。
Squirrelは、現在サポートされていないため、Squirrel依存のコードをすべてfind(:all, :conditions: condition)
を利用したコードに置き換えました。
おわりに
今回は、サポートされていないGemや、アプリ自体のコード量が多くはなかったため、 あまり苦労せず、Ruby 2.5にアップデートを行うことができました。 また、Rails 5.xにアップデートを行うよりも遥かに少ない時間で、アップデートを行えました。 アプリを改修することは無いが、少しでもセキュアに保ちたい場合にはRails LTSの利用も検討してはいかがでしょうか。
OPTiMでは、技術的負債にエンジニアリングで戦えるエンジニアを募集しています。