CI/CD

irenett·2024년 11월 11일

CI/CD란 무엇인가?

CI/CD는 Continuous Integration(지속적 통합)Continuous Delivery/Deployment(지속적 전달/배포)의 약자로, 소프트웨어 개발 프로세스에서 자동화와 지속적인 개선을 강조하는 방법론입니다.


🥞 Continuous Integration (CI)

  • 개발자들이 코드 변경 사항을 중앙 저장소에 자주 머지하여 자동으로 빌드하고 테스트하는 프로세스
  • 효과
    • 코드 통합 과정에서 발생할 수 있는 충돌이나 오류를 조기에 발견
    • 개발자 간의 협업을 원활하게 유지
    • 코드 품질 향상
  • 단계
    1. 개발자가 로컬에서 작업한 코드를 푸시
    2. CI 서버가 변경 사항을 감지하여 자동으로 빌드 및 테스트를 수행
    3. 문제가 발견되면 즉시 알림 전송

🥞 Continuous Delivery (CD)

  • CI를 통해 검증된 코드를 프로덕션 환경에 배포할 준비가 된 상태로 유지하는 것
  • 효과
    • 언제든지 프로덕션에 배포할 수 있는 안정적인 코드베이스 유지
    • 배포 프로세스의 자동화로 인적 오류 감소
    • 릴리즈 주기 단축
  • 진행 과정
    • 커밋이 CI 단계를 통과하면 자동으로 스테이징 환경 등에 배포
    • 추가적인 수동 승인 절차를 거쳐 프로덕션 배포 가능

🥞 Continuous Deployment

  • Continuous Delivery의 확장으로, 수동 승인 없이도 코드 변경 사항이 자동으로 프로덕션 환경에 배포되는 것
  • 효과
    • 배포 프로세스의 완전한 자동화
    • 사용자에게 새로운 기능을 신속하게 제공
    • 빠른 피드백

Delivery와 Deployment의 차이점으로는,
🥞 Delivery는 프로덕션 배포를 수동 승인 후 진행하기 때문에 항상 배포 준비 상태를 유지하며,
🥞 Deployment는 프로덕션 배포까지 완전히 자동화하기 떄문에 준비 상태의 코드를 자동으로 배포까지 완료함

예시 단계 및 대표적인 툴

AMS용 클라우드 매니저(어도비) CI/CD 파이프라인

CI 설정

  • 코드 변경 사항이 중앙 저장소에 병합될 때마다 자동으로 빌드하고 테스트하는 환경을 구축
  • 사용 툴
    • Jenkins: 오픈 소스 자동화 서버로, 다양한 플러그인을 통해 빌드, 테스트, 배포 자동화
    • GitLab CI/CD: GitLab에 내장된 CI/CD 기능으로, GitLab과 통합되어있음
    • Travis CI: 클라우드 기반의 CI 서비스로, GitHub와 통합되어있음
    • CircleCI: 클라우드 기반 CI 서비스로, 빠른 빌드 시간 제공

CD 설정

  • CI 단계를 통과한 코드를 스테이징 또는 프로덕션 환경에 자동으로 배포
  • 사용 툴
    • Jenkins Pipelines: Jenkins에서 파이프라인 스크립트를 통해 빌드부터 배포까지의 과정을 정의하고 자동화 (기존 Jenkins에 비해 병렬 작업 구성/Groovy 언어기반/코드기반 복잡한 파이프라인)
    • GitLab CI/CD Pipelines: GitLab에서 CI/CD 파이프라인을 정의하고 실행합니다.
    • Spinnaker: 멀티클라우드 환경에서의 지속적 배포를 지원하는 오픈 소스 플랫폼입니다.
    • Argo CD: 쿠버네티스 환경에서 GitOps 방식의 지속적 배포를 지원합니다.

-> CI
1. 🥞 코드 작성 및 버전 관리

  • 개발자들이 코드를 작성하고 커밋 등 변경 사항을 관리
  • 사용 툴
    • Git: 분산 버전 관리 시스템으로, 코드의 변경 이력을 추적 및 협업 지원
    • GitHub, GitLab, Bitbucket: Git 저장소 호스팅 서비스로, 코드 저장 및 협업 기능 제공
  1. 🥞 의존성 관리 및 컴파일
  • 코드를 컴파일(언어별 상이)하고 필요한 라이브러리 및 의존성을 해결하여 실행 가능한 형태로 패키징
  • 사용 툴
    • Maven: 자바 프로젝트의 빌드, 의존성 관리, 프로젝트 관리를 위한 도구
    • Gradle: 빌드 자동화를 위한 오픈 소스 도구로, 스크립트 언어를 통해 유연한 빌드 설정 가능
    • Ant: XML 기반의 빌드 도구로, 주로 예전 자바 프로젝트에서 사용함
  1. 🥞 코드 품질 분석
  • 코드의 품질을 자동으로 분석하여 스타일/문법/구조 오류, 버그, 보안 취약점 등을 발견
  • 사용 툴
    • SonarQube: 코드 품질과 보안 분석을 위한 정적 분석 플랫폼
    • Checkstyle, PMD, FindBugs: 자바 코드의 스타일과 잠재적 문제를 검사하는 도구
    • ESLint: JavaScript와 관련된 코드에서 린트 검사를 수행하기 위해 가장 널리 사용되는 린트 도구
  1. 🥞 자동화된 테스트
  • 코드 변경 사항이 기존 기능을 훼손하지 않는지 확인하기 위한 테스트(회귀 테스트) 혹은 성능, 단위 테스트 등의 자동화
  • 사용 툴
    • JUnit: 자바의 단위 테스트 프레임워크로, 메소드 단위의 테스트 지원
    • Mockito: Mock 객체를 생성하여 단위 테스트를 용이하게 하는 프레임워크
    • Selenium: 웹 애플리케이션의 기능 테스트를 자동화 도구
    • TestNG: JUnit의 대안
  1. 🥞 아티팩트 생성/관리
  • 빌드 자동화 시스템의 최종 결과물인 아티팩트를 생성하고 관리
  • 아티팩트 : 이후 스테이징 환경 또는 프로덕션 환경에 배포할 수 있는 형태의 결과물 (Java - .jar / web - .js / .NET - .exe)
  • 사용 툴 (관리)
    • Nexus Repository: Maven, npm 등 다양한 패키지 형식을 저장하고 관리
    • Artifactory: 범용 패키지 리포지토리로, 여러 형식의 아티팩트를 관리

-> CD
6. 🥞 컨테이너화

  • 애플리케이션을 컨테이너로 패키징하여 환경에 독립적인 실행을 가능하게 하는 단계
  • 사용 툴
    • Docker: 애플리케이션과 그 의존성을 컨테이너로 패키징하여 일관된 환경에서 실행할 수 있게 함
    • Docker Compose: 여러 컨테이너를 정의하고 관리하기 위한 도구

6-1. 🥞 오케스트레이션 및 인프라 관리

  • 컨테이너화된 애플리케이션을 스케일링하고 관리
  • 사용 툴
    • Kubernetes: 컨테이너화된 애플리케이션의 자동 배포, 스케일링, 관리를 위한 오케스트레이션 플랫폼
    • Docker Swarm: Docker에서 제공하는 간단한 컨테이너 오케스트레이션 도구
    • Helm: Kubernetes용 패키지 매니저로, 복잡한 애플리케이션을 쉽게 배포하고 관리

6-2. 🥞 인프라 자동화 및 구성 관리

  • 인프라를 코드로 관리하여 환경 설정을 자동화하고 일관성을 유지
  • 사용 툴
    • Ansible: 에이전트리스 방식의 구성 관리 도구로, YAML을 사용하여 플레이북을 작성
    • Terraform: 클라우드 인프라를 코드로 관리하기 위한 도구로, 여러 클라우드 제공자를 지원
    • Chef, Puppet: 구성 관리와 인프라 자동화를 위한 도구로, 서버의 상태를 코드로 정의
  1. 🥞 모니터링 및 로깅
  • 애플리케이션과 인프라의 상태를 모니터링하고 로그를 수집하여 문제를 조기에 발견하고 대응하는 단계
  • 사용 툴
    • Prometheus: 시계열 데이터베이스로, 메트릭 수집과 알람 설정 지원
    • Grafana: 수집된 메트릭을 시각화하고 대시보드 구성
    • ELK 스택 (Elasticsearch, Logstash, Kibana): 로그 수집, 저장, 분석, 시각화를 위한 통합 솔루션
    • Zipkin, Jaeger: 분산 트레이싱 시스템으로, 마이크로서비스 아키텍처에서 요청의 흐름을 추적
  1. 🥞 알림 및 협업
  • 빌드 상태, 배포 결과, 모니터링 알람 등을 팀에 공유하여 빠른 대응을 가능하게 하는 단계
  • 사용 툴
    • Slack과 같은 메신저: CI/CD 파이프라인과 통합하여 알림 전송
    • Email Notifications
  1. 🥞 보안 및 컴플라이언스 검사
  • 애플리케이션의 보안 취약점과 라이선스 컴플라이언스를 자동으로 검사하는 단계입니다.
  • 사용 툴
    • OWASP ZAP, Burp Suite: 웹 애플리케이션의 보안 취약점을 스캔합니다.
    • Snyk, Black Duck: 오픈 소스 라이브러리의 보안 취약점과 라이선스 이슈를 검사합니다.
    • SonarQube Security Plugins: 코드 수준에서 보안 취약점을 분석합니다.

무중단 배포

  • CI/CD 파이프라인에서 코드가 빌드되고 테스트를 통과한 후, 실제 프로덕션 환경에 배포하는 과정에서 서비스 중단 없이 새로운 버전 릴리스

🥞 블루-그린(Blue-Green) 배포

  • 두 개의 동일한 프로덕션 환경(블루와 그린)을 유지
  • 현재 트래픽을 처리하는 환경이 블루라면, 그린 환경에 새로운 버전을 배포하고 테스트
  • 문제가 없으면 로드 밸런서를 통해 트래픽을 그린 환경으로 전환

장점 : 빠른 롤백이 가능하며, 배포 과정에서의 위험 최소화

구현 방법

  • 로드 밸런서 설정을 통해 트래픽 전환을 제어
  • Jenkins와 같은 CI/CD 도구에서 배포 스크립트를 작성하여 자동화
  • Docker와 Kubernetes를 사용하여 환경을 컨테이너로 관리

🥞 카나리 배포

  • 새로운 버전을 일부 사용자에게만 배포하여 문제 모니터링
  • 점진적으로 트래픽 비율을 늘려 전체 사용자에게 배포

장점 : 새로운 버전의 안정성을 검증하면서 리스크를 분산시킵니다.

구현 방법

  • Kubernetes의 Ingress 컨트롤러나 Service Mesh를 사용하여 트래픽 비율을 제어
  • Jenkins 파이프라인에서 배포 단계에 카나리 릴리스 포함

🥞 롤링 업데이트

  • 기존 인스턴스를 하나씩 새로운 버전으로 교체
  • 전체 서비스 가용성을 유지하면서 업데이트 진행

장점 : 추가적인 인프라 자원 없이도 무중단 배포 가능

구현 방법:

  • Kubernetes Deployment의 rollingUpdate 전략 활용
  • Docker Swarm이나 AWS ECS에서도 롤링 업데이트 기능 제공

🥞 A/B 테스트 배포

  • 사용자 그룹을 나누어 서로 다른 버전을 제공하고 성능이나 사용자 반응 비교

장점 : 새로운 기능의 효과를 실제 사용자 데이터를 통해 검증

구현 방법

  • 로드 밸런서나 애플리케이션 레벨 라우팅으로 사용자 그룹 분리

🥞 기능 토글 및 플래그

  • 코드 내에서 새로운 기능을 제어할 수 있는 스위치를 추가하여 배포와 릴리스 분리

장점 : 코드 배포 후에도 기능을 켜거나 끌 수 있어 리스크 관리가 용이

구현 방법

  • Unleash, LaunchDarkly 등의 도구를 사용하여 기능 토글 관리
  • 자체적으로 기능 플래그를 구현하여 설정 파일이나 데이터베이스 제어

0개의 댓글