2017年3月20日月曜日

【Rails5.1.0beta1】 Rails5.0.1からRails5.1.0beta1にアップグレードする。 Rails5.1.0更新の準備と調査

  • 公開日:2017年03月20日
  • 最終更新日:2017年05月05日

記事概要

rails5.0.1からRails5.1.0beta1にアップグレードした時の方法をまとめた記事です。

環境

  • centos6.5
  • Rails5.0.1 → Rails5.1.0beta1
  • ruby2.3.0 → ruby2.4.0
  • rbenv
  • unicorn
  • whenever

はじめに

Rails5.1.0beta1がリリースされたので、Rails5.1.0の準備を開始しました。
今回は変更点が多いので、Rails5.1.0beta1の状態ではリリースせず、Rails5.1.0になってからリリースをしたいと思います。
また、この機会に色々とRailsアプリのリファクタリングをしていこうと思っています。
ずっとAndroid開発で放置状態だったので。出し惜しみしないで、ブログに情報も載せていこうと思います。

Rails5.1.0の変更点

Rails5.1.0は、Rails5.0.1と比較すると大きく変わりました。変更点の概要を以下に記述します。

  • YarnでjavaScriptを管理
  • webpackでビルドが可能
  • jQueryが不要になった(rails-ujsに書き直された)
  • 機能テスト用のライブラリCapybaraが正式にサポート
  • 暗号の管理方法変更
  • routesの改良
  • form_withでform_tag / form_forを統一
  • 4.x以前はサポートしない

凄まじい量の変化です。なので、今から少しづつ対応していきましょう。

作業内容

今回のRails5.1.0のアップグレードでは、以下のタスクを行っていく予定です。

  • jQueryをrails-ujsに置き換える
  • Capybaraの導入
  • CIの設定
  • 暗号の管理方法変更
  • routesの改善
  • form_withでform_tag / form_forを統一
  • Ruby2.4のコードにリファクタリング

最低限でこれくらいありますね。Ruby2.4のFixnumの改善も対応したっぽいので、コードも本格的に修正します。頭痛くなってきた。。。

移行用の作業branchの作成

gitでrails5.1.0beta1移行用の作業ブランチを作成します。

terminal

cd {project_folder}
git branch feature/rails5.1.0beta1

checkoutでブランチを切り替えます。

terminal

git checkout feature/rails5.1.0beta1

準備完了です。

Gemfile修正

まずGemfileを修正します。

{project_folder}/Gemfile

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '5.0.1'

↓

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '5.1.0.beta1'

gem 'rails', '5.1.0.beta1'に修正し、updateします。

terminal

// update
bundle update 

bundle updateは、全ての依存関係をインストール・ダウンロードし直すことができます。

terminal

Fetching git://github.com/capistrano/rbenv.git
Fetching gem metadata from https://rubygems.org/..............
Fetching version metadata from https://rubygems.org/...
Fetching dependency metadata from https://rubygems.org/..
Resolving dependencies.................
Using rake 12.0.0
Installing concurrent-ruby 1.0.5 (was 1.0.3)
Installing i18n 0.8.1 (was 0.7.0)
Using minitest 5.10.1
Installing thread_safe 0.3.6 (was 0.3.5)
Installing builder 3.2.3 (was 3.2.2)
Installing erubi 1.6.0
Using mini_portile2 2.1.0
Using rack 2.0.1
Installing nio4r 2.0.0 (was 1.2.1) with native extensions
Using websocket-extensions 0.1.2
Using mime-types-data 3.2016.0521
Installing arel 8.0.0 (was 7.1.4)
Installing net-ssh 4.1.0 (was 3.2.0)
Using ast 2.3.0
Using debug_inspector 0.0.2
Using bundler 1.11.2
Installing byebug 9.0.6 (was 9.0.5) with native extensions
Installing capistrano-harrow 0.5.3 (was 0.5.2)
Using chronic 0.10.2
Installing coffee-script-source 1.12.2 (was 1.10.0)
Using execjs 2.7.0
Using method_source 0.8.2
Using thor 0.19.4
Using database_cleaner 1.5.3
Installing diff-lcs 1.3 (was 1.2.5)
Using multipart-post 2.0.0
Installing hashie 3.5.5 (was 3.4.4)
Using multi_json 1.12.1
Installing json 1.8.6 (was 1.8.3) with native extensions
Installing jwt 1.5.6 (was 1.5.4)
Installing kaminari-core 1.0.1
Installing kgio 2.11.0 (was 2.10.0) with native extensions
Installing libv8 3.16.14.19 (was 3.16.14.15)
Installing multi_xml 0.6.0 (was 0.5.5)
Installing mysql2 0.4.5 (was 0.4.4) with native extensions
Using powerpack 0.1.1
Installing rainbow 2.2.1 (was 2.1.0) with native extensions
Installing raindrops 0.17.0 (was 0.16.0) with native extensions
Installing rdoc 4.3.0 (was 4.2.2)
Using ref 2.0.0
Using rspec-support 3.5.0
Using ruby-progressbar 1.8.1
Installing unicode-display_width 1.1.3 (was 1.1.0)
Installing sass 3.4.23 (was 3.4.22)
Installing tilt 2.0.7 (was 2.0.5)
Using turbolinks-source 5.0.0
Using tzinfo 1.2.2
Installing sitemap_generator 5.3.1 (was 5.1.0)
Installing nokogiri 1.7.0.1 (was 1.6.8.1) with native extensions
Using rack-test 0.6.3
Using sprockets 3.7.1
Installing websocket-driver 0.6.5 (was 0.6.4) with native extensions
Using mime-types 3.1
Using net-scp 1.2.1
Installing parser 2.4.0.0 (was 2.3.1.2)
Using binding_of_caller 0.7.2
Using whenever 0.9.7
Using coffee-script 2.4.1
Installing uglifier 3.1.9 (was 3.0.0)
Installing faraday 0.11.0 (was 0.9.2)
Installing omniauth 1.6.1 (was 1.3.1)
Installing unicorn 5.2.0 (was 5.1.0) with native extensions
Installing sdoc 0.4.2 (was 0.4.1)
Installing therubyracer 0.12.3 (was 0.12.2) with native extensions
Installing rspec-core 3.5.4 (was 3.5.1)
Using rspec-expectations 3.5.0
Using rspec-mocks 3.5.0
Installing turbolinks 5.0.1 (was 5.0.0)
Installing activesupport 5.1.0.beta1 (was 5.0.1)
Using loofah 2.0.3
Using mail 2.6.4
Installing sshkit 1.12.0 (was 1.11.1)
Installing rubocop 0.47.1 (was 0.41.2)
Installing oauth2 1.3.1 (was 1.2.0)
Using webpay 3.2.3
Installing rails-dom-testing 2.0.2 (was 2.0.1)
Using globalid 0.3.7
Installing activemodel 5.1.0.beta1 (was 5.0.1)
Installing factory_girl 4.8.0 (was 4.7.0)
Installing jbuilder 2.6.3 (was 2.5.0)
Installing spring 2.0.1 (was 1.7.2)
Using rails-html-sanitizer 1.0.3
Installing airbrussh 1.1.2 (was 1.0.2)
Using omniauth-oauth2 1.4.0
Installing activejob 5.1.0.beta1 (was 5.0.1)
Installing activerecord 5.1.0.beta1 (was 5.0.1)
Installing actionview 5.1.0.beta1 (was 5.0.1)
Using capistrano 3.5.0
Using omniauth-google-oauth2 0.4.1
Installing kaminari-activerecord 1.0.1
Installing actionpack 5.1.0.beta1 (was 5.0.1)
Installing kaminari-actionview 1.0.1
Using capistrano-bundler 1.1.4
Installing capistrano-maintenance 1.2.0 (was 1.0.0)
Using capistrano-rbenv 2.1.0 (was 2.0.4) from git://github.com/capistrano/rbenv.git (at master@4483faf)
Using capistrano-ssh-doctor 1.0.0
Using capistrano3-unicorn 0.2.1
Installing actioncable 5.1.0.beta1 (was 5.0.1)
Installing actionmailer 5.1.0.beta1 (was 5.0.1)
Installing railties 5.1.0.beta1 (was 5.0.1)
Using sprockets-rails 3.2.0
Installing rails-controller-testing 1.0.1 (was 0.1.1)
Installing kaminari 1.0.1 (was 0.17.0)
Installing capistrano-rails 1.2.3 (was 1.1.7)
Using coffee-rails 4.2.1
Installing factory_girl_rails 4.8.0 (was 4.7.0)
Installing jquery-rails 4.2.2 (was 4.1.1)
Installing rails-i18n 5.0.3 (was 5.0.0)
Installing rspec-rails 3.5.2 (was 3.5.1)
Using teaspoon 1.1.5
Installing rails 5.1.0.beta1 (was 5.0.1)
Using sass-rails 5.0.6
Using web-console 2.3.0
Using teaspoon-jasmine 2.3.4
Bundle updated!

一発でうまくいきました。5.0.1に対応してあれば、bundle updateはひっかからないようです。

すべてのgemの更新に成功したら、updateの準備は完了です。

Upgrade to Rails5.1.0beta1

Gemファイルの導入が完了したら、rails app:updateで設定ファイルを更新します。

terminal

bundle exec rails app:update

ファイル更新の有無を聞かれるので、更新が必要なファイルのみ変更します。
私の環境では以下のようにしました。

  • config/routes.rb → 更新しない
  • config/application.rb → 更新しない
  • config/secrets.yml → 更新する
  • config/cable.yml → 更新する
  • config/puma.yml → 更新する
  • config/environments/development.rb → 更新する
  • config/environments/production.rb → 更新する
  • config/environments/test.rb → 更新する
  • config/initializers/assets.rb → 更新する
  • config/initializers/new_framework_defaults.rb → 更新しない
  • bin/setup → 更新しない
  • bin/update → 更新しない

diffで確認したところ、変更点で気をつける点は以下です。

config/environments/development.rb

ActiveSupport::EventedFileUpdateCheckerがデフォルトで有効になっています。
vagrantやdocker等の仮想環境で開発をしている場合は無効にしておいた方が良いです。更新が反映されなくなることがあります。

config/environments/development.rb
  config.file_watcher = ActiveSupport::EventedFileUpdateChecker

  # config.file_watcher = ActiveSupport::EventedFileUpdateChecker 

config.assets.digest = trueが削除さています。
これも不要みたいです。毎回コンパイルされるのかな。。。

config/environments/production.rb

config.read_encrypted_secrets = trueが追加されました。
暗号は管理方法が変わりました。

Rails5.1.0beta1 Encrypted secretsの対応

下記のやり方だと、Rails5.1.0では動作しませんでした。既存のsecrets.ymlでも動くので、Encrypted secretsの導入は少し待ってからの方が良いかもしれません。これだと管理が煩雑になって、デメリットの方が多い気がします。

暗号の管理方法が変更されたので対応します。terminalを開きます。

terminal
bin/rails secrets:setup

config/secrets.yml.key
append  .gitignore
create  config/secrets.yml.enc

You can edit encrypted secrets with `bin/rails secrets:edit`.
Add this to your config/environments/production.rb:
config.read_encrypted_secrets = true

これだけです。パスワードの入ったsecrets.yml.keyファイルを.gitignoreに自動で追加してくれます。 config/secrets.yml.encはgitで管理可能です。pushしてもOKです。

また、config/environments/production.rbにconfig.read_encrypted_secrets = trueが追加されていることも確認してください。
あとは、本番でconfig/secrets.yml.keyのuploadを忘れないようにしましょう。開発環境で有効にする必要はないとは思いますが、本番と同じにしたい人はconfig.read_encrypted_secrets = trueを追加しても良いと思います。

Rails5.1.0beta1 rails-ujs対応

rails-ujsを導入すれば、jQueryが不要になります。jQueryなしで動くように書き直されたようです。素晴らしい!!

デバッグ中にバグが出ました。jqueryに依存しているところは書き直しが必要です。

config/environments/development.rb
# Use jquery as the JavaScript library
#gem 'jquery-rails'

gem 'rails-ujs'

インストールします。

terminal

// update
bundle update 

Installing rails-ujs 0.1.0

インストールしたら、application.jsを修正します。

assets/javascript/application.js

//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require_tree .

↓

//= require rails-ujs
//= require turbolinks
//= require_tree .

Rails5.1.0beta1起動

アプリを起動します。

terminal

rbenv exec bundle exec rails s -b 0.0.0.0
=> Booting WEBrick
=> Rails 5.1.0.beta1 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
[2017-03-20 14:24:05] INFO  WEBrick 1.3.1
[2017-03-20 14:24:05] INFO  ruby 2.3.0 (2015-12-25) [x86_64-linux]
[2017-03-20 14:24:05] INFO  WEBrick::HTTPServer#start: pid=10639 port=3000

コンソールにRails 5.1.0.beta1 applicationが表示され、画面が表示されれば成功です。

私の環境では問題なく動いているようです。jqueryがなくなって、rails-ujsになったので、動きが軽くなった気がします。計測はしていませんけどね。
だいたいここまでで3時間くらいです。とはいえ、ここからが本番ですが。

まとめ

Rails5.0.1からRails5.1.0beta1のアップデートは、多くの変更が必要になります。
4.x以下は切り捨てられるので、早めに更新の準備をしましょう。また、Fixnumの改善も対応済み(らしい)ので、この機会にRuby2.4.0へのリファクタリングも済ませてしまうと良いでしょう。

タスクが完了するまで継続的にブログも更新します。

以上です。

PICK UP オススメ書籍

運営サイト(railsで作成しています)


関連記事

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...