Railsアップグレードのガイドライン
パフォーマンス、セキュリティアップデート、新機能の恩恵を受けるために、私たちは最新のRailsリリースを使ってGitLabを運営するよう努めています。
Rails アップグレードのアプローチ
- GitLab用のMRを準備します。
- GitalyのMRを準備します。
- セキュリティパッチのパッチリリースとバックポートの作成。
GitLab 用の MR の準備
- Ruby on Rails のアップグレードガイドを確認し、今後の変更に備えてアプリケーションを準備しましょう。
-
Gemfile
のrails
gem バージョンを更新します。 -
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へのリンクを含めてください。例えば、これは
activesupport
6.1.3.2 から 6.1.4.1 の gem diff です。
Gitaly用のMRの準備
-
GitalyのGemfileの
activesupport
gemのバージョンを更新します。 -
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