Rista Tech Blog

株式会社リスタの技術?ブログ

rubyを2.5にバージョンアップしました

Ristaの4人目エンジニアを募集中! iOS Android Rails

1年ぐらい切れていたマネーフォワードの金融機関連携を設定したら貯金がめちゃ減っていて驚いた@mikedaです。 ガチャ怖い。あと引っ越しかな。

1ヶ月ほど前に、JOBLISTで使っているrubyのバージョンを2.4.1から2.5.1に変更しました。
ruby 2.5の新機能などについては他にいっぱい情報があるので、今回は手順のメモだけ残しておきます。

やったこと

コードの変更

変更点はこのくらいです。

  • .ruby-versionの更新
  • 動かなくなったgemのアップデート(bundle update haml pry-doc)
  • 一部のコードがSyntaxErrorになったので修正
  • CI用のDockerイメージの更新
  • サーバー切り替え(必須じゃないですが今回は各種パッケージのバージョンアップをかねて)

細かく書くのが面倒なのでPRのdiffをそのまま貼ってみます。

diff --git a/.ruby-version b/.ruby-version
index 005119baaa..73462a5a13 100644
--- a/.ruby-version
+++ b/.ruby-version
@@ -1 +1 @@
-2.4.1
+2.5.1

diff --git a/Gemfile.lock b/Gemfile.lock
index 89d9bd3195..a59043b593 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -135,7 +135,7 @@ GEM
     cliver (0.3.2)
     code_analyzer (0.4.8)
       sexp_processor
-    coderay (1.1.1)
+    coderay (1.1.2)
     coercible (1.0.0)
       descendants_tracker (~> 0.0.1)
     concurrent-ruby (1.0.5)
@@ -362,7 +362,7 @@ GEM
       signet (~> 0.7)
     gretel (3.0.9)
       rails (>= 3.1.0)
-    haml (5.0.1)
+    haml (5.0.4)
       temple (>= 0.8.0)
       tilt
     haml-rails (1.0.0)
@@ -438,7 +438,7 @@ GEM
     memoist (0.16.0)
     meta-tags (2.4.1)
       actionpack (>= 3.2.0, < 5.2)
-    method_source (0.8.2)
+    method_source (0.9.0)
     mime-types (3.1)
       mime-types-data (~> 3.2015)
     mime-types-data (3.2016.0521)
@@ -466,16 +466,15 @@ GEM
     polyamorous (1.3.1)
       activerecord (>= 3.0)
     powerpack (0.1.1)
-    pry (0.10.4)
+    pry (0.11.3)
       coderay (~> 1.1.0)
-      method_source (~> 0.8.1)
-      slop (~> 3.4)
+      method_source (~> 0.9.0)
     pry-byebug (3.4.2)
       byebug (~> 9.0)
       pry (~> 0.10)
-    pry-doc (0.10.0)
-      pry (~> 0.9)
-      yard (~> 0.9)
+    pry-doc (0.13.4)
+      pry (~> 0.11)
+      yard (~> 0.9.11)
     pry-rails (0.3.6)
       pry (>= 0.10.4)
     public_suffix (3.0.2)
@@ -590,7 +589,7 @@ GEM
     rspec-mocks (3.6.0)
       diff-lcs (>= 1.2.0, < 2.0)
       rspec-support (~> 3.6.0)
-    rspec-rails (3.6.0)
+    rspec-rails (3.6.1)
       actionpack (>= 3.0)
       activesupport (>= 3.0)
       railties (>= 3.0)
@@ -607,8 +606,8 @@ GEM
       unicode-display_width (~> 1.0, >= 1.0.1)
     ruby-progressbar (1.8.1)
     ruby_dep (1.5.0)
-    ruby_parser (3.9.0)
-      sexp_processor (~> 4.1)
+    ruby_parser (3.11.0)
+      sexp_processor (~> 4.9)
     sass (3.4.24)
     sass-rails (5.0.6)
       railties (>= 4.0.0, < 6)
@@ -619,7 +618,7 @@ GEM
     scss_lint (0.53.0)
       rake (>= 0.9, < 13)
       sass (~> 3.4.20)
-    sexp_processor (4.9.0)
+    sexp_processor (4.11.0)
     shoulda-matchers (3.1.1)
       activesupport (>= 4.0.0)
     sidekiq (5.0.0)
@@ -642,7 +641,6 @@ GEM
     slack-notifier (2.1.0)
     slackistrano (3.1.1)
       capistrano (>= 3.5.0)
-    slop (3.6.0)
     spring (2.0.1)
       activesupport (>= 4.2)
     sprockets (3.7.1)
@@ -663,7 +661,7 @@ GEM
       ref
     thor (0.19.4)
     thread_safe (0.3.6)
-    tilt (2.0.7)
+    tilt (2.0.8)
     trollop (2.1.2)
     tzinfo (1.2.5)
       thread_safe (~> 0.1)
@@ -697,7 +695,7 @@ GEM
     xpath (2.1.0)
       nokogiri (~> 1.3)
     yajl-ruby (1.3.1)
-    yard (0.9.9)
+    yard (0.9.12)
 
 PLATFORMS
   ruby

diff --git a/config/deploy.rb b/config/deploy.rb
index 323ef67127..283e5fcff0 100644
--- a/config/deploy.rb
+++ b/config/deploy.rb
@@ -9,7 +9,7 @@
 set :keep_releases, 5
 
 set :rbenv_type, :user
-set :rbenv_ruby, '2.4.1'
+set :rbenv_ruby, '2.5.1'
 set :rbenv_prefix, "RBENV_ROOT=#{fetch(:rbenv_path)} RBENV_VERSION=#{fetch(:rbenv_ruby)} #{fetch(:rbenv_path)}/bin/rbenv exec"
 set :rbenv_map_bins, %w[rake gem bundle ruby rails sidekiq sidekiqctl]
 set :rbenv_roles, :app

diff --git a/config/deploy/production.rb b/config/deploy/production.rb
index 5952264f48..caa395422b 100644
--- a/config/deploy/production.rb
+++ b/config/deploy/production.rb
@@ -6,7 +6,7 @@
 set :whenever_environment, :production
 set :branch, 'master'
 
-server 'joblist-app-005.rista.lan', user: 'rista', roles: %w[app web db]
-server 'joblist-app-006.rista.lan', user: 'rista', roles: %w[app web]
-server 'joblist-admin-005.rista.lan', user: 'rista', roles: %w[app web batch_main]
-server 'joblist-admin-006.rista.lan', user: 'rista', roles: %w[app web batch_sub]
+server 'joblist-app-007.rista.lan', user: 'rista', roles: %w[app web db]
+server 'joblist-app-008.rista.lan', user: 'rista', roles: %w[app web]
+server 'joblist-admin-007.rista.lan', user: 'rista', roles: %w[app web batch_main]
+server 'joblist-admin-008.rista.lan', user: 'rista', roles: %w[app web batch_sub]
diff --git a/config/deploy/staging.rb b/config/deploy/staging.rb
index 50e0ae1222..90663374df 100644
--- a/config/deploy/staging.rb
+++ b/config/deploy/staging.rb
@@ -2,4 +2,4 @@
 set :unicorn_config_path, shared_path.join('unicorn.rb')
 set :branch, ENV['BRANCH'] || 'master'
 
-server 'joblist-stg-003.rista.lan', user: 'rista', roles: %w[app db web]
+server 'joblist-stg-004.rista.lan', user: 'rista', roles: %w[app db web]

diff --git a/spec/models/shop_spec.rb b/spec/models/shop_spec.rb
index a22037a6b..1b46e33e1 100644
--- a/spec/models/shop_spec.rb
+++ b/spec/models/shop_spec.rb
@@ -1,7 +1,7 @@
 require 'rails_helper'
 
 RSpec.describe Shop, type: :model do
-  let(:shop) { create(:shop) }
+  let :shop { create(:shop) }
   subject { shop }
 
   it { should respond_to(:company) }

diff --git a/wercker.yml b/wercker.yml
index d4dfc09c29..0c0a1f74f8 100644
--- a/wercker.yml
+++ b/wercker.yml
@@ -1,4 +1,4 @@
-box: mikeda/rails-test-with-elasticsearch
+box: mikeda/rails-test-with-elasticsearch:2.5
 services:
     - redis
 build:

手元の作業

いつものやつです。

brew upgrade ruby-build
rbenv install 2.5.1
ruby -v # 2.5.1になっているのを確認

gem install bundler
bundle

CI環境の調整

CIにはwerckerを使っています。 wercker.ymlのdiffに出ているように、CI用のDockerイメージは既存のテストに影響を与えないように一時的に2.5用のタグをつけてDockerHubに登録しました。

DockerHubのレポジトリGitHubレポジトリと連携するように設定しています。

今回やったことはDockerHub上でGitHubのブランチとDockerタグの連携設定をして、

f:id:mikeda:20180529090302p:plain

GitHubにDockerfileの変更をpushしただけです。

update 2.5 by mikeda · Pull Request #7 · mikeda/rails-test-with-elasticsearch · GitHub

最終的に全ての作業・動作確認が完了後、このタグは削除されました。

本番デプロイ

ステージング環境で動作確認後、本番環境にデプロイしました。

今回は全アプリケーションサーバをサーバごと切り替えました。本番サーバのrubyのrbenv管理されてるので必須じゃないですが各種パッケージのバージョンアップをかねて。

まとめ

特に大きなトラブルもなくサクッとバージョンアップできました。

begin無しのrescueや標準ライブラリの細かい調整がうれしいです。

サンプルコードでわかる!Ruby 2.5の主な新機能と変更点 Part 1

サンプルコードでわかる!Ruby 2.5の主な新機能と変更点 Part 2