Overview
GitLab CI/CD 파이프라인이 복잡해질수록 YAML 설정 파일에서 중복된 코드와 복잡한 구성이 늘어난다. 이는 유지보수를 어렵게 만들고 실수 가능성을 높입니다. GitLab은 이러한 문제를 해결하기 위해 YAML 재사용 기능들을 제공한다. 이번 글에서는 GitLab CI/CD YAML 파일을 최적화하는 세 가지 핵심 방법을 살펴보겠다.
GitLab CI/CD에서 제공하는 YAML 최적화 도구들은 크게 세 가지로 나눌 수 있다.
- YAML 앵커(Anchors): 전통적인 YAML 문법을 활용한 재사용
- extends 키워드: GitLab에서 권장하는 구성 상속 방식
- !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
- GitLab CI/CD YAML syntax reference
- Optimize your YAML files - GitLab Docs
- Include examples - GitLab Docs
Somaz | DevOps Engineer | Kubernetes & Cloud Infrastructure Specialist
'IaC > CI CD Tool' 카테고리의 다른 글
| GitLab Source Backup & Restore with rclone + Google Drive (0) | 2026.03.26 |
|---|---|
| GitLab CI로 Google Drive에 자동 업로드하기 (0) | 2025.11.12 |
| GitLab 18.0 업그레이드 시 git_data_dirs 설정 변경 가이드 (2) | 2025.11.05 |
| Git 레포지토리 GitLab 마이그레이션 가이드 (2) | 2025.08.05 |
| 대형 Git 리포지터리에서 CI/CD 시간을 절반으로 줄이는 법: Git Sparse Checkout 실전 적용기 (4) | 2025.06.09 |