CI/CD 구성에 기여하기
용어집
- CI/CD 구성: 프로젝트의 CI/CD 구성을 정의하는 YAML 파일입니다.
 - 키워드: CI/CD 구성 내의 각 키워드입니다.
 - 
엔트리: CI/CD 구성 내의 키워드를 나타내는 
Entry클래스입니다. 
CI/CD 구성의 모든 키워드가 Entry 클래스로 표현되는 것은 아닙니다. 복잡한 구조나 재사용 가능한 부분을 갖는 키워드에 대해 Entry 클래스를 생성합니다.
예를 들어,
- 
image키워드는Entry::Image클래스에 의해 표현됩니다. - 
image키워드의name하위 키워드는Entry클래스로 표현되지 않습니다. - 
image키워드의pull_policy하위 키워드는Entry::PullPolicy클래스에 의해 표현됩니다. 
새로운 키워드 추가
CI 구성 키워드는 lib/gitlab/ci/config/entry 디렉터리에 추가됩니다.
EE(Enterprise Edition) 특정 변경 사항의 경우, ee/lib/gitlab/ci/config/entry
또는 ee/lib/ee/gitlab/ci/config/entry 디렉터리를 사용하세요.
상속
엔트리는 다음을 상속하는 클래스에 의해 표현됩니다.
- 
Entry::Node: 단순한 키워드의 경우. (예:Entry::Stage) - 
Entry::Simplifiable: 여러 구조를 갖는 키워드의 경우. 예를 들어,Entry::Retry는 간단한 숫자 또는 해시 구성일 수 있습니다. - 
Entry::ComposableArray: 단일 유형 하위 요소 디렉터리을 갖는 키워드의 경우. 예를 들어,Entry::Includes는Entry::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::Attributable 및 Entry::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::YamlProcessor::FeatureFlags.enabled?(:secret_file_available, type: :beta)
end
피처 플래그 액터
엔트리 클래스에서는 현재 프로젝트 또는 사용자에 대한 액세스 권한이 없습니다. 그러나 액터 없이 피처 플래그를 사용하는 것은 권장되지 않습니다. 이 문제를 해결하기 위해 세 가지 옵션이 있습니다.
- 
Feature.enabled?(:feature_flag, Feature.current_request)사용. - 
YamlProcessor::FeatureFlags.enabled?(:feature_flag)사용. - 엔트리 클래스에서 피처 플래그를 사용하지 말고 코드의 다른 부분에서 사용하세요.
 
테스트 및 유효성 검사
엔트리를 추가하거나 수정할 때 해당하는 스펙 파일을 추가하거나 업데이트해야 합니다.
게다가, 완전히 통합된 테스트를 위해 spec/lib/gitlab/ci/yaml_processor_spec.rb 파일이나
spec/lib/gitlab/ci/yaml_processor/test_cases/* 디렉터리의 파일에 테스트를 추가/수정하는 것도 중요합니다.
도움말