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

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가 새로운 데이터베이스 마이그레이션에 대해 실패하지 않도록 새 데이터베이스 버전에 대한 오픈 날짜 범위를 추가합니다.

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

시간이 지나고 모든 개발자가 새로운 데이터베이스 마이그레이션 버전을 머지 요청에서 사용하고 있는지 확인한 후, 이전 버전의 사용을 방지합니다:

  1. migration_spec.rb에서 이전 데이터베이스 버전의 날짜 범위를 닫습니다.

  2. RuboCop::Cop::Migration::VersionedMigrationClass소속된 테스트를 수정합니다.

  3. 이 변경 사항을 우리의 Slack #backend#database 채널에 전달하고 Engineering Week-in-Review 문서에 알립니다.