지금 개발하러갑니다

YAML Anchor, Reference - CircleCI config를 더 쉽게 작성해보자 본문

Devops

YAML Anchor, Reference - CircleCI config를 더 쉽게 작성해보자

jspark1215 2020. 1. 12. 23:05
CircleCI config.yml을 더 빠르게 작성해보자 — yaml anchor, references, extend

CircleCI config.yml을 더 빠르게 작성해보자 — yaml anchor, references, extend

CircleCI의 config 파일은 yaml 포맷으로 CI를 적용할 프로젝트의 .circleci 디렉토리 아래에 위치하게 되는데, 간단한 CI 설정을 작성할 경우에는 yaml 포맷이 크게 불편하게 느껴지지 않지만, 설정 내용이 길어지거나 계층이…

CircleCI config.yml을 더 빠르게 작성해보자 — yaml anchor, references, extend

CircleCI의 config 파일은 yaml 포맷으로 CI를 적용할 프로젝트의 .circleci 디렉토리 아래에 위치하게 되는데, 간단한 CI 설정을 작성할 경우에는 yaml 포맷이 크게 불편하게 느껴지지 않지만, 설정 내용이 길어지거나 계층이 복잡해질 경우에는 상당히 불편하게 느껴졌다.

특히, 기존에 작성했던 설정 파일을 수정하려고 할때 직관적으로 수정할 부분을 알 수 없기 때문에 굉장히 신경이 거슬렸다.(?!)

그래서 어떻게 하면 조금 더 빠르게, 편하게 CircleCI 설정 파일을 작성할 수 있을지 개인적으로 느낀점을 정리해보고자 한다.

결론부터 말하자면, YAML 포맷의 Anchor, References, Extend의 개념을 알면 더 빠르고 체계적으로 config 파일을 작성할 수 있다.

아래의 샘플 YAML 파일을 살펴보자. (아무 의미가 없는 샘플 데이터이다.)

 my-iphone:
type: phone
storage: 64
 my-android:
type: phone
storage: 64

‘type:phone, storage: 64’ 라는 key-value값이 반복되고 있다.

여기서, YAML의 Anchor를 사용하면 위 파일을 아래와 같이 작성할 수 있다.

my-iphone: &phone
type: phone
storage: 64
my-android: *phone

Anchor은 &[anchor name]의 형태로 참조할 수 있는 YAML 객체를 지정하며, *[anchor name]의 형태로 해당 YAML객체를 참조할 수 있다.

쉽게 말하자면, Anchor는 특정 부분의 복제본을 생성해주는 것이다.


Anchor를 사용한 조금 더 실용적인 상황을 살펴보자.

아래와 같은 YAML 파일을 작성하려고 한다.

my-iphone:
type: phone
storage: 64
my-android:
type: phone
storage: 64
manufacturer: samsung

Anchor와 Extend를 사용한다면 위 파일을 아래와 같이 작성할 수 있다.

my-iphone: &phone
type: phone
storage: 64
my-android:
<<: *phone
manufacturer: samsung

Extend는 <<: *[anchor name] 형태로 사용하게 되며, anchor가 참조하는 객체의 key와 value들을 가져와 상위 객체에 넣어주게 된다.

위의 경우에서는 type: phone, storage: 64를 가져와 my-android에 넣어주게 된다.

Anchor는 특정 부분을 복제하는 것이라면, Extend는 Anchor를 통해 복제한 부분을 더 확장하게 해주는 것이라 볼 수 있는 것이다.

이러한 기능을 사용하면 YAML 파일에서

  1. DRY 원칙을 지킬 수 있다.
  2. 계층이 복잡해지고 파일 내용이 길어질 경우 더욱 체계적으로 YAML 파일을 작성할 수 있다.

내가 진행한 프로젝트의 설정 파일을 예시로 한번 실제 활용 방법을 정리해보도록 하겠다.

아래의 파일은 coredns 프로젝트의 .circleci/config.yml 파일을 수정한 것으로, CircleCI 2.1버전에 추가된 orbs를 활용하여 AWS ECR에 자동적으로 docker 이미지를 푸쉬하도록 설정한 것이다.

위 파일에서는 jobs > steps에 정의되어야 할 내용들이 YAML Anchor를 활용해 분리되어 있다.

그렇기 때문에 jobs를 정의하는 부분이 매우 간결하고 어떤 작업들을 차례대로 진행하는지 직관적으로 보인다.

만약 YAML Anchor를 사용하지 않으면, 위 파일은 아래와 같이 될 것이다.

YAML Anchor를 사용하지 않았기 때문에 모든 작업 내용들이 jobs > steps 하위 영역에 들어가게 되고, 직관적이지 않게 된다.

설정 내용이 많지 않기 때문에 큰 체감은 없을 수 있지만, 추후에 파일을 수정하게 된다면 YAML Anchor를 사용한쪽이 훨씬 더 수월할 것이다.

단편적인 예시였지만, YAML Anchor를 잘 활용한다면 복잡한 설정이라도 체계적으로 작성할 수 있을 것이다.

Comments