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のミッションにあるように、一人でも多く一円でも多く、想いとお金がめぐる世界をつくっていきたいと思います!!🔥
この記事が気に入ったらサポートをしてみませんか?