CI/CD 구성에 기여하기

용어집

  • CI/CD 구성: 프로젝트의 CI/CD 구성을 정의하는 YAML 파일입니다.
  • 키워드: CI/CD 구성에서 각 키워드입니다.
  • 항목: CI/CD 구성에서 키워드를 나타내는 Entry 클래스입니다.

모든 키워드가 Entry 클래스로 표현되는 것은 아닙니다.

우리는 구조가 복잡하거나 재사용 가능한 부분을 가진 키워드에 대해 Entry 클래스를 만듭니다.

예를 들어;

  • image 키워드는 Entry::Image 클래스에 의해 표현됩니다.
  • image 키워드의 name 하위 키워드는 Entry 클래스에 의해 표현되지 않습니다.
  • image 키워드의 pull_policy 하위 키워드는 Entry::PullPolicy 클래스에 의해 표현됩니다.

새로운 키워드 추가하기

CI 구성 키워드는 lib/gitlab/ci/config/entry 디렉토리에 추가됩니다.

EE 특정 변경사항은 ee/lib/gitlab/ci/config/entry 또는 ee/lib/ee/gitlab/ci/config/entry 디렉토리를 사용하세요.

상속

항목은 다음과 같은 클래스를 상속받아 표현됩니다;

  • Entry::Node: 간단한 키워드의 경우. (예: Entry::Stage)
  • Entry::Simplifiable: 여러 구조를 가진 키워드의 경우. 예를 들어, Entry::Retry는 간단한 숫자 또는 해시 구성일 수 있습니다.
  • Entry::ComposableArray: 단일 유형의 하위 요소 목록이 있는 키워드의 경우. 예를 들어, Entry::IncludesEntry::Include 요소 목록을 가집니다.
  • Entry::ComposableHash: 사용자 정의 키가 있는 단일 유형의 하위 요소가 있는 키워드의 경우. 예를 들어, Entry::Variables는 사용자 정의 키가 있는 Entry::Variable 요소 목록을 가집니다.

헬퍼 클래스

다음 헬퍼 클래스는 항목에서 사용할 수 있습니다:

  • Entry::Validatable: 항목 클래스에서 validations 블록을 활성화하고 유효성 검사를 제공합니다.
  • Entry::Attributable: 항목 클래스에서 attributes 메서드를 활성화합니다. 각 속성에 대해 xxx, has_xxx?, has_xxx_value?와 같은 메서드를 생성합니다.
  • Entry::Configurable: 항목 클래스에서 entry 메서드를 활성화합니다. 각 항목에 대해 xxx_defined?, xxx_entry, xxx_value와 같은 메서드를 생성합니다.

value 메서드

value 메서드는 엔트리 클래스의 주요 메서드입니다. 이 메서드는 엔트리의 실제 값을 반환합니다.

기본적으로 Entry::Node 클래스에서 value 메서드는 중첩 엔트리가 없는 경우 엔트리의 해시 구성을 반환합니다.

단순한 엔트리의 경우 유용할 수 있습니다. 예를 들어, Entry::Paths는 문자열 배열을 값으로 가지고 있습니다. 따라서, 문자열 배열을 직접 반환할 수 있습니다.

일부 키워드에서는 value 메서드를 오버라이드합니다. 이 메서드에서는 엔트리에서 무엇을 언제 어떻게 반환할지를 정의합니다.

Entry::AttributableEntry::Configurable의 사용이 여기에서 중요한 역할을 할 수 있습니다. 예를 들어,

Entry::Secret에는 다음과 같은 내용이 있습니다;

attributes %i[vault file token].freeze

entry :vault, Entry::Vault::Secret
entry :file, ::Gitlab::Config::Entry::Boolean

def value
  {
    vault: vault_value,
    file: file_value,
    token: token
  }.compact
end
  • vault_value는 중첩된 vault 엔트리의 값입니다.

  • file_value는 중첩된 file 엔트리의 값입니다.

  • token은 기본 token 속성의 값입니다.

항상 중첩 엔트리의 값을 가져오기 위해 xxx_value 메서드를 사용하는 것이 중요합니다.

기능 플래그 사용

새로운 CI/CD 구성 키워드를 추가할 때, 변경사항의 롤아웃을 제어하기 위해 기능 플래그를 사용하는 것이 중요합니다.

이는 모든 사용자에게 영향을 주지 않고 프로덕션에서 변경 사항을 테스트할 수 있게 합니다. 자세한 내용은 기능 플래그 문서를 참조하세요.

기능 플래그를 확인할 수 있는 일반적인 장소는 Gitlab::Config::Entry::Node#value 메서드입니다. 예를 들어:

def value
  {
    vault: vault_value,
    file: file_available? ? file_value : nil,
    token: token
  }.compact
end

private

def file_available?
  ::Gitlab::Ci::Config::FeatureFlags.enabled?(:secret_file_available, type: :beta)
end

기능 플래그 액터

엔트리 클래스에서는 현재 프로젝트나 사용자에 대한 접근 권한이 없습니다. 그러나 액터 없이 기능 플래그를 사용하는 것은 권장되지 않습니다.

이 문제를 해결하기 위해 세 가지 옵션이 있습니다;

  1. Feature.enabled?(:feature_flag, Feature.current_request) 사용하기.

  2. Config::FeatureFlags.enabled?(:feature_flag) 사용하기.

  3. 엔트리 클래스에서 기능 플래그를 사용하지 않고 코드의 다른 부분에서 사용하기.

테스트 및 검증

엔트리를 추가하거나 수정할 때, 해당 사양 파일을 추가하거나 업데이트해야 합니다.

또한, 완전한 통합 테스트를 갖기 위해서는 spec/lib/gitlab/ci/yaml_processor_spec.rb 파일 또는 spec/lib/gitlab/ci/yaml_processor/test_cases/* 디렉토리의 테스트를 추가/수정하는 것도 중요합니다.