애플리케이션 설정 개발

이 문서는 기여자가 GitLab에 애플리케이션 설정을 추가하기 위한 개발 가이드를 제공합니다.

애플리케이션 설정은 application_settings 테이블에 저장됩니다. 각 설정은 자신의 열을 가지며, 단 하나의 행만 있어야 합니다.

새 애플리케이션 설정 추가

우선, 애플리케이션 설정을 추가할 필요성이 있는지 결정해야 합니다.

새 설정을 추가할 때는 우리의 구성 원칙을 고려하세요.

관련 애플리케이션 설정을 단일 JSONB 열에 저장하는 것을 선호하여 application_settings 테이블의 크기가 커지는 것을 방지합니다. 또한, 기존 열에 새 설정을 추가하면 데이터베이스 검토가 필요하지 않으므로 시간이 절약됩니다.

새 설정을 추가하려면, 다음을 수행해야 합니다:

  • 새 설정을 저장할 수 있는 기존 JSONB 열이 있는지 확인합니다.
  • 기존 JSON 열이 있는 경우:
    • ApplicationSetting 모델의 rate_limits와 같이 JSONB 열에 새 설정을 추가합니다.
    • rate_limits validator처럼 열에 대한 JSON 스키마 검증기를 업데이트합니다.
  • 사용할 수 있는 기존 JSON 열이 없는 경우:
    • 새 JSON 열을 application_settings 테이블에 추가하여 저장합니다. 참조용으로 이 병합 요청을 확인하세요.
    • 열이 항상 해시를 저장하도록 보장하는 제약 조건을 추가합니다. 참조용으로 이 병합 요청을 확인하세요.
    • 기존 관련 열을 새로 생성된 JSONB 열로 이동하기 위한 후속 문제를 만듭니다.
  • 보이는 속성 목록에 새 설정을 추가합니다.
  • 설정에 기본값이 있는 경우 ApplicationSettingImplementation#defaults에도 새 설정을 추가합니다.
  • 설정에 기본값이 있는 경우 기본값에 대한 테스트를 추가합니다.
  • ApplicationSetting 모델에 새 필드에 대한 검증을 추가합니다.
  • 검증 및 기본값에 대한 모델 테스트를 추가합니다.
  • 올바른 뷰 파일을 찾거나 새로 만들고 새 설정에 대한 폼 필드를 추가합니다.
  • API 문서를 업데이트합니다. 애플리케이션 설정은 REST API에서 자동으로 사용 가능해집니다.
  • scripts/cells/application-settings-analysis.rb 스크립트를 실행하여 config/application_setting_columns/*.yml에 정의 YAML 파일을 생성하고, db/structure.sql 및 API 문서를 기반으로 cells/application_settings_analysis 문서 파일을 업데이트합니다. 정의 파일이 생성된 후, 반드시 clusterwide 키를 true 또는 false로 설정하세요. clusterwide: true를 설정하면 기능 값이 리더 셀에서 다른 셀로 복사됩니다 Cells 아키텍처의 맥락에서. 대부분의 경우, clusterwide: false가 바람직합니다.

데이터베이스 마이그레이션 예제

class AddNewSetting < Gitlab::Database::Migration[2.1]
  disable_ddl_transaction!

  def up
    with_lock_retries do
      add_column :application_settings, :new_setting, :text, if_not_exists: true
    end

    add_text_limit :application_settings, :new_setting, 255
  end

  def down
    with_lock_retries do
      remove_column :application_settings, :new_setting, if_exists: true
    end
  end
end

모델 유효성 검사 예제

validates :new_setting,
          length: { maximum: 255, message: N_('너무 깁니다(최대 %{count} 자입니다)') },
          allow_blank: true