새 데이터베이스 마이그레이션 버전 소개
GitLab에서는 GitLab.com 같은 대규모 테이블의 스키마 및 데이터를 개발자가 조작하는 데 도움이 되는 데이터베이스 마이그레이션용 많은 헬퍼를 추가했습니다. 각 데이터베이스 마이그레이션에 헬퍼를 반복해서 포함하는 작업을 피하기 위해 모든 데이터베이스 마이그레이션에 사용하는 Rails ActiveRecord::Migration
클래스의 서브클래스를 사용합니다. 이 서브클래스는 Gitlab::Database::Migration
이며, 이미 개발자들이 사용할 수 있는 모든 헬퍼를 포함하고 있습니다. 우리가 직접 만든 많은 헬퍼의 사용 예시는 마이그레이션 중 다운타임 회피에서 확인할 수 있습니다.
가끔은 이전 데이터베이스 마이그레이션에 이후의 영향을 주지 않도록 헬퍼의 기존 기능을 추가하거나 수정해야 할 때가 있습니다. 그래서 Gitlab::Database::Migration
에 버전 관리를 도입했습니다. 이제 각 데이터베이스 마이그레이션은 데이터베이스 마이그레이션 작성 시점에서 이 클래스의 최신 버전을 상속할 수 있습니다. 새 기능을 추가한 후에는 이전 데이터베이스 마이그레이션을 더 이상 영향을 주지 않습니다. 우리는 주로 Gitlab::Database::Migration[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
- 문서의 모든 예시를 새 데이터베이스 마이그레이션 버전
Gitlab::Database::Migration[2.2]
을 참조하도록 업데이트합니다. -
migration_spec.rb
가 새 데이터베이스 마이그레이션에 대해 실패하지 않도록 새 데이터베이스 버전을 위한 open date rate을 추가합니다.
이전 데이터베이스 마이그레이션 버전의 사용 방지
일정 시간이 지나고 모든 개발자들이 MR(병합 요청)에서 새 데이터베이스 마이그레이션 버전을 사용하도록 보장한 후에는 이전 데이터베이스 마이그레이션 버전이 사용되지 않도록 해야 합니다:
- 이전 데이터베이스 버전에 대한
migration_spec.rb
에서 날짜 범위를 닫습니다. -
RuboCop::Cop::Migration::VersionedMigrationClass
및 해당 소유 테스트들을 수정합니다. - 이 변경 내용을 우리의 Slack
#backend
및#database
채널, 그리고 엔지니어링 주간 회고문서에 공유합니다.