新しいデータベースマイグレーションバージョンのご紹介
GitLabでは、開発者がGitLab.comのような大規模なテーブルのスキーマやデータを操作できるように、データベースマイグレーションに多くのヘルパーを追加しています。各データベースマイグレーションにヘルパーを含めるという繰り返しの作業を避けるために、私たちはすべてのデータベースマイグレーションに使っている RailsActiveRecord::Migration
クラスのサブクラスを使っています。このサブクラスはGitlab::Database::Migration
で、開発者が使用できるすべてのヘルパーがすでに含まれています。社内で作成したヘルパーの使用例は、マイグレーションにおけるダウンタイムの回避でたくさん見ることができます。
以前のすべてのデータベースマイグレーションに逆の影響を与えることなく、既存のヘルパーの機能を追加または修正する必要があることがあります。これがGitlab::Database::Migration
にバージョニングを導入した理由です。 これで、それぞれのデータベースマイグレーションはデータベースマイグレーションを書く時点でこのクラスの最新バージョンを継承できます。新しい機能を追加した後、それらの古いデータベースマイグレーションはもはや影響を受けません。Gitlab::Database::Migration[2.1]
2.1
が現在のバージョンです。
私たちは動いている目標を追いかけているので、新しいマイグレーションを追加し、古いバージョンを非推奨にすることは難しいことです。データベースのマイグレーションは毎日のように導入され、パイプラインを壊す可能性があります。このドキュメントでは、新しいデータベースマイグレーションバージョンを追加するための2段階の方法を説明します。
新しいバージョンを導入し、古いバージョンの使用を許可したままにします。
-
新しいバージョンは、新しいバージョンに含まれるべき新しいヘルパーとともに
migration.rb
クラスに追加できます。current_version
がこの新しいバージョンを参照していることを確認してください。例えばclass V2_2 < V2_1 # rubocop:disable Naming/ClassAndModuleCamelCase include Gitlab::Database::MigrationHelpers::ANY_NEW_HELPER end def self.current_version 2.2 end
- ドキュメントのすべての例を更新して、新しいデータベースマイグレーションバージョン
Gitlab::Database::Migration[2.2]
を参照するようにします。 -
新しいデータベースバージョンのオープンデートレートを追加することで、新しいデータベースマイグレーションで
migration_spec.rb
が失敗しないようにします。
古いデータベースマイグレーションバージョンの使用を防止します。
時間が経過し、すべての開発者がマージリクエストで新しいデータベースマイグレーションバージョンを使用していることを確認したら、古いバージョンが使用されないようにします:
-
migration_spec.rb
で古いデータベース バージョンの日付範囲を閉じます。 -
RuboCop::Cop::Migration::VersionedMigrationClass
とその内部テストを修正します。 - この変更を Slack の
#backend
と#database
チャンネルとEngineering Week-in-Review ドキュメントで伝えてください。