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

GitLab에서는 GitLab.com 같은 대규모 테이블의 스키마 및 데이터를 개발자가 조작하는 데 도움이 되는 데이터베이스 마이그레이션용 많은 헬퍼를 추가했습니다. 각 데이터베이스 마이그레이션에 헬퍼를 반복해서 포함하는 작업을 피하기 위해 모든 데이터베이스 마이그레이션에 사용하는 Rails ActiveRecord::Migration 클래스의 서브클래스를 사용합니다. 이 서브클래스는 Gitlab::Database::Migration이며, 이미 개발자들이 사용할 수 있는 모든 헬퍼를 포함하고 있습니다. 우리가 직접 만든 많은 헬퍼의 사용 예시는 마이그레이션 중 다운타임 회피에서 확인할 수 있습니다.

가끔은 이전 데이터베이스 마이그레이션에 이후의 영향을 주지 않도록 헬퍼의 기존 기능을 추가하거나 수정해야 할 때가 있습니다. 그래서 Gitlab::Database::Migration에 버전 관리를 도입했습니다. 이제 각 데이터베이스 마이그레이션은 데이터베이스 마이그레이션 작성 시점에서 이 클래스의 최신 버전을 상속할 수 있습니다. 새 기능을 추가한 후에는 이전 데이터베이스 마이그레이션을 더 이상 영향을 주지 않습니다. 우리는 주로 Gitlab::Database::Migration[2.1]과 같은 방식으로 버전을 참조합니다. 여기서 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가 새 데이터베이스 마이그레이션에 대해 실패하지 않도록 새 데이터베이스 버전을 위한 open date rate을 추가합니다.

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

일정 시간이 지나고 모든 개발자들이 MR(병합 요청)에서 새 데이터베이스 마이그레이션 버전을 사용하도록 보장한 후에는 이전 데이터베이스 마이그레이션 버전이 사용되지 않도록 해야 합니다:

  1. 이전 데이터베이스 버전에 대한 migration_spec.rb에서 날짜 범위를 닫습니다.
  2. RuboCop::Cop::Migration::VersionedMigrationClass해당 소유 테스트들을 수정합니다.
  3. 이 변경 내용을 우리의 Slack #backend#database 채널, 그리고 엔지니어링 주간 회고문서에 공유합니다.