こんにちは!スマートキャンプ社でエンジニアとして働いている井上です。 この度開発改善でBALES CLOUDのバックエンド環境をRails 7・Ruby 3へのアップデートを1日でやりました!※リリースは調整などもあったので別日にやっています。
Rails・Rubyアップデートの具体的なコマンドなどはすでに書かれている記事などが多いので 今回は、1日でアップデートできた理由とどんな手順で進めたかなどを紹介できればと思います。
1日でアップデートできた理由
いきなり1日でアップデートできた理由を話をしますが、今回のアップグレード作業はマンパワーで一気にやったわけではなく1人でアップデート作業をしました。 これが可能だったのは自動テストの充実度と依存するgemが少なかったことによるところが大きいと思います。
自動テストの充実度
Rails・Rubyアップデートも機能のリリースと同様にRSpecやその他のテストでリリースのリスクを小さくしリリースするという点は変わらないと思います。 BALES CLOUDはRSpecのカバレッジは90%ほどあり、mablによるE2Eテストでもテストをしており 重要な機能の基本動作はテストは自動テストで担保できる状態にありました。 そのため、これらのテストが通れば問題が起こる可能性はある程度少ないといえる状態でした。
また、当たり前かもですがリリース後に問題があればすぐに戻すという前提でリリースしました。 幸い、戻すようなことはなくパフォーマンスも安定しバグもない状態でリリースが完了しました。
https://tech.smartcamp.co.jp/entry/introduced-mabl
mablについてはこちらの記事を読んでいただければと思います!
依存するgemの少なさ
依存するgemが少ないとアップデートの手間も少なくなります。 仮にメンテナンスがされず、Ruby 3やRails 7をサポートしていないgemがある場合、代替を探すという作業が発生します。 今回はすべてのgemをアップデートするのみで大きな修正がなかっためアップデートも楽でした。
※ gemを使わないようにしようという話ではないです。
実際にやった作業
実際にやった作業を紹介していきます。
- Railsアップグレードガイド && RubyのRelease記事を読む
- Ruby・Railsをアップデートする
- Rails sで起動できるようにする
- RSpecを通す
- mabl(E2EテストSaaS)のテストを通す
- stg環境リリース && 動作検証
Railsアップグレードガイド && RubyのRelease記事を読む
主にここで確認したのは変更と削除のあった箇所です。 観点としてはアップデートした際にどの程度の修正がありそうかだったり、暗黙のうちに変更されて障害が起こる可能性がある箇所がないかを確認しました 幸い、あまり対応が必要な箇所がなかったので割と楽にアップデートができました。
実際に読んだものは下記のものです、アップデートの注意点だけでなく今後使えそうな機能の学習もできました。
とても助かりました!
https://www.ruby-lang.org/ja/news/2020/12/25/ruby-3-0-0-released/
https://github.com/ruby/ruby/blob/v3_0_0/NEWS.md
https://railsguides.jp/upgrading_ruby_on_rails.html
Ruby・Railsをアップデートする
実際はそれぞれ個別にアップデートを行っていました 一気にやると問題がどこにあるかわからなくなったり、どのアップデートによる問題なのかの切り分けが難しくなるからです。
例えば、今回だとRubyのアップグレードでキーワード引数周りの仕様変更がありました。 それに伴い関連の箇所でエラーが大量に出ましたが、これもRuby関連の対応とRails関連の対応とを同時に行なうと問題はわかりにくくなるので 個別でアップデートして検証していくことをおすすめします。
Rails sで起動できるようにする
gemのアップデートをしても大体起動しないことが多いかと思います。 今回も特定のgemのoptionが削除されていたことが原因で最初は起動しませんでした。
この辺は個別にgemの変更やアップグレードガイドなどを読み変更漏れがないかなどをログを元に1つ1つ確認していく作業でした。
RSpecを通す
主にキーワード引数周りでテストが落ちていたので修正しました。 多くは、引数の委譲がよく使われており、そのエラーが大量にでましたが 下記の記事に修正のパターンが詳細に書いてあるおかげですぐに解決できました。
mabl(E2EテストSaaS)のテストを通す
mablではユーザーがよくやる操作をテストをしています。 これにより、ユーザーが操作する重要な機能の基本シナリオをカバーしました。
このテストが通れば大きなバグのリスクは少ないだろうという状態になるかと思います。
stg環境リリース && 動作検証
stg環境では自動テストだけでは確認できない、パフォーマンスの検証や実際のリリースに問題ないかなどを確認しました。 stg環境はデータ量的には本番よりすくないためパフォーマンス検証は環境としては、不十分なところもあり今後環境を整備していかなくてはと考えさせられました。
Rails 7, Ruby 3の気になる機能
今後使う可能性が高い機能や個人的に気になる機能を紹介できればと思います。
静的解析の追加
Ruby 3の大きな目玉はRBS、TypeProfが追加されたことかと思います。 これにより、静的型付け言語が可能になります。
- RBS: 型情報を記述
- TypeProf: 静的型推論ツール
並列処理
下記の並行・並列処理の新機能もRuby 3の目玉ですよね 個人的な興味で使ってみたいなという気持ちがありますが、かなり難しい機能でもあると思うので実際使うことになるかは現状不明な機能です。
- Ractor
- Fiber Scheduler
Active Record::QueryLogs
Marginalia gemの機能が追加されたものでQueryにコメントを追加できる機能です。 デフォルトでクエリタグに「アプリケーション」「コントローラ」「アクション」の詳細が追加されるので 特定の問題があるQueryの影響調査などに使えそうだなと感じています。
やってよかったこと
開発の手札を増やせる
新しいバージョンになると新機能も追加されますが機能が削除されたりもします。 新しい機能は何かしらの必要性があり追加されますし、何かしら使わないほうがいい理由から機能削除されることがあるかと思います。
新しい機能は開発するうえで手段を増やしたり、負荷に耐えるための手段が増える可能性があり これにより不要な開発やスケールのためのやることが減る可能性があります。
また、先々に削除される機能を使い続けると最新のバージョンへの対応工数がいつのまにか膨れ上がるリスクもあり 定期的にチェックして良い書き方にしていく動きも大変ではありますが大切だなと感じました。
開発チームの体験向上
新しい機能や書き方などは試したくなります。 それが、バージョンが古いために使えなくて汚いコードなどになるのは個人的にかなりストレスになります。 今回大きなコストをかけることなくアップデートでき、開発体験を向上できたのでとても良かったです。
シンプルに最新の環境になるのは嬉しい
他の開発メンバーも最新の環境になったことを喜んでくれたり、開発メンバー以外にも環境を新しくしていく重要性を話してくれる機会もありとても嬉しかったです。
まとめ
今回はRails・Rubyアップデートについて紹介しました アップデート自体はがっとやった感じでしたが、今までプロダクト開発に関わったメンバーがしっかりテストを書いてきたからこそすんなりできたと感じた作業でした。
テストの重要性はRailsアップグレードガイドの最初にも記載されており、テストはアップデートをする際の重要な点だとあらためて感じました。 https://railsguides.jp/upgrading_ruby_on_rails.html#%E3%83%86%E3%82%B9%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E3%82%AB%E3%83%90%E3%83%AC%E3%83%83%E3%82%B8
自分たちが早く開発するためにはやはりテストの重要性は高いものだなと感じました。 今後のアップデートのためにもこの文化は守っていきつつ、よりリリースリスクを下げて積極的に改善ができる状態を作っていきたいなと思っています。