CI/CD

CI (Continuous Integration, 지속적 통합)

  • 개발자가 코드 변경 사항을 공유 저장소자주 병합하며, 이를 통해 변경 사항이 팀 내에서 빠르게 통합될 수 있도록 지원.
  • 핵심 구성 요소:
    • 자동화 빌드: 코드가 병합될 때마다 프로젝트가 자동으로 빌드됨.
    • 자동화 테스트: 빌드된 프로젝트에 대해 자동으로 테스트가 실행되어 오류나 결함을 조기에 발견.
    • 소스 코드 관리: GitHub, GitLab, Bitbucket 등의 저장소를 사용하여 팀원이 동일한 코드 베이스를 관리.

CD (Continuous Delivery/Deployment, 지속적 제공/배포)

  • Continuous Delivery (지속적 제공):
    • 모든 코드 변경 사항이 프로덕션 환경에 배포 가능한 상태로 자동 준비.
    • 배포 전, 수동 승인 과정을 포함하여 프로덕션 환경에서의 안전성을 보장.
  • Continuous Deployment (지속적 배포):
    • 코드 변경 사항이 자동으로 프로덕션 환경에 배포되며, 별도의 수동 승인 없이 진행.
    • 완전히 자동화된 배포 파이프라인을 통해 운영 비용을 절감.

CI/CD 주요 구성 요소

  1. 소스 코드 관리(SCM): Git을 사용하여 코드 버전을 관리하고 팀 협업을 지원.
  2. 빌드 자동화 도구: Jenkins, GitLab CI/CD, CircleCI, TravisCI 등.
  3. 테스트 자동화: 다양한 테스트(단위 테스트, 통합 테스트, E2E 테스트)를 자동 실행.
  4. 배포 자동화: Docker, Kubernetes와 같은 컨테이너 및 오케스트레이션 툴을 활용한 배포 관리.
  5. 모니터링 및 피드백: Prometheus, Grafana, ELK 스택 등을 사용하여 문제를 조기에 탐지.

CI/CD의 상세 장단점

  장점  단점
CI - 변경 사항에 대한 빠른 피드백
- 코드 품질 유지
- 병합 충돌 감소
- 자동화로 생산성 향상
- 설정 복잡 (빌드 서버, 테스트 환경 구축 필요)
- 테스트 커버리지 부족 시 문제 탐지 어려움
Continuous Delivery - 코드 배포 준비 시간 단축
- 안정적인 릴리스 프로세스 구축
- 수동 배포 시 위험 최소화
- 릴리스 승인 절차로 인해 배포 지연 가능
- 추가적인 테스트와 검증 단계가 필요
Continuous Deployment - 실시간 사용자 피드백 수집 가능
- 업데이트 빈도가 높아짐
- 운영비용 절감 및 시장 대응력 강화
- 초기 설정 및 유지보수 복잡
- 충분히 자동화된 테스트가 없을 경우 문제 발생 가능

CI/CD 사용 이유

  1. 품질 개선:
    • 코드 병합 시 자동으로 테스트를 수행해 결함을 사전에 발견.
    • 코드 리뷰 프로세스와 통합하여 개발 표준을 준수.
  2. 효율성 증가:
    • 반복적이고 수동적인 작업을 자동화하여 개발자 생산성 향상.
    • 릴리스 주기를 단축해 시간 및 인력 비용 절감.
  3. 리스크 감소:
    • 변경 사항이 점진적으로 배포되므로 대규모 릴리스로 인한 문제 발생 가능성 감소.
    • 롤백 자동화로 문제 발생 시 신속한 복구 가능.
  4. 팀 협업 강화:
    • 병합 시 충돌을 최소화하고, 투명한 코드 공유를 통해 팀 간 협력 향상.
    • 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를 활용한 워크플로우

  1. 코드 작성 및 변경: 개발자가 소스 코드를 작성하고 Git 저장소에 커밋.
  2. Docker 이미지 생성:
    • CI 파이프라인에서 Dockerfile을 기반으로 이미지를 빌드.
    • 이미지에 필요한 애플리케이션 코드와 종속성을 포함.
  3. 자동화 테스트:
    • Docker 컨테이너에서 테스트 스크립트를 실행하여 애플리케이션의 동작 검증.
  4. 이미지 저장소 푸시:
    • 테스트를 통과한 Docker 이미지를 Docker Hub, AWS ECR, Azure ACR 등에 푸시.
  5. 배포 자동화:
    • CD 파이프라인에서 저장소에 있는 이미지를 스테이징 또는 프로덕션 환경에 배포.
    • Kubernetes 등 오케스트레이션 도구를 활용해 배포 관리.
  6. 모니터링 및 피드백:
    • 배포된 애플리케이션의 성능과 로그를 모니터링하고, 피드백 루프를 구축.

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

+ Recent posts