Railsアップグレードのガイドライン
パフォーマンス、セキュリティアップデート、新機能の恩恵を受けるために、私たちは最新のRailsリリースを使ってGitLabを運営するよう努めています。
Rails アップグレードのアプローチ
- GitLab用のMRを準備します。
- GitalyのMRを準備します。
- セキュリティパッチのパッチリリースとバックポートの作成。
GitLab 用の MR の準備
- Ruby on Rails のアップグレードガイドを確認し、今後の変更に備えてアプリケーションを準備しましょう。
-
Gemfileのrailsgem バージョンを更新します。 -
bundle update railsを実行してください。 - アップデートタスクの実行
rake rails:update. -
qa/Gemfileのactivesupportバージョンを更新します。 -
qaフォルダー内のbundle update --conservative activesupportを実行してください。 - Bundlerの競合を解決します。
-
@rails/ujsと@rails/actioncableの npm パッケージがpackage.jsonの新しい Rails バージョンと一致していることを確認します。 - 更新後に
yarn patch-package @rails/ujsを実行して、ローカルのパッチファイルのバージョンが一致していることを確認してください。 -
pipeline:run-all-rspecのラベルで MR を作成し、パイプラインが壊れるかどうかを確認してください。 - Railsリポジトリに対して
git bisect。以下のデバッグのセクションを参照してください。 - マージリクエストの説明に、2つのバージョン間のGem diffへのリンクを含めてください。例えば、これは
activesupport6.1.3.2 から 6.1.4.1 の gem diff です。
Gitaly用のMRの準備
-
GitalyのGemfileの
activesupportgemのバージョンを更新します。 -
bundle update --conservative activesupportを実行してください。 - これらの変更を加えたGitalyプロジェクトに対してMRを作成します。
- このMRをGitLabプロジェクトで作成されたMRに依存させます。
- GitLabプロジェクトのMRをマージした後にのみ、このMRをマージ。
セキュリティパッチのパッチリリースとバックポートの作成
Railsのアップグレードがパッチリリース以上であり、重要なセキュリティ修正が含まれている場合は、必ずGitLabパッチリリースで自主管理顧客にリリースしてください。進め方についてはリリースマネージャに相談してください。
非推奨ロガー
また、RubyとRailsの非推奨に関する警告を専用のログファイルlog/deprecation_json.log に記録しています。 テストで十分にカバーされておらず、DeprecationToolkitEnv を通過してしまうようなコードがある場合に手がかりとなります。
GitLab SaaSの場合、GitLabのチームメンバーはKibana (https://log.gprd.gitlab.net/goto/f7cebf1ff05038d901ba2c45925c7e01) でこれらのログイベントを調べることができます。
Railsに対するGitバイセクト
通常、specの失敗の原因となったRailsの変更がわかれば、コンテキストが追加され、失敗の修正を見つけるのに役立ちます。specの失敗の原因となったRailsの変更を効率的かつ迅速に見つけるには、Railsリポジトリに対してgit bisect :
-
お好みのフォルダに
railsプロジェクトをクローンします。たとえば、GDKのルートディレクトリなどです:cd <GDK_FOLDER> git clone https://github.com/rails/rails.git -
GitLab
Gemfileのgem 'rails'行を置き換えてください:gem 'rails', ENV['RAILS_VERSION'], path: ENV['RAILS_FOLDER'] -
RAILS_FOLDER環境変数に Rails をクローンしたフォルダを設定します:export RAILS_FOLDER="<GDK_FOLDER>/rails" -
ディレクトリを
RAILS_FOLDERに変更し、git bisectコマンドの範囲を設定します:cd $RAILS_FOLDER git bisect start <NEW_VERSION_TAG> <OLD_VERSION_TAG>ここで、
<NEW_VERSION_TAG>は仕様が赤のタグ、<OLD_VERSION_TAG>は仕様が緑のタグです。例えば、バージョン6.1.3.2から6.1.4.1にアップグレードする場合、git bisect start v6.1.4.1 v6.1.3.2。<NEW_VERSION_TAG>を仕様が赤のタグに、<OLD_VERSION_TAG>を仕様が緑のタグに置き換えてください。例えば、バージョン6.1.3.2から6.1.4.1にアップグレードする場合は、git bisect start v6.1.4.1 v6.1.3.2。出力では、コミットを見つけるまでにおよそ何ステップかかったかがわかります。 -
git bisectプロセスを起動し、spec のファイル名を引数としてscripts/rails-update-bisectに渡します。specファイル全体ではなく、1つの例だけを選んだ方が速い場合があります。git bisect run <GDK_FOLDER>/gitlab/scripts/rails-update-bisect spec/models/ability_spec.rb # OR git bisect run <GDK_FOLDER>/gitlab/scripts/rails-update-bisect spec/models/ability_spec.rb:7 - 処理が完了すると、
git bisectにコミットハッシュが表示されます。このハッシュを使用して、rails/railsリポジトリで対応する MR を見つけることができます。 -
bisectモードを終了するにはgit bisect resetを実行します。 -
Gemfileに変更を戻します:git checkout -- Gemfile