IaC/CI CD Tool

GitLab CI/CD YAML 파일 최적화: 중복 제거와 재사용성 향상

Somaz 2026. 3. 17. 00:00
728x90
반응형

Overview

GitLab CI/CD 파이프라인이 복잡해질수록 YAML 설정 파일에서 중복된 코드와 복잡한 구성이 늘어난다. 이는 유지보수를 어렵게 만들고 실수 가능성을 높입니다. GitLab은 이러한 문제를 해결하기 위해 YAML 재사용 기능들을 제공한다. 이번 글에서는 GitLab CI/CD YAML 파일을 최적화하는 세 가지 핵심 방법을 살펴보겠다.

 

GitLab CI/CD에서 제공하는 YAML 최적화 도구들은 크게 세 가지로 나눌 수 있다.

  1. YAML 앵커(Anchors): 전통적인 YAML 문법을 활용한 재사용
  2. extends 키워드: GitLab에서 권장하는 구성 상속 방식
  3. !reference 태그: 선택적 참조를 통한 유연한 재사용

 

각각의 특징과 사용법을 자세히 알아보겠다.

 

 

 

 

 


 

 

1. YAML 앵커 (Anchors): 기본적인 재사용 패턴

YAML 앵커는 표준 YAML 문법으로, `&` 로 앵커를 정의하고 `*` 로 참조하는 방식이다.

 

 

기본 사용법

# 앵커 정의
.job_template: &job_configuration
  image: ruby:2.6
  services:
    - postgres
    - redis

# 앵커 참조
test1:
  <<: *job_configuration  # 맵 병합
  script:
    - test1 project

test2:
  <<: *job_configuration
  script:
    - test2 project

 

 

스크립트용 앵커 활용

스크립트 섹션에서도 앵커를 유용하게 활용할 수 있다.

.setup_script: &setup_script
  - echo "환경 설정 시작"
  - npm install

.test_script: &test_script
  - echo "테스트 실행"
  - npm test

job1:
  before_script:
    - *setup_script
  script:
    - *test_script
    - echo "job1 전용 명령어"

 

 

앵커의 제한사항

앵커는 같은 파일 내에서만 작동합니다. include로 가져온 외부 파일의 앵커는 참조할 수 없다.

 

 

 

 

 

2. extends: GitLab이 권장하는 상속 방식

extends 키워드는 YAML 앵커보다 더 유연하고 가독성이 좋은 GitLab 전용 기능이다.

 

 

기본 상속

.base_job:
  image: node:16
  stage: build
  tags:
    - docker

build_dev:
  extends: .base_job
  variables:
    NODE_ENV: development
  script:
    - npm run build:dev

build_prod:
  extends: .base_job
  variables:
    NODE_ENV: production
  script:
    - npm run build:prod

 

 

다단계 상속

최대 11단계까지 상속이 가능하지만, 복잡성을 고려해 3단계 이내를 권장합니다:

.tests:
  rules:
    - if: $CI_PIPELINE_SOURCE == "push"

.rspec:
  extends: .tests
  script: rake rspec

rspec_unit:
  extends: .rspec
  variables:
    TEST_TYPE: unit

 

 

외부 파일과의 조합

include와 extends를 함께 사용하면 강력한 재사용성을 구현할 수 있다.

# templates.yml
.build_template:
  stage: build
  script:
    - echo "빌드 시작"

# .gitlab-ci.yml
include:
  - local: templates.yml

my_build:
  extends: .build_template
  variables:
    PROJECT_NAME: "my-project"

 

 

병합 규칙 이해하기

extends는 해시(객체)는 병합하지만 배열은 완전 교체합니다:

.base:
  variables:
    VAR1: "base"
  script:
    - echo "base script"

job:
  extends: .base
  variables:
    VAR2: "job"     # VAR1과 VAR2 모두 유지
  script:
    - echo "job script"  # base script는 완전히 교체됨

 

 

3. `!reference` 태그: 선택적 참조의 

`!reference` 태그는 GitLab의 최신 기능으로, 다른 작업의 특정 부분만 선택적으로 재사용할 수 있다.

 

기본 사용법

# setup.yml
.setup:
  script:
    - echo "환경 설정"

# .gitlab-ci.yml
include:
  - local: setup.yml

.teardown:
  after_script:
    - echo "정리 작업"

test:
  script:
    - !reference [.setup, script]
    - echo "테스트 실행"
  after_script:
    - !reference [.teardown, after_script]

 

 

변수의 선택적 참조

전체 변수 그룹이나 특정 변수만 선택해서 사용할 수 있다.

.common_vars:
  variables:
    API_URL: "https://api.example.com"
    DEBUG_MODE: "false"

test_all_vars:
  variables: !reference [.common_vars, variables]
  script:
    - printenv

test_specific_var:
  variables:
    MY_API_URL: !reference [.common_vars, variables, API_URL]
  script:
    - echo $MY_API_URL

 

 

중첩 참조 활용

최대 10단계까지 중첩된 참조가 가능하다.

.scripts:
  basic:
    - echo "기본 스크립트"
  extended:
    - !reference [.scripts, basic]
    - echo "확장 스크립트"
  full:
    - !reference [.scripts, extended]
    - echo "전체 스크립트"

complex_job:
  script:
    - !reference [.scripts, full]

 

 

실전 활용: 통합 예제

세 가지 방법을 조합하여 효율적인 파이프라인을 구성해보겠다.

# 공통 설정 (앵커 활용)
.common_config: &common_config
  interruptible: true
  retry:
    max: 2
    when:
      - runner_system_failure

# 기본 템플릿 (extends 활용)
.build_template:
  <<: *common_config
  stage: build
  image: node:16
  before_script:
    - npm ci

# 스크립트 조각 (!reference 활용)
.scripts:
  test:
    - npm run test
  lint:
    - npm run lint

# 실제 작업들
build_frontend:
  extends: .build_template
  script:
    - npm run build:frontend

test_and_lint:
  extends: .build_template
  script:
    - !reference [.scripts, test]
    - !reference [.scripts, lint]

 

 

IDE 지원 설정

VS Code에서 `!reference` 태그의 문법 오류를 방지하려면 다음 설정을 추가해야 한다.

// settings.json
{
  "yaml.customTags": [
    "!reference sequence"
  ]
}

 

 

 

언제 무엇을 사용할까?

 

YAML 앵커를 사용하는 경우

  • 같은 파일 내에서 간단한 재사용이 필요할 때
  • 스크립트 배열을 여러 작업에서 공유할 때
  • 기존 YAML 지식을 활용하고 싶을 때

 

extends를 사용하는 경우

  • 작업 전체의 구성을 상속받고 싶을 때
  • 외부 파일의 템플릿을 확장하고 싶을 때
  • 다단계 상속이 필요할 때

 

 

!reference를 사용하는 경우

  • 특정 키의 값만 선택적으로 재사용하고 싶을 때
  • 외부 파일의 일부분만 필요할 때
  • 복잡한 스크립트 조합을 만들어야 할 때

 

 

 

 


 

 

마무리

GitLab CI/CD YAML 파일 최적화는 단순히 코드를 줄이는 것을 넘어서 유지보수성과 가독성을 크게 향상시킨다. YAML 앵커의 기본적인 재사용부터 `extends` 의 강력한 상속 기능, 그리고 `!reference` 태그의 선택적 참조까지, 각 도구의 특성을 이해하고 적절히 조합하면 효율적이고 관리하기 쉬운 파이프라인을 구축할 수 있다.

 

특히 대규모 프로젝트에서는 이러한 기능들을 적극적으로 활용하여 템플릿 시스템을 구축하는 것이 권장된다. 초기 설정에 시간이 걸리더라도 장기적으로는 개발 생산성과 코드 품질 향상에 큰 도움이 될 것이다.

 

 

 

 

 

 

 

 

 

 


Reference

 

 

 

Somaz | DevOps Engineer | Kubernetes & Cloud Infrastructure Specialist

728x90
반응형