DIGGLE開発者ブログDIGGLE開発者ブログ予実管理クラウドDIGGLEのプロダクトチームが、技術や製品開発について発信します2024-08-01Rails7.1に上げようとしたらハマりまくった話web開発DIGGLEエンジニアのreenjです。2024年4月下旬ごろにDIGGLEで使用しているRailsを7.0から7.1へアップデートする作業を行いました。マイナーバージョンのアップデートであるため、当初それほど問題なくアップデートできるだろうと考えていました。実際に、簡単にアップデートできたという記事を多く見かけます。DIGGLEでのアップデートの場合は、思いの外いろいろとハマってしまい苦戦しました。対応内容と変更箇所、そしてハマってしまったことについてこちらの記事で紹介していきます。基本的には「Railsアップグレードガイド」の内容に従い、アップデートします。railsguides.jpまずは、Gemfileを編集しRailsのバージョンを7.1へアップデートします。その後、以下のコマンドを実行します。app:updateコマンドを実行すると、対話形式で変更するファイルの確認が行われます。ここではとりあえずすべてyesと返答し、すべての変更を加えます。差分が出るため、各差分に問題がないかを確認します。差分となっている箇所の多くは、リリースノートやガイド、設定項目などで説明されています。問題があるかどうかは各説明などから判断します。railsguides.jprailsguides.jp例えば、環境固有の設定ファイルに以下のような差分があります。trueconfig.enable_reloadingは新しく追加された設定項目です。同等であり置き換わっています。設定内容としては、これまでと同等であるため特に問題ありません。一通り差分の確認をし、ガイドやリリースノートの内容で修正が必要な箇所は適宜修正します。その後は自動テストを行います。自動テストでエラーが発生していれば、エラー箇所を修正します。自動テストがすべて通った後は、念のため本番同等の環境で各機能の確認をざっと行います。これで問題が発生しなければリリースへ向けた流れとなります。実際に上記の流れで進めていったところいくつもエラーが発生し、アップデートが難航しました......。サードパーティのライブラリがRails7.1に対応していないDIGGLEではros-apartmentとactive-hashというライブラリを使用しています。これらサードパーティのライブラリは2024年の4月下旬ではRails7.1に対応したリリースを出しておらず、これらライブラリを使用した機能を使うとエラーが発生してしまいました。ros-apartmentへの対応ros-apartmentは、2022年2月7日に2.11.0がリリースされて以降、2年以上リリースがされていませんでした。7.1への対応はすでにマージされており、リリースはされていないといった状況でした。そのため、Gemfileを以下のような特定コミットを指定して使用するように変更しました。(この方法は、もしrebaseが行われるとハッシュ値が変わりライブラリが取得できなくなるため、少し注意が必要な方法です。'apartment'※DIGGLEでRailsのアップデートを行った直後(2024月5月21日)にRails7.1に対応した3.0.0がリリースされました。そのため、現在はライブラリのバージョンを更新すれば解決します。active-hashへの対応active-hashも同様に、2024年4月下旬時点では、Rails7.1のサポート対応が入っているものの、リリースされていませんでした。必要だったRails7.1のサポート対応としては、こちらのPRの内容です。大きな対応ではないため、こちらはパッチで対応することとし、以下のモンキーパッチを作成しました。ActiveHash::Base.singleton_class.prepend(ActiveHashMonkeyPatch)end※こちらも現在は最新リリースに、Rails7.1の対応が入っているため、パッチの対応は不要です。Zeitwerkへの対応RailsではZeitwerkというオートローダーを使用しています。オートローダーは、プログラム実行時に必要に応じて自動的にソースを読み込む機能です。自動読み込み対象のクラスやモジュールはrequireやincludeせずに使用できます。7.1からはlib配下がデフォルトの自動読み込み先として追加されています。DIGGLEでは、Zeitwerkで自動読み込みすることを想定しておらず、lib配下にZeitwerkの規則に従っていないディレクトリやファイルなどを多数配置していたため、これらが問題になりました。そのため、それらを適宜Zeitwerkで自動読み込みできるようにするか、ディレクトリ自体を除外するかを整理する必要がありました。7.1から設定項目config.autoload_lib()が追加されています。これにより、lib配下が自動読み込みされます。lib配下で自動読み込みされることを想定していないディレクトリは、以下のように除外する対象に追加します。...))また、lib直下に格納されているファイルで自動読み込みしないものは、適宜ディレクトリを作成し移します。作成したディレクトリも除外対象に追加します。この操作によりパスが変わるため、移したファイルを使用している箇所は適宜修正が必要になります。Zeitwerkの形式に修正Zeitwerkでファイルを読み込む際にはクラス、モジュール名とファイル名が以下のように対応している必要があります。RubyZeitwerkにより自動読み込みされるようになったら、不要なrequireは削除します。Rails.env.test?と等価です。使用していたので置き換えました。(参考)こちら一部#to_s(:format)使用していたため、置き換えました。ActionController::Parametersの変更点への対応アプリケーションでparamsを呼び出すと、ハッシュではなくオブジェクトが返されるようになりました。paramsを呼び出しオブジェクトが返されるようになった箇所にto_hを追加しました。APIが追加されました。この変更の影響で、エラーが発生していたためloggerの設定を修正しました。7.1に対応したリリースを出していない、といったところでどうしようかと悩まされたアップデートでした。Rubyのロ...2024-02-29パフォーマンス分析基盤の構築。apa...2022-07-27レポート機能の計算結果が正しいことをどう保証するのか考えた話こんにちは。DIGGLEエンジニアのhondaです。1引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。