Git 파일 Generator 글롭(Globbing)

Git 파일 Generator 글롭(Globbing)

기본 Git 파일 generator는 아주 탐욕적인(greedy) 글롭을 해서 의도치 않은 파일까지 잡거나 오류를 내기 쉬워요. 예를 들어 cluster-charts/*/*/values.yaml 패턴을 cluster-charts/**/values.yaml처럼 해석해 서브차트의 파일까지 포함해 버려요. doublestar 기반의 새로운 글롭을 활성화하면 더 기대에 맞는 매칭을 할 수 있어요.

출처: 문서

본문

문제 상황 (Problem Statement)

Git 파일 generator의 원래·기본 구현은 아주 탐욕적인(greedy) 글롭을 해요. 이 때문에 오류가 발생하거나 사용자를 당황시킬 수 있어요. 예를 들어 다음 저장소 구성을 생각해 봐요.

└── cluster-charts/
    ├── cluster1
    │   ├── mychart/
    │   │   ├── charts/
    │   │   │   └── mysubchart/
    │   │   │       ├── values.yaml
    │   │   │       └── etc…
    │   │   ├── values.yaml
    │   │   └── etc…
    │   └── myotherchart/
    │       ├── values.yaml
    │       └── etc…
    └── cluster2
        └── etc…

cluster1에는 차트가 두 개 있고, 그중 하나에는 서브차트가 있어요.

ApplicationSet이 values.yaml의 값을 템플릿으로 만들려면 디렉토리 generator 대신 Git 파일 generator를 사용해야 해요. Git 파일 generator의 path 키 값은 다음과 같이 설정해야 해요.

path: cluster-charts/*/*/values.yaml

그런데 기본 구현은 위 패턴을 다음과 같이 해석해요.

path: cluster-charts/**/values.yaml

cluster1mychart에 대해 차트의 values.yaml뿐 아니라 서브차트의 values.yaml까지 잡아내요. 이는 대부분 실패할 가능성이 높고, 설령 실패하지 않더라도 잘못된 결과예요.

바람직하지 않은 글롭이 실패할 수 있는 다른 방식도 여럿 있어요. 예를 들어:

path: some-path/*.yaml

이것은 some-path 바로 아래의 파일뿐 아니라, some-path 아래 모든 레벨의 모든 디렉토리에 있는 모든 YAML 파일을 반환해요.

새 글롭 활성화 (Enabling the New Globbing)

일부 사용자는 예전 동작에 의존할 수 있으므로, 이 수정을 선택 사항으로 만들고 기본으로 활성화하지 않기로 했어요.

다음 중 아무 방법으로나 활성화할 수 있어요.

  1. ApplicationSet 컨트롤러 인자에 --enable-new-git-file-globbing을 전달.
  2. ApplicationSet 컨트롤러 환경 변수에 ARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_NEW_GIT_FILE_GLOBBING=true 설정.
  3. argocd-cmd-params-cm ConfigMap에 applicationsetcontroller.enable.new.git.file.globbing: "true" 설정.

기본값은 향후 바뀔 수 있다는 점을 참고하세요.

사용법 (Usage)

새 Git 파일 generator 글롭은 doublestar 패키지를 사용해요.

아래는 그 문서에서 발췌한 간단한 내용이에요.

doublestar 패턴은 파일과 디렉토리를 재귀적으로 매칭해요. 예를 들어 다음 디렉토리 구조가 있다면:

grandparent
`-- parent
    |-- child1
    `-- child2

자식들을 **/child*, grandparent/**/child?, **/parent/*, 또는 심지어 **(모든 파일·디렉토리를 재귀적으로 반환) 같은 패턴으로 찾을 수 있어요.

Bash의 globstar가 doublestar의 영감이며, 그래서 비슷하게 동작해요. doublestar는 경로 컴포넌트 자체로만 나타나야 한다는 점에 주의하세요. /path** 같은 패턴은 유효하지 않으며 /path*와 동일하게 취급되지만, /path*/**는 원하는 결과를 달성할 수 있어요. 또한 /path/**는 path 디렉토리 아래의 모든 디렉토리와 파일을 매칭하지만, /path/**/는 디렉토리만 매칭해요.

더 알아보기 (Learn more)