코드/CI-CD-Docker

[CI/CD] YAML Anchor

Yeah-Panda 2024. 7. 30. 09:01

YAML 기능 중에 anchor 라는 것이 있다.

html 상의 anchor 과는 약간 궤를 달리 한다.

 

아래와 같은 구조가 있다고 가정하자.

person:
  name: &name KTH_self
  age: 29
  isMale: false
  hobby:
    - scuba
    - swimming
    - squash
  friends:
    - name: Sunhee
      age: 19
    - name: Jiyeon
      age: 19
  stuff: [iphone, ipad]
  self: *name

 

&name 이라는 앵커와 KTH 라는 값을 선언한다.

아래쪽 self 에서 * 와 함께 바로 사용할 수 있다.

 

JSON 변환

{
  "person": {
    "name": "KTH_self",
    "age": 29,
    "isMale": false,
    "hobby": [
      "scuba",
      "swimming",
      "squash"
    ],
    "friends": [
      {
        "name": "Sunhee",
        "age": 19
      },
      {
        "name": "Jiyeon",
        "age": 19
      }
    ],
    "stuff": [
      "iphone",
      "ipad"
    ],
    "self": "KTH_self"
  }
}

 

 

이렇게 보면 별것 아닌 것 같지만 다수의 복잡한 YAML 을 정의시 중복 코드와 오류를 방지 할수 있다.

다음을 보자

 

person_base: &base # 앵커 선언
  city: seoul
  country: korea

person:
  <<: *base   # <<: *앵커이름
  name: &name KTH_self
  age: 29
  isMale: false
  hobby:
    - scuba
    - swimming
    - squash
  friends:
    - name: Sunhee
      age: 19
    - name: Jiyeon
      age: 19
  stuff: [iphone, ipad]
  self: *name


person2:
  <<: *base   # <<: *앵커이름
  name: &name kimtaehoon
  age: 39
  isMale: true
  hobby:
    - tennis
    - swimming
  friends:
    - name: Sunhee
      age: 29
    - name: Jiyeon
      age: 29
  stuff: [macbook]
  self: *name

 

to JSON

{
  "person_base": {
    "city": "seoul",
    "country": "korea"
  },
  "person": {
    "city": "seoul",
    "country": "korea",
    "name": "KTH_self",
    "age": 29,
    "isMale": false,
    "hobby": [
      "scuba",
      "swimming",
      "squash"
    ],
    "friends": [
      {
        "name": "Sunhee",
        "age": 19
      },
      {
        "name": "Jiyeon",
        "age": 19
      }
    ],
    "stuff": [
      "iphone",
      "ipad"
    ],
    "self": "KTH_self"
  },
  "person2": {
    "city": "seoul",
    "country": "korea",
    "name": "kimtaehoon",
    "age": 39,
    "isMale": true,
    "hobby": [
      "tennis",
      "swimming"
    ],
    "friends": [
      {
        "name": "Sunhee",
        "age": 29
      },
      {
        "name": "Jiyeon",
        "age": 29
      }
    ],
    "stuff": [
      "macbook"
    ],
    "self": "kimtaehoon"
  }
}

 

특정 Object 속성(이 경우엔 person_base) 을 모두 머지한 형태로 구성할 수 있다.

여러 요소의 공통된 속성을 선언하는데 요긴하게 사용할 수 있을 것으로 보인다.

특히나 파이프라인의 공통 요소들을 위 형태로 정의할 수 있다.