본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
CodeDeck AI
2025. 11. 8. · 20 Views
GitLab CI 디자인 패턴 고급 가이드
GitLab CI/CD 파이프라인을 효율적으로 구성하는 고급 디자인 패턴을 소개합니다. 재사용 가능한 템플릿, 동적 파이프라인, 병렬 처리 등 실전에서 바로 활용할 수 있는 패턴들을 다룹니다.
들어가며
이 글에서는 GitLab CI 디자인 패턴 고급 가이드에 대해 상세히 알아보겠습니다. 총 12가지 주요 개념을 다루며, 각각의 개념에 대한 설명과 실제 코드 예제를 함께 제공합니다.
목차
- 템플릿_확장_패턴
- 동적_차일드_파이프라인
- 매트릭스_병렬_빌드
- 조건부_needs_DAG
- 규칙_기반_실행_제어
- 캐시_레이어링_전략
- 환경별_변수_관리
- 앵커_재사용_패턴
- 실패_허용_실험적_Job
- 시크릿_검증_게이트
- 멀티_프로젝트_파이프라인
- 커버리지_리포팅_패턴
1. 템플릿 확장 패턴
개요
공통 CI 설정을 템플릿으로 분리하고 extends 키워드로 재사용하는 패턴입니다. 코드 중복을 줄이고 유지보수성을 높입니다.
코드 예제
# .gitlab/templates/base.yml
.base_deploy:
stage: deploy
before_script:
- echo "Setting up environment"
only:
- main
# .gitlab-ci.yml
include:
- local: '.gitlab/templates/base.yml'
deploy_prod:
extends: .base_deploy
script:
- npm run deploy
설명
base.yml에 공통 설정을 정의하고, 실제 job에서 extends로 상속받아 사용합니다. 여러 job에서 동일한 설정을 반복하지 않아도 됩니다.
2. 동적 차일드 파이프라인
개요
런타임에 동적으로 생성된 YAML을 기반으로 하위 파이프라인을 실행하는 패턴입니다. 변경된 서비스만 선택적으로 빌드할 수 있습니다.
코드 예제
generate_pipeline:
stage: prepare
script:
- node scripts/generate-pipeline.js > pipeline.yml
artifacts:
paths:
- pipeline.yml
trigger_pipeline:
stage: build
trigger:
include:
- artifact: pipeline.yml
job: generate_pipeline
strategy: depend
설명
스크립트로 pipeline.yml을 동적 생성하고, trigger로 해당 파이프라인을 실행합니다. 모노레포에서 변경된 패키지만 빌드할 때 유용합니다.
3. 매트릭스 병렬 빌드
개요
parallel:matrix를 사용해 여러 환경 조합을 병렬로 테스트하는 패턴입니다. 다양한 버전 호환성을 효율적으로 검증합니다.
코드 예제
test:
stage: test
parallel:
matrix:
- NODE_VERSION: ['16', '18', '20']
OS: ['ubuntu', 'alpine']
image: node:${NODE_VERSION}-${OS}
script:
- npm test
tags:
- docker
설명
NODE_VERSION 3개 × OS 2개 = 총 6개 job이 병렬로 실행됩니다. 여러 환경에서의 호환성을 빠르게 확인할 수 있습니다.
4. 조건부 needs DAG
개요
needs를 활용해 job 간 의존성을 정의하는 DAG(방향성 비순환 그래프) 패턴입니다. 불필요한 대기 시간을 제거합니다.
코드 예제
build:
stage: build
script: npm run build
unit_test:
stage: test
needs: ['build']
script: npm run test:unit
e2e_test:
stage: test
needs: ['build']
script: npm run test:e2e
deploy:
stage: deploy
needs: ['unit_test', 'e2e_test']
script: npm run deploy
설명
unit_test와 e2e_test가 build 완료 후 병렬 실행되고, 둘 다 성공하면 deploy가 실행됩니다. 전체 stage가 끝나기를 기다리지 않아 속도가 빨라집니다.
5. 규칙 기반 실행 제어
개요
rules를 사용해 복잡한 조건에 따라 job 실행을 제어하는 패턴입니다. if, changes, exists를 조합해 정교한 제어가 가능합니다.
코드 예제
deploy_backend:
stage: deploy
script: deploy backend
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
changes:
- "backend/**/*"
when: on_success
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
changes:
- "backend/**/*"
when: manual
- when: never
설명
main 브랜치에서 backend 파일이 변경되면 자동 실행, MR에서는 수동 실행, 그 외에는 실행 안 함을 정의합니다. 불필요한 파이프라인 실행을 방지합니다.
6. 캐시 레이어링 전략
개요
cache와 artifacts를 계층적으로 구성해 빌드 속도를 최적화하는 패턴입니다. 의존성과 빌드 결과물을 효율적으로 관리합니다.
코드 예제
variables:
CACHE_KEY: ${CI_COMMIT_REF_SLUG}
.node_cache:
cache:
key: ${CACHE_KEY}-node
paths:
- node_modules/
policy: pull
install:
extends: .node_cache
cache:
policy: pull-push
script:
- npm ci
build:
extends: .node_cache
script:
- npm run build
artifacts:
paths:
- dist/
설명
install job은 node_modules를 캐시에 저장(push)하고, build job은 캐시를 가져와(pull) 사용합니다. artifacts로 빌드 결과물을 다음 stage에 전달합니다.
7. 환경별 변수 관리
개요
environment와 variables를 활용해 배포 환경별로 다른 설정을 적용하는 패턴입니다. 안전한 배포 워크플로우를 구성합니다.
코드 예제
.deploy_template:
stage: deploy
script:
- echo "Deploying to $DEPLOY_ENV"
- deploy --env=$DEPLOY_ENV
deploy_staging:
extends: .deploy_template
variables:
DEPLOY_ENV: staging
environment:
name: staging
url: https://staging.example.com
deploy_prod:
extends: .deploy_template
variables:
DEPLOY_ENV: production
environment:
name: production
url: https://example.com
when: manual
설명
템플릿을 상속받아 환경별 변수만 오버라이드합니다. environment로 배포 이력을 추적하고, production은 수동 승인으로 안전하게 배포합니다.
8. 앵커 재사용 패턴
개요
YAML 앵커(&)와 별칭(*)을 사용해 중복 설정을 제거하는 패턴입니다. 복잡한 설정을 간결하게 관리합니다.
코드 예제
.docker_config: &docker_config
image: node:18-alpine
services:
- docker:dind
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
build_api:
<<: *docker_config
stage: build
script:
- docker build -t api:latest ./api
build_web:
<<: *docker_config
stage: build
script:
- docker build -t web:latest ./web
설명
docker_config 앵커에 공통 Docker 설정을 정의하고, <<: *docker_config로 재사용합니다. 설정 변경 시 한 곳만 수정하면 됩니다.
9. 실패 허용 실험적 Job
개요
allow_failure를 활용해 실험적인 테스트나 불안정한 job의 실패가 파이프라인을 중단하지 않도록 하는 패턴입니다.
코드 예제
experimental_test:
stage: test
script:
- npm run test:experimental
allow_failure: true
flaky_e2e:
stage: test
script:
- npm run test:e2e:flaky
retry:
max: 2
when:
- runner_system_failure
- stuck_or_timeout_failure
allow_failure:
exit_codes: [2, 137]
설명
experimental_test는 실패해도 파이프라인이 통과되고, flaky_e2e는 특정 종료 코드만 허용합니다. 불안정한 테스트가 전체 파이프라인을 막지 않습니다.
10. 시크릿 검증 게이트
개요
배포 전 필수 환경 변수와 시크릿을 검증하는 게이트키퍼 패턴입니다. 설정 누락으로 인한 배포 실패를 사전에 방지합니다.
코드 예제
validate_secrets:
stage: .pre
script:
- |
if [ -z "$DATABASE_URL" ]; then
echo "DATABASE_URL is not set"
exit 1
fi
if [ -z "$API_KEY" ]; then
echo "API_KEY is not set"
exit 1
fi
echo "All required secrets are configured"
only:
- main
설명
.pre stage에서 배포에 필요한 환경 변수를 검증합니다. 필수 변수가 없으면 파이프라인을 즉시 중단해 불필요한 빌드/테스트 시간을 절약합니다.
11. 멀티 프로젝트 파이프라인
개요
trigger를 사용해 다른 프로젝트의 파이프라인을 연쇄적으로 실행하는 패턴입니다. 마이크로서비스 간 의존성을 관리합니다.
코드 예제
trigger_downstream:
stage: deploy
trigger:
project: mygroup/downstream-project
branch: main
strategy: depend
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
trigger_parallel:
stage: deploy
trigger:
- project: mygroup/service-a
- project: mygroup/service-b
- project: mygroup/service-c
parallel: 3
설명
상위 프로젝트 배포 후 하위 프로젝트들을 자동으로 트리거합니다. strategy: depend로 하위 파이프라인 완료를 대기하거나, parallel로 여러 프로젝트를 동시에 트리거합니다.
12. 커버리지 리포팅 패턴
개요
coverage 정규식을 사용해 테스트 커버리지를 추출하고 GitLab UI에 표시하는 패턴입니다. 코드 품질 지표를 시각화합니다.
코드 예제
test_with_coverage:
stage: test
script:
- npm run test:coverage
coverage: '/Coverage: \d+\.\d+%/'
artifacts:
reports:
coverage_report:
coverage_format: cobertura
path: coverage/cobertura-coverage.xml
paths:
- coverage/
expire_in: 30 days
설명
정규식으로 콘솔 출력에서 커버리지를 파싱하고, cobertura 리포트를 GitLab에 업로드합니다. MR에서 커버리지 변화를 자동으로 확인할 수 있습니다.
마치며
이번 글에서는 GitLab CI 디자인 패턴 고급 가이드에 대해 알아보았습니다. 총 12가지 개념을 다루었으며, 각각의 사용법과 예제를 살펴보았습니다.
관련 태그
#GitLab #CI/CD #Pipeline #DevOps #Automation
댓글 (0)
함께 보면 좋은 카드 뉴스
UX와 협업 패턴 완벽 가이드
AI 에이전트와 사용자 간의 효과적인 협업을 위한 UX 패턴을 다룹니다. 프롬프트 핸드오프부터 인터럽트 처리까지, 현대적인 에이전트 시스템 설계의 핵심을 배웁니다.
빌드와 배포 자동화 완벽 가이드
Flutter 앱 개발에서 GitHub Actions를 활용한 CI/CD 파이프라인 구축부터 앱 스토어 자동 배포까지, 초급 개발자도 쉽게 따라할 수 있는 빌드 자동화의 모든 것을 다룹니다.
실전 인프라 자동화 프로젝트 완벽 가이드
Ansible을 활용하여 멀티 티어 웹 애플리케이션 인프라를 자동으로 구축하는 실전 프로젝트입니다. 웹 서버, 데이터베이스, 로드 밸런서를 코드로 관리하며 반복 가능한 인프라 배포를 경험합니다.
CI/CD 파이프라인 통합 완벽 가이드
Jenkins, GitLab CI와 Ansible을 연동하여 자동화된 배포 파이프라인을 구축하는 방법을 다룹니다. Ansible Tower/AWX의 활용법과 실무에서 바로 적용 가능한 워크플로우 설계 패턴을 단계별로 설명합니다.
Ansible 성능 최적화와 디버깅 완벽 가이드
Ansible 플레이북의 실행 속도를 극적으로 향상시키고, 문제 발생 시 효과적으로 디버깅하는 방법을 다룹니다. 병렬 실행, 캐싱, SSH 최적화부터 디버그 모드와 프로파일링까지 실무에서 바로 적용할 수 있는 기법들을 소개합니다.