새로운 데이터베이스 마이그레이션 버전 소개
GitLab에서는 GitLab.com과 같은 대규모로 테이블의 스키마와 데이터를 조작하는 개발자를 돕기 위해
데이터베이스 마이그레이션을 위한 많은 도우미를 추가했습니다. 각 데이터베이스 마이그레이션에 도우미를 반복적으로
포함하는 일을 피하기 위해 모든 데이터베이스 마이그레이션에 사용하는 Rails의 ActiveRecord::Migration
클래스의 하위 클래스인
Gitlab::Database::Migration
을 사용합니다. 이 하위 클래스는 이미 개발자가 사용할 수 있는 모든 도우미를 포함하고 있습니다.
내부에서 구축된 도우미의 많은 사용 사례를 마이그레이션 중 다운타임 피하기에서 볼 수 있습니다.
가끔은 기존 도우미의 기능을 추가하거나 수정해야 할 때가 있습니다. 그때 이전의 모든 데이터베이스 마이그레이션에 역효과가
없도록하기 위해 Gitlab::Database::Migration
에 버전을 도입했습니다. 이제 각 데이터베이스 마이그레이션은 작성 시점의
이 클래스의 최신 버전을 상속할 수 있습니다. 새로운 기능을 추가한 후에는 구버전의 데이터베이스 마이그레이션들에 영향을 미치지
못합니다. 우리는 일반적으로 Gitlab::Database::Migration[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
에서 새 데이터베이스 마이그레이션에 대해 실패하지 않도록 새 데이터베이스 버전에 대해 가능한 시한을 추가합니다.
이전 데이터베이스 마이그레이션 버전 사용 방지
일정 기간이 지나면서 모든 개발자들이 Merge Request에서 새 데이터베이스 마이그레이션 버전을 사용하는 것을 확인하고나면, 이전 버전은 더 이상 사용하지 못하도록 합니다.
- 이전 데이터베이스 버전에 대한
migration_spec.rb
에서 날짜 범위를 닫습니다. -
RuboCop::Cop::Migration::VersionedMigrationClass
와 소유한 테스트들을 수정합니다. - 이 변경 내용을 Slack의
#backend
및#database
채널과 Engineering Week-in-Review 문서에서 전달합니다.