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


🥞 Continuous Integration (CI)
- 개발자들이 코드 변경 사항을 중앙 저장소에 자주 머지하여 자동으로 빌드하고 테스트하는 프로세스
- 효과
- 코드 통합 과정에서 발생할 수 있는 충돌이나 오류를 조기에 발견
- 개발자 간의 협업을 원활하게 유지
- 코드 품질 향상
- 단계
- 개발자가 로컬에서 작업한 코드를 푸시
- CI 서버가 변경 사항을 감지하여 자동으로 빌드 및 테스트를 수행
- 문제가 발견되면 즉시 알림 전송
🥞 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 저장소 호스팅 서비스로, 코드 저장 및 협업 기능 제공
- 🥞 의존성 관리 및 컴파일
- 코드를 컴파일(언어별 상이)하고 필요한 라이브러리 및 의존성을 해결하여 실행 가능한 형태로 패키징
- 사용 툴
- Maven: 자바 프로젝트의 빌드, 의존성 관리, 프로젝트 관리를 위한 도구
- Gradle: 빌드 자동화를 위한 오픈 소스 도구로, 스크립트 언어를 통해 유연한 빌드 설정 가능
- Ant: XML 기반의 빌드 도구로, 주로 예전 자바 프로젝트에서 사용함
- 🥞 코드 품질 분석
- 코드의 품질을 자동으로 분석하여 스타일/문법/구조 오류, 버그, 보안 취약점 등을 발견
- 사용 툴
- SonarQube: 코드 품질과 보안 분석을 위한 정적 분석 플랫폼
- Checkstyle, PMD, FindBugs: 자바 코드의 스타일과 잠재적 문제를 검사하는 도구
- ESLint: JavaScript와 관련된 코드에서 린트 검사를 수행하기 위해 가장 널리 사용되는 린트 도구
- 🥞 자동화된 테스트
- 코드 변경 사항이 기존 기능을 훼손하지 않는지 확인하기 위한 테스트(회귀 테스트) 혹은 성능, 단위 테스트 등의 자동화
- 사용 툴
- JUnit: 자바의 단위 테스트 프레임워크로, 메소드 단위의 테스트 지원
- Mockito: Mock 객체를 생성하여 단위 테스트를 용이하게 하는 프레임워크
- Selenium: 웹 애플리케이션의 기능 테스트를 자동화 도구
- TestNG: JUnit의 대안
- 🥞 아티팩트 생성/관리
- 빌드 자동화 시스템의 최종 결과물인 아티팩트를 생성하고 관리
- 아티팩트 : 이후 스테이징 환경 또는 프로덕션 환경에 배포할 수 있는 형태의 결과물 (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: 구성 관리와 인프라 자동화를 위한 도구로, 서버의 상태를 코드로 정의
- 🥞 모니터링 및 로깅
- 애플리케이션과 인프라의 상태를 모니터링하고 로그를 수집하여 문제를 조기에 발견하고 대응하는 단계
- 사용 툴
- Prometheus: 시계열 데이터베이스로, 메트릭 수집과 알람 설정 지원
- Grafana: 수집된 메트릭을 시각화하고 대시보드 구성
- ELK 스택 (Elasticsearch, Logstash, Kibana): 로그 수집, 저장, 분석, 시각화를 위한 통합 솔루션
- Zipkin, Jaeger: 분산 트레이싱 시스템으로, 마이크로서비스 아키텍처에서 요청의 흐름을 추적
- 🥞 알림 및 협업
- 빌드 상태, 배포 결과, 모니터링 알람 등을 팀에 공유하여 빠른 대응을 가능하게 하는 단계
- 사용 툴
- Slack과 같은 메신저: CI/CD 파이프라인과 통합하여 알림 전송
- Email Notifications
- 🥞 보안 및 컴플라이언스 검사
- 애플리케이션의 보안 취약점과 라이선스 컴플라이언스를 자동으로 검사하는 단계입니다.
- 사용 툴
- 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 등의 도구를 사용하여 기능 토글 관리
- 자체적으로 기능 플래그를 구현하여 설정 파일이나 데이터베이스 제어