Enum 생성하기
GitLab v19.1데이터가 정적이고, 런타임에 절대 변경되지 않으며, Cell 전체에서 일관된 ID를 가져야 하는 경우, 데이터베이스 기반 enum 대신 고정 항목 모델(fixed items model)을 사용하는 것을 고려하세요. 새 enum을 생성할 때는 데이터베이스 타입으로 SMALLINT를 사용해야 합니다.
데이터가 정적이고, 런타임에 절대 변경되지 않으며, Cell 전체에서 일관된 ID를 가져야 하는 경우, 데이터베이스 기반 enum 대신 고정 항목 모델(fixed items model)을 사용하는 것을 고려하세요.
새 enum을 생성할 때는 데이터베이스 타입으로 SMALLINT를 사용해야 합니다.
SMALLINT 타입의 크기는 2바이트로, enum에 충분합니다.
이를 통해 데이터베이스 공간을 절약할 수 있습니다.
이 타입을 사용하려면 칼럼을 생성하는 마이그레이션에 limit: 2를 추가하세요.
예시:
def change
add_column :ci_job_artifacts, :file_format, :integer, limit: 2
end
모든 키/값 쌍은 FOSS에 정의해야 합니다#
요약: 모델이 FOSS의 일부인 경우, 모든 enum은 FOSS에 정의되어야 합니다.
class Model < ApplicationRecord
enum platform: {
aws: 0,
gcp: 1 # EE-only
}
end
enum에 새 키/값 쌍을 추가할 때 해당 쌍이 EE 전용인 경우, 다음과 같이 enum을 구성하고 싶을 수 있습니다:
# Define `failure_reason` enum in `Pipeline` model:
class Pipeline < ApplicationRecord
enum failure_reason: Enums::Pipeline.failure_reasons
end
# Define key/value pairs that used in FOSS and EE:
module Enums
module Pipeline
def self.failure_reasons
{ unknown_failure: 0, config_error: 1 }
end
end
end
Enums::Pipeline.prepend_mod_with('Enums::Pipeline')
# Define key/value pairs that used in EE only:
module EE
module Enums
module Pipeline
override :failure_reasons
def failure_reasons
super.merge(job_activity_limit_exceeded: 2)
end
end
end
end
이 방식은 동작하지만, 다음과 같은 몇 가지 단점이 있습니다:
-
EE에서 FOSS에 정의된 값과 충돌하는 키/값 쌍을 정의할 수 있습니다. 예를 들어,
EE::Enums::Pipeline에job_activity_limit_exceeded: 1을 정의하는 경우입니다. -
이런 일이 발생하면, 기능이 완전히 다르게 동작합니다. 예를 들어,
failure_reason이config_error인지job_activity_limit_exceeded인지 알 수 없게 됩니다. -
이런 일이 발생하면, 데이터 무결성을 수정하기 위한 데이터베이스 마이그레이션을 배포해야 하는데, 원래 값을 복구할 수 없는 경우 불가능할 수 있습니다.
또한, EE 모듈의 값에 오프셋을 설정하는 방식으로 이 문제를 우회하려는 시도를 볼 수 있습니다.
예를 들어, 다음 예시는 1000을 오프셋으로 설정합니다:
module EE
module Enums
module Pipeline
override :failure_reasons
def failure_reasons
super.merge(job_activity_limit_exceeded: 1_000, size_limit_exceeded: 1_001)
end
end
end
end
이 방식이 우회책으로 동작하는 것처럼 보이지만, 다음과 같은 단점이 있습니다:
-
기능이 EE에서 FOSS로 또는 그 반대로 이동할 수 있습니다. 따라서 나중에 오프셋이 FOSS와 EE 간에 혼재될 수 있습니다. 예를 들어,
job_activity_limit_exceeded를 FOSS로 이동하면{ unknown_failure: 0, config_error: 1, job_activity_limit_exceeded: 1_000 }과 같이 됩니다. -
enum의 정수 칼럼은SMALLINT로 생성될 가능성이 높습니다. 따라서 오프셋이 2바이트 정수의 최댓값을 초과하지 않도록 주의해야 합니다.
결론적으로, 모든 키/값 쌍을 FOSS에 정의해야 합니다. 예를 들어, 위의 경우 다음과 같이 작성할 수 있습니다:
class Pipeline < ApplicationRecord
enum failure_reason: {
unknown_failure: 0,
config_error: 1,
job_activity_limit_exceeded: 2
}
end
빈 공간에 새 값 추가하기#
일부 EE와 FOSS enum을 병합한 후, 두 그룹의 값 사이에 빈 공간이 생길 수 있습니다:
module Enums
module Ci
module CommitStatus
def self.failure_reasons
{
# ...
data_integrity_failure: 12,
forward_deployment_failure: 13,
insufficient_bridge_permissions: 1_001,
downstream_bridge_project_not_found: 1_002,
# ...
}
end
end
end
end
새 값을 추가하려면 먼저 빈 공간을 채워야 합니다.
위 예시에서 1_003 대신 14를 추가합니다:
{
# ...
data_integrity_failure: 12,
forward_deployment_failure: 13,
a_new_value: 14,
insufficient_bridge_permissions: 1_001,
downstream_bridge_project_not_found: 1_002,
# ...
}