애플리케이션 설정 개발

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

애플리케이션 설정은 application_settings 테이블에 저장됩니다. 각 설정에는 고유한 열이 있으며 한 행만 있어야 합니다.

새로운 애플리케이션 설정 추가

우선, 애플리케이션 설정을 추가해야 하는지 여부를 결정해야 합니다. 새로운 설정을 추가할 때는 구성 원칙을 고려해야 합니다.

테이블을 넓히지 않기 위해 관련 애플리케이션 설정을 단일 JSONB 열에 저장하는 것이 좋습니다. 또한 기존 열에 새 설정을 추가하는 것은 데이터베이스 검토를 요구하지 않아 시간을 절약할 수 있습니다.

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

  • 새로운 설정을 저장할 수 있는 기존 JSONB 열이 있는지 확인합니다.
  • 기존 JSON 열이 있는 경우:
    • ApplicationSetting 모델의 JSONB 열에 rate_limits과 같은 새 설정을 추가합니다.
    • 열의 JSON 스키마 유효성 검사기를 업데이트합니다. rate_limits validator를 참조하세요.
  • 사용할 수 있는 기존 JSON 열이 없는 경우:
    • application_settings 테이블에 새 JSON 열을 추가하여 저장합니다. 참조용 병합 요청을 확인하세요.
    • 항상 해시를 저장하도록 열에 제약 조건을 추가합니다. 참조용 병합 요청을 확인하세요.
    • 기존 관련 열을 새로 만든 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 키를 반드시 설정하여 리더 셀에서 다른 셀로 속성 값을 복사하는지 여부를 확인하세요. clusterwide: true로 설정하면 속성 값이 셀 아키텍처의 문맥에서 리더 셀에서 다른 셀로 복사됩니다. 대부분의 경우 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_('is too long (maximum is %{count} characters)') },
          allow_blank: true