#DevOps

[코드가 환경을 모르는 구조 2/7] 배포 코드가 환경을 모르는 구조

[코드가 환경을 모르는 구조 2/7] 배포 코드가 환경을 모르는 구조
01

Summary

배포 사고를 제로로 만드는 기술, '환경을 모르는' 배포 파이프라인 구축기

Flex팀이 Helm과 ArgoCD를 활용해 환경별 스크립트 파편화를 해결하고 GitOps를 완성한 방법

이 아티클은 환경마다 제각각인 배포 코드가 유발하는 기술적 위험을 분석하고, 이를 극복하기 위한 '환경 불가지론적(Environment-Agnostic)' 배포 구조를 제시합니다. Helm의 다층 설정 관리와 ArgoCD의 선언적 동기화를 통해 어떻게 배포 생산성과 안정성을 동시에 확보했는지 상세한 노하우를 공유합니다.

  • 01환경별 중복 스크립트를 제거하고 단일 템플릿 기반의 레이어드 밸류(Layered Values) 구조 채택
  • 02ArgoCD의 App-of-Apps 패턴을 통한 복잡한 서비스 환경의 자동화된 배포 및 관리
  • 03Git Revert 한 번으로 끝나는 초간단 롤백 프로세스와 투명한 배포 감사(Audit) 로그 확보
  • 04명령형 Jenkins 파이프라인을 선언형 규율로 통제하여 빌드 과정의 환경 의존성 제거

RECOMMENDATION

배포 환경 간 설정 차이로 고통받거나 GitOps로의 전환을 고민하는 시니어 엔지니어 및 DevOps 담당자에게 이 아티클의 계층형 설정 모델 도입을 권장합니다.

The Problem

환경별로 분리된 배포 스크립트로 인해 설정 불일치(Drift)가 발생하고, 이는 프로덕션 환경의 마이그레이션 누락이나 배포 사고로 이어지는 원인이 됩니다.

The Solution

배포 템플릿과 환경별 설정값(Values)을 완전히 분리하고, Helm의 3계층(기본, 환경, 변종) 설정 구조와 ArgoCD의 App-of-Apps 패턴을 도입하여 단일 파이프라인으로 모든 환경을 대응하도록 설계했습니다.

The Result

모든 배포 상태가 Git 히스토리에 기록되어 추적이 용이해졌으며, 별도의 도구 없이 Git Revert만으로 안전한 롤백이 가능해졌고 환경 간 설정 불일치 사고를 구조적으로 방지했습니다.

Trade-off

기존 Jenkinsfile에 산재했던 환경별 분기 코드를 리팩토링하는 데 상당한 공수가 투입되었으며, 구조적 무결성을 유지하기 위해 개발자의 엄격한 규율 준수와 코드 리뷰가 필수적으로 요구됩니다.

03

Key Concepts

Concept · 01

Helm Layered Values

Helm 차트에서 사용하는 설정값을 기본(Base), 환경(Environment), 변종(Variant)의 세 층으로 나누어 관리하는 전략입니다.

  • 기본 층에서는 모든 앱의 공통 기본값을 정의하되 특정 환경 정보는 배제함
  • 환경 층에서 실제 배포될 도메인과 활성화할 앱 목록을 결정하여 환경 간 차이를 명확히 드러냄
Concept · 02

App-of-Apps Pattern

ArgoCD에서 하나의 루트 애플리케이션이 여러 자식 애플리케이션의 생명주기를 관리하도록 설계하는 패턴입니다.

  • 루트 앱(뿌리)이 배포 대상 목록을 관리하며 자식 앱들을 클러스터에 한꺼번에 등록함
  • 새로운 서비스를 추가할 때 파이프라인 수정 없이 선언적 목록에 추가하는 것만으로 배포가 가능함
Concept · 03

Environment-Agnostic Pipeline

빌드 및 배포 코드가 특정 실행 환경(Dev, Prod 등)을 직접 인지하지 않고 외부 주입 파라미터에 의해서만 동작하는 구조입니다.

  • Jenkinsfile 내부에 if (env == 'prod')와 같은 조건문을 제거하여 코드의 복잡성을 낮춤
  • 동일한 파이프라인 코드를 통해 모든 환경에서 일관된 빌드 및 배포 품질을 유지함