読者です 読者をやめる 読者になる 読者になる

SideCI Blog

自動コードレビューサービスSideCIを提供している株式会社アクトキャットのコーポレートブログです。



Upgrade Rails4.1.x RSpec2.9.x to Rails4.2 with RSpec 3.0.x

Ruby Other

Rails4.1系、RSpec2.9系を使用しているRuby on RailsプロジェクトをRails4.2系、RSpec3系にアップグレードする手順をご紹介します。

というのも、今見て頂いているこのブログの「SideCI」の主な部分を実際にRails4.1系、RSpec2.9からRails4.2系、RSpec3系にアップグレードしたので、その時に参考にしたサイトや手順をご紹介しようと思った次第です。

アップグレードの前提

アップグレードにあたって、今回は下記のような前提で記事は書いていきたいと思います。

  • Ruby on Rails 4.1系 もしくは 4.0系を利用している
  • RSpec 2系を利用している
  • RSpec 3系に反対するメンバーを説得する・サポートする
  • ついでにRubyもアップグレードしちゃう

所要時間

テストコードなどが十分に書いてあれば、おおよそ半日程度あれば、アップグレード・リリース・動作確認など出来るのではないかな?と思います。私達のプロジェクト、SideCIの主系のアップグレードは半日程度で完了しました。

ただし、いくつかのプロジェクト・レポジトリについてはアップグレード出来ませんでした。これは依存するRubyのGemがActiveRecord4.1系にロックされているなどが原因です。Gemそれぞれに4.2系に対応したForkを作ってPull Requestをするなり、Forkしたレポジトリの方からインストールするなりすればよいです。それほど長期的に使うレポジトリではなかったので、私達の場合は、そのレポジトリについてはアップグレードは見送りました。

実施手順

サマリ

主には下記のような手順・大項目でアップグレードを実施すると良いと思います。

  1. Rubyのアップグレード
  2. Ruby on Railsのアップグレード
  3. RSpecのアップグレード
  4. RSpecコードの修正

Rubyを最初にアップグレードしているのは、動作への影響がRailsの変更ほどには大きくないと判断したからです。RailsをRSpecより先にアップグレードしているのは、Rails4.2系とRSpec2.9系でも動作には問題ないこと、Rails4.2系に移した時に正常にテストを実施したいことが理由です。RSpecの3系でのアップグレードは、一時的にほとんどすべてのRSpecコードが修正なしには動かなくなります。。

Rubyのアップグレード

rbenv+rbenv-build、もしくはrvmを使ってる想定で書きます。
まずはGemfileでRubyのバージョンを指定しちゃいましょう。

ruby "2.2.0"

続いてインストール。事前にrvmやrbenvは最新にアップグレードをおすすめします。 rvm:

$ rvm install 2.2.0
$ rvm use 2.2.0 --default

rbenv+rbenv-build:

$ rbenv install 2.2.0
$ rbenv local 2.2.0 #or rbenv global 2.2.0

あとはbundle installして、gitなりにcommit, githubなりにpush、RSpecなどのテストコードでテストをしましょう。SideCIでテストしてくれると私はとっても嬉しいです!w

Railsのアップグレード

公式ドキュメント通りにやるのがほんとお勧めです。記事見るより、公式ドキュメントが一番です。 日: Rails アップグレードガイド | Rails ガイド

英: A Guide for Upgrading Ruby on Rails — Ruby on Rails Guides

ドキュメント通りにやって、あとはまたgitなりにcommit, githubなりにpush、RSpecなどのテストコードでテストをしましょう。SideCIでテストしてくれると私はとっても嬉しいです!w

Gemの依存関係などで詰まったら、Gemの開発コミュニティを訪れるのが良いと思います。

  1. Rubygems.orgで対象のgemを検索 / Googleで検索 / GitHubで検索 などでコミュニティの場所を補足
  2. 大体は4.2とかでIssueを検索すると、既にOpenなIssueがありました。(それだけ4.2がメジャーになってきているという肌感です
  3. Issueを読んで、Close(最新版がリリース済み)だったら、そのバージョンに変えればいいのでラッキー。そうでなくても、branchが作ってあったりするケースもあり、とにかくIssueを見ればだいたいわかります。
  4. 分からない時はgemspecファイルを見るか、毎回bundle installでエラー文を表示させて、そのエラー文から依存関係を修正していくかしましょう。
  5. コミュニティが活発でサポートされていない時には、Forkして自分で作るしか有りませぬ。。。

RSpecのアップグレード

事前に2.99にRSpecのアップグレードをし、テストを実施することで、3.0で廃止される構文などが一覧して表示出来ます。が、私はそれを無視しました。。

なぜなら、構文系の大半を自動で修正してくれる GitHub - yujinakayama/transpec: The RSpec syntax converter というGemがあることを知っていたからです!(紹介してくれていた記事の皆さんありがとう! なので無視して3.0にアップグレードを先にやっちゃいました。

RSpecのアップグレードは下記のドキュメントが最も参考になりました。RSpecとRailsの兼ね合わせを踏まえてのアップグレード方法になっているのでお勧めです。

Upgrade - RSpec Rails - RSpec - Relish

こちらの日本語記事も大変参考になりました。

既存のRailsプロジェクトをRSpec 3.0にアップグレードする際の注意点 ~RSpec 3は怖くないよ!~ - Qiita

ここでもまた、テストコードを試してほしいところですが、errorが出まくると思います。

RSpecコードの修正

先のtranspecの出番です。Star600超えの、Fork多数の活発なGem・コミュニティです。これで私達のRSpecのコードの単純な構文の間違いはこれでほぼ一括して置換出来ました。

3.0でrspec-collection_matchersというGemに実装が分離された書き方も継続して使いたかったので、こちらのGemの追加も行いました。

おわり

基本たったこれだけの感じでスムーズに移行出来ました。Gitブランチを切ってやる分にはまったく既存プロジェクトに影響はないので、みなさんも試しにやってみてはいかがでしょうか?

アップグレードの際にテストをガンガン実施すると思いますが、その際はSideCIでテストしてくれると私はとっても嬉しいです!w