CI/CD
CI (Continuous Integration, 지속적 통합)
- 개발자가 코드 변경 사항을 공유 저장소에 자주 병합하며, 이를 통해 변경 사항이 팀 내에서 빠르게 통합될 수 있도록 지원.
- 핵심 구성 요소:
- 자동화 빌드: 코드가 병합될 때마다 프로젝트가 자동으로 빌드됨.
- 자동화 테스트: 빌드된 프로젝트에 대해 자동으로 테스트가 실행되어 오류나 결함을 조기에 발견.
- 소스 코드 관리: GitHub, GitLab, Bitbucket 등의 저장소를 사용하여 팀원이 동일한 코드 베이스를 관리.
CD (Continuous Delivery/Deployment, 지속적 제공/배포)
- Continuous Delivery (지속적 제공):
- 모든 코드 변경 사항이 프로덕션 환경에 배포 가능한 상태로 자동 준비.
- 배포 전, 수동 승인 과정을 포함하여 프로덕션 환경에서의 안전성을 보장.
- Continuous Deployment (지속적 배포):
- 코드 변경 사항이 자동으로 프로덕션 환경에 배포되며, 별도의 수동 승인 없이 진행.
- 완전히 자동화된 배포 파이프라인을 통해 운영 비용을 절감.
CI/CD 주요 구성 요소
- 소스 코드 관리(SCM): Git을 사용하여 코드 버전을 관리하고 팀 협업을 지원.
- 빌드 자동화 도구: Jenkins, GitLab CI/CD, CircleCI, TravisCI 등.
- 테스트 자동화: 다양한 테스트(단위 테스트, 통합 테스트, E2E 테스트)를 자동 실행.
- 배포 자동화: Docker, Kubernetes와 같은 컨테이너 및 오케스트레이션 툴을 활용한 배포 관리.
- 모니터링 및 피드백: Prometheus, Grafana, ELK 스택 등을 사용하여 문제를 조기에 탐지.
CI/CD의 상세 장단점
장점 | 단점 | |
CI | - 변경 사항에 대한 빠른 피드백 - 코드 품질 유지 - 병합 충돌 감소 - 자동화로 생산성 향상 |
- 설정 복잡 (빌드 서버, 테스트 환경 구축 필요) - 테스트 커버리지 부족 시 문제 탐지 어려움 |
Continuous Delivery | - 코드 배포 준비 시간 단축 - 안정적인 릴리스 프로세스 구축 - 수동 배포 시 위험 최소화 |
- 릴리스 승인 절차로 인해 배포 지연 가능 - 추가적인 테스트와 검증 단계가 필요 |
Continuous Deployment | - 실시간 사용자 피드백 수집 가능 - 업데이트 빈도가 높아짐 - 운영비용 절감 및 시장 대응력 강화 |
- 초기 설정 및 유지보수 복잡 - 충분히 자동화된 테스트가 없을 경우 문제 발생 가능 |
CI/CD 사용 이유
- 품질 개선:
- 코드 병합 시 자동으로 테스트를 수행해 결함을 사전에 발견.
- 코드 리뷰 프로세스와 통합하여 개발 표준을 준수.
- 효율성 증가:
- 반복적이고 수동적인 작업을 자동화하여 개발자 생산성 향상.
- 릴리스 주기를 단축해 시간 및 인력 비용 절감.
- 리스크 감소:
- 변경 사항이 점진적으로 배포되므로 대규모 릴리스로 인한 문제 발생 가능성 감소.
- 롤백 자동화로 문제 발생 시 신속한 복구 가능.
- 팀 협업 강화:
- 병합 시 충돌을 최소화하고, 투명한 코드 공유를 통해 팀 간 협력 향상.
- DevOps 문화를 활성화하여 개발과 운영의 경계를 허물음.
CI/CD 프로세스 상세 표
Continuous Integration | Continuous Delivery | Continuous Deployment | |
목적 | 코드 변경 사항 병합 후 자동 빌드 및 테스트 | 배포 준비 상태를 자동화 | 변경 사항을 자동으로 프로덕션에 배포 |
주요 활동 | - 소스 코드 병합- 자동 빌드- 자동 테스트 | - 자동화된 테스트- 릴리스 패키지 생성- 승인 대기 | - 완전 자동화된 배포- 문제 시 자동 롤백 |
자동화 수준 | 테스트 및 빌드 자동화 | 테스트 및 배포 준비 자동화 | 완전 자동화 |
필요한 도구 | Git, Jenkins, Maven, JUnit | Ansible, Terraform, Docker | Kubernetes, Helm, ArgoCD |
적용 사례 | 소규모 프로젝트, 개발 단계 | 중간 규모 이상의 프로젝트 | 대규모 서비스, 빈번한 업데이트 환경 |
Docker+CI/CD
Docker와 CI/CD를 결합하면 개발, 테스트, 배포 프로세스를 표준화하고, 애플리케이션의 이식성과 안정성을 크게 향상할 수 있습니다.
Docker와 CI/CD의 결합 개념
- Docker: 컨테이너화를 통해 애플리케이션과 모든 종속성을 하나의 이미지로 패키징. 어떤 환경에서도 동일하게 동작하도록 보장.
- CI/CD:
- CI: Docker 이미지를 생성하고 테스트를 자동화.
- CD: Docker 이미지를 사용해 스테이징 또는 프로덕션 환경에 배포.
Docker+CI/CD의 주요 장점
장점 | 내용 |
이식성 | Docker 이미지를 사용하면 환경 차이에 상관없이 동일한 애플리케이션 동작을 보장. |
일관성 유지 | 모든 개발, 테스트, 배포 환경에서 동일한 컨테이너 이미지를 사용하여 일관된 결과를 제공. |
자동화된 워크플로우 | CI/CD 파이프라인에서 Docker를 활용하여 빌드, 테스트, 배포 과정을 자동화. |
신속한 배포 | Docker 이미지를 미리 빌드하고 저장소(예: Docker Hub, AWS ECR)에 푸시하여 빠르게 배포 가능. |
비용 절감 | 컨테이너를 사용해 경량화된 환경을 제공하고 리소스를 효율적으로 사용. |
Docker와 CI/CD를 활용한 워크플로우
- 코드 작성 및 변경: 개발자가 소스 코드를 작성하고 Git 저장소에 커밋.
- Docker 이미지 생성:
- CI 파이프라인에서 Dockerfile을 기반으로 이미지를 빌드.
- 이미지에 필요한 애플리케이션 코드와 종속성을 포함.
- 자동화 테스트:
- Docker 컨테이너에서 테스트 스크립트를 실행하여 애플리케이션의 동작 검증.
- 이미지 저장소 푸시:
- 테스트를 통과한 Docker 이미지를 Docker Hub, AWS ECR, Azure ACR 등에 푸시.
- 배포 자동화:
- CD 파이프라인에서 저장소에 있는 이미지를 스테이징 또는 프로덕션 환경에 배포.
- Kubernetes 등 오케스트레이션 도구를 활용해 배포 관리.
- 모니터링 및 피드백:
- 배포된 애플리케이션의 성능과 로그를 모니터링하고, 피드백 루프를 구축.
CI/CD 파이프라인에서 Docker 사용 사례
사용 사례 | 설명 |
빌드 자동화 | Dockerfile을 사용해 CI 과정에서 표준화된 애플리케이션 이미지를 자동 생성. |
테스트 환경 표준화 | Docker 컨테이너를 활용하여 동일한 테스트 환경을 제공하고, 테스트의 일관성 보장. |
멀티 서비스 배포 | Docker Compose 또는 Kubernetes를 통해 여러 서비스를 동시에 컨테이너로 배포. |
롤백 지원 | 문제가 있는 배포는 이전 버전의 Docker 이미지를 사용해 신속히 롤백 가능. |
블루-그린 배포 및 카나리 배포 | Docker를 활용하여 새로운 버전을 점진적으로 배포하거나 테스트 배포 가능. |
Docker와 CI/CD를 구현하는 도구
도구 | 역할 | 설명 |
Jenkins | CI/CD 자동화 도구 | Docker 플러그인과 통합하여 이미지를 빌드하고 컨테이너에서 테스트 실행. |
GitLab CI/CD | GitLab의 내장 CI/CD 도구 | Docker 이미지를 빌드하고, 스테이징 및 프로덕션 배포를 자동화. |
CircleCI | 클라우드 기반 CI/CD 서비스 | Docker 이미지 생성 및 컨테이너 기반 테스트 지원. |
Docker Hub | Docker 이미지 저장소 | Docker 이미지를 관리하고 배포 파이프라인에서 사용. |
Kubernetes | 컨테이너 오케스트레이션 도구 | 다수의 Docker 컨테이너를 관리하고, 스케일링 및 업데이트 수행. |
간단한 예: GitLab CI/CD + Docker
1. Dockerfile 작성
# 베이스 이미지 설정
FROM node:14
# 작업 디렉토리 설정
WORKDIR /app
# 패키지 파일 복사 및 설치
COPY package*.json ./
RUN npm install
# 애플리케이션 코드 복사
COPY . .
# 애플리케이션 실행
CMD ["npm", "start"]
2. GitLab CI/CD 설정 (.gitlab-ci.yml)
stages:
- build
- test
- deploy
build:
stage: build
image: docker:latest
services:
- docker:dind
script:
- docker build -t my-app .
test:
stage: test
image: docker:latest
script:
- docker run my-app npm test
deploy:
stage: deploy
image: docker:latest
script:
- docker tag my-app my-dockerhub-repo/my-app:latest
- docker push my-dockerhub-repo/my-app:latest
'Docker > Docker' 카테고리의 다른 글
[Docker] Docker 모니터링&로깅 (0) | 2025.02.04 |
---|---|
[Docker] Docker Compose (0) | 2025.02.03 |
[Docker] Dockerfile (1) | 2025.02.01 |
[CI/CD] Github Actions CI (0) | 2025.01.31 |
[Docker] Docker 기초 (0) | 2025.01.29 |