見出し画像

Rubyのバージョンをアップデートした話

こんにちは、CAMPFIREでリードエンジニアをやってる@pyonkです。

少し前にはなりますが、2022年3月31日でRuby2.6系のEOLを迎えました。
CAMPFIREでは今までRuby2.6系を利用しておりEOLを迎える前にバージョンをあげないとね、ということでアップデートを行いました。

アップデートの背景

先述の通りRuby2.6系のEOLが近づいていたことが一番大きなモチベーションでしたが、他にも

  • おなじくEOLが近づいているRails 5系のアップデートの前段として

  • これまでなかなか実施していなかったアップデートもこれからは積極的に実施したい

というようなことも背景としてあります。
(なんと直近アップデートを行ったのは2019年だった...!)

やったこと

アップデートは以下のような流れで進めました。

  • 簡単な事前調査

  • ローカル環境でのアップデート

  • QA環境での動作確認

  • 本番環境にリリース

以下、ざっくりと箇条書きですが、今回やったことの詳細(というより作業ログ的なもの)を記します。

まずは変更点や体験談に目を通す

  • ハマるポイントを事前にざっくりでも把握しておくと、問題に出会った時の解決が早い

  • たとえば…👇

ローカル環境でRuby 2.7.5をインストール

$ brew update && brew upgrade ruby-build
$ rbenv install 2.7.5
$ rbenv local 2.7.5
$ ruby -v
ruby 2.7.5p203 (2021-11-24 revision f69aeb8314) [x86_64-darwin21]
  • Gemfileの書き換えを行いbundle install

$ bundle update --ruby
$ bundle install

obsoleteになった記述の対応

  • ::URI::encode, ::URI::decode がそれぞれobsoleteとなっているので修正

開発サーバーの立ち上げ確認

  • bootsnap周りでコケる

    • bootsnap1.4.4までで発生しているようなのでアップデートする

  • bootsnapアップデート後に立ち上がることを確認

CircleCIで利用するベースイメージの更新

CAMPFIREではCircleCIを利用してCI/CDを実現しているので、そちらで使うベースイメージの更新が必要になってきます。

  • ベースイメージにインストールされているnodeのバージョンや、bundlerのバージョンが手元と違ったため、合致するように修正する

  • CircleCI上でE2Eテストに利用しているブラウザのバージョンが以前と違うため、locale周りの指定が変更されていた

    • --langを起動時に引数で渡すのではなく環境変数のLANGを指定することで対応した

デプロイ用のイメージを更新してQA環境にデプロイしてみる

CAMPFIREには本番や、ステージングとは別にQA環境があります。
作成は先述のCircleCIを利用したCI/CDで手軽に誰でもできるようになっており、非常に便利です。

  • buildが失敗する

    • alpineのバージョンが上がったことによる影響

    • 当たり前だけどalpineのバージョンを上げるとインストールできるソフトウェアのバージョンも上がっているので注意

      • インストールできるopensshでは、プライベートレポジトリのgemをインストールする際に利用するsshキーの署名方式が利用できなくなっていた

        • 利用できる方式の鍵を今回新たに作成してそちらを利用するように修正

      • CircleCIで利用していたdockerではalpine3.14以降に対応していなかった

        • alpine3.14からfaccessat2を利用するようになっているため

          • CircleCI上のdockerのバージョンを上げることで対応できた🎉

  • とにかくCircleCI上でbuildをパスさせるためにCIをたくさん回すけど時間がかかる...

    • ということでCircleCI上のbuild環境に接続して、直接Dockefileの編集とbuildができるかどうかの確認を行うことで時短することができた

QA環境が立ち上がる🎉

  • QA環境で主要な項目(プロジェクト作成から支援までの一連の流れ)や、影響のありそうな箇所を重点的に動作確認を行う

    • 幸い不具合はなし🎉

本番環境に反映完了✌️

何もなかった!やったね
  • デプロイ以降もアップデート起因のエラーはなく完了!

  • 開発メンバーにも通知して、手元の環境でmasterアップデートを行ってもらう

無事に完了!と思いきや…

あげた方が良いのかい〜〜

直後にRuby 2.7.6がリリースされました!

脆弱性対応が行われているものだったので早めにあげなければと、取り掛かったのですが、CircleCIのベースイメージがレガシーのもので昨年末でサポートが終了しており、2.7.6対応版がリリースされていませんでした。
なので次世代のイメージへの移行とともにアップデートを行いました。

CircleCIの次世代イメージへの移行のハマりポイント

レガシーイメージから次世代イメージへの移行に関しては、1点を除きハマるポイントはありませんでした。
ハマったのはE2Eテストで利用しているブラウザのlocaleの設定に関してです。
2.7.5アップデート時に環境変数LANGを設定する形に修正していましたが、それだとブラウザのlocaleが変更されませんでした。
結論としてはLANGUAGEを設定することで対応することができましたが、
おそらくブラウザのlocaleの変更はLANGよりもLANGUAGEが優先されるようになっており、 次世代のイメージではLANGUAGEが指定されるようになっているのが原因(?)かなと推測しています。

まとめ

今回は2.7.5に上げることが目的でしたが、直後に脆弱性対応のための2.7.6がリリースされ、こちらも無事にアップデートされています🎉

ざっくりではありますが、作業ログを残しておくことで、今後もなるべく早期にアップデートを行いやすくなると思います。
アップデートで得られる新しい機能や、脆弱性対応をより早く反映させていくことで、CAMPFIREのミッションにあるように、一人でも多く一円でも多く、想いとお金がめぐる世界をつくっていきたいと思います!!🔥

この記事が気に入ったらサポートをしてみませんか?