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

GitLab에서는 GitLab.com과 같은 대규모 테이블의 스키마 및 데이터를 개발자가 조작하는 데 도움이 되는 다양한 데이터베이스 마이그레이션용 헬퍼를 추가했습니다. 각 데이터베이스 마이그레이션에서 헬퍼를 반복해서 포함시키는 번거로움을 피하기 위해, 우리는 모든 데이터베이스 마이그레이션에 사용하는 Rails ActiveRecord::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 문서에 공유합니다.