새로운 데이터베이스 마이그레이션 버전 소개

GitLab에서는 GitLab.com과 같은 대규모로 테이블의 스키마와 데이터를 조작하는 개발자를 돕기 위해 데이터베이스 마이그레이션을 위한 많은 도우미를 추가했습니다. 각 데이터베이스 마이그레이션에 도우미를 반복적으로 포함하는 일을 피하기 위해 모든 데이터베이스 마이그레이션에 사용하는 Rails의 ActiveRecord::Migration 클래스의 하위 클래스인 Gitlab::Database::Migration을 사용합니다. 이 하위 클래스는 이미 개발자가 사용할 수 있는 모든 도우미를 포함하고 있습니다. 내부에서 구축된 도우미의 많은 사용 사례를 마이그레이션 중 다운타임 피하기에서 볼 수 있습니다.

가끔은 기존 도우미의 기능을 추가하거나 수정해야 할 때가 있습니다. 그때 이전의 모든 데이터베이스 마이그레이션에 역효과가 없도록하기 위해 Gitlab::Database::Migration에 버전을 도입했습니다. 이제 각 데이터베이스 마이그레이션은 작성 시점의 이 클래스의 최신 버전을 상속할 수 있습니다. 새로운 기능을 추가한 후에는 구버전의 데이터베이스 마이그레이션들에 영향을 미치지 못합니다. 우리는 일반적으로 Gitlab::Database::Migration[2.1]과 같이 버전을 참조합니다.

이동하는 대상을 추적하고 있기 때문에 새로운 마이그레이션을 추가하고 이전 버전을 사용하지 못하도록 하는 과정은 어려울 수 있습니다. 데이터베이스 마이그레이션은 매일 도입되며, 이것은 파이프라인을 망가뜨릴 수 있습니다. 이 문서에서는 새로운 데이터베이스 마이그레이션 버전을 추가하는 두 단계 방법을 설명합니다.

  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에서 새 데이터베이스 마이그레이션에 대해 실패하지 않도록 새 데이터베이스 버전에 대해 가능한 시한을 추가합니다.

이전 데이터베이스 마이그레이션 버전 사용 방지

일정 기간이 지나면서 모든 개발자들이 Merge Request에서 새 데이터베이스 마이그레이션 버전을 사용하는 것을 확인하고나면, 이전 버전은 더 이상 사용하지 못하도록 합니다.

  1. 이전 데이터베이스 버전에 대한 migration_spec.rb에서 날짜 범위를 닫습니다.
  2. RuboCop::Cop::Migration::VersionedMigrationClass소유한 테스트들을 수정합니다.
  3. 이 변경 내용을 Slack의 #backend#database 채널과 Engineering Week-in-Review 문서에서 전달합니다.