新しいデータベースマイグレーションバージョンのご紹介

GitLabでは、開発者がGitLab.comのような大規模なテーブルのスキーマやデータを操作できるように、データベースマイグレーションに多くのヘルパーを追加しています。各データベースマイグレーションにヘルパーを含めるという繰り返しの作業を避けるために、私たちはすべてのデータベースマイグレーションに使っている RailsActiveRecord::Migration クラスのサブクラスを使っています。このサブクラスはGitlab::Database::Migration で、開発者が使用できるすべてのヘルパーがすでに含まれています。社内で作成したヘルパーの使用例は、マイグレーションにおけるダウンタイムの回避でたくさん見ることができます。

以前のすべてのデータベースマイグレーションに逆の影響を与えることなく、既存のヘルパーの機能を追加または修正する必要があることがあります。これがGitlab::Database::Migrationにバージョニングを導入した理由です。 これで、それぞれのデータベースマイグレーションはデータベースマイグレーションを書く時点でこのクラスの最新バージョンを継承できます。新しい機能を追加した後、それらの古いデータベースマイグレーションはもはや影響を受けません。Gitlab::Database::Migration[2.1] 2.1 が現在のバージョンです。

私たちは動いている目標を追いかけているので、新しいマイグレーションを追加し、古いバージョンを非推奨にすることは難しいことです。データベースのマイグレーションは毎日のように導入され、パイプラインを壊す可能性があります。このドキュメントでは、新しいデータベースマイグレーションバージョンを追加するための2段階の方法を説明します。

  1. 新しいバージョンを導入し、古いバージョンは許可したままにします。
  2. 古いバージョンのデータベースマイグレーションを使用できないようにします。

新しいバージョンを導入し、古いバージョンの使用を許可したままにします。

  1. 新しいバージョンは、新しいバージョンに含まれるべき新しいヘルパーとともに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
    
  2. ドキュメントのすべての例を更新して、新しいデータベースマイグレーションバージョンGitlab::Database::Migration[2.2] を参照するようにします。
  3. 新しいデータベースバージョンのオープンデートレートを追加することで、新しいデータベースマイグレーションでmigration_spec.rb が失敗しないようにします。

古いデータベースマイグレーションバージョンの使用を防止します。

時間が経過し、すべての開発者がマージリクエストで新しいデータベースマイグレーションバージョンを使用していることを確認したら、古いバージョンが使用されないようにします:

  1. migration_spec.rb で古いデータベース バージョンの日付範囲を閉じます。
  2. RuboCop::Cop::Migration::VersionedMigrationClass とその内部テストを修正します。
  3. この変更を Slack の#backend#database チャンネルとEngineering Week-in-Review ドキュメントで伝えてください。