Jenkins

[Jenkins] 무중단 배포를 위한 CI/CD 파이프라인 구현 (1) - Jenkins, CI/CD 개념과 시스템 설계

J_Dev 2024. 12. 24. 22:40

서론

  • GitHub에 코드를 푸시한 뒤, JAR 빌드, Docker 이미지 생성 및 Docker Hub에 푸시, 그리고 인스턴스를 재시작하는 과정이 너무 복잡하고 반복적이었습니다.
  • 이에 따라 CI/CD 파이프라인의 필요성을 느끼게 되었고, 이를 해결하기 위해 Jenkins를 도입하게 되었습니다.

1. CI/CD 파이프라인이란?

CI(Continuous Integration)- 지속적 통합

  • 개발자가 코드 변경 시 이를 자동으로 병합하고 빌드 및 테스트를 실행하여 충돌을 감지합니다.
  • 여러 개발자가 동시에 작업해도 버그를 조기에 발견하고 코드 품질을 유지할 수 있습니다.
  • 주로 빌드 → 테스트 → 병합의 순서로 진행됩니다.

CD(Continous Deliver, Continous Deployment)

  1. Continuous Delivery(지속적 전달)
    • CI 과정을 통과한 코드를 배포 가능한 상태로 준비하는 과정입니다.
    • 주로 릴리즈 속도 향상을 목적으로 합니다.
  2. Continous Deployment
    • Continous Delivery를 통과한 코드를, 자동으로 프로덕션 환경에 배포하는 프로세스입니다.

CI/CD 도입 효과

  • 배포 자동화로 효율성 증대
  • 코드 품질 향상 및 배포 안정성 강화
  • 릴리즈 속도 단축

2. Jenkins 란?

  • 오픈소스 자동화 도구 로 CI/CD 파이프라인을 구현하는 데 사용됩니다.주요특징
  • 자동화: 빌드, 테스트, 배포 과정을 자동화합니다.
  • 다양한 플러그인 지원: GitHub, Slack, Docker 등 여러 리소스와 통합 가능합니다.
  • 병렬 빌드: 여러 노드를 병렬 배치하여 작업을 동시에 수행합니다.
  • 웹 기반 인터페이스: 사용자 친화적인 GUI를 제공합니다.

3. 시스템 아키텍쳐 설계

1) GitHub Repository Clone

  • GitHub에 코드가 푸시되면 Jenkins가 자동으로 실행됩니다.
  • 최신 소스코드를 Clone하여 파이프라인을 시작합니다.

2) JAR 파일 Build (Gradle)

  • Gradle을 사용해 소스코드를 빌드하고 실행 가능한 JAR 파일을 생성합니다.
  • 빌드 과정 중 발생할 수 있는 메모리 부족 문제는 메모리 스왑 설정으로 해결 가능합니다.

3) Docker Image build 및 Docker Hub 에 Push

  • Dockerfile과 빌드된 JAR 파일을 기반으로 Docker 이미지를 생성합니다.
  • Docker-Compose로 실행하여 이상 여부를 확인한 뒤, 정상 배포된 이미지를 Docker HubPush합니다.

4) Auto Scaling Group 내 인스턴스 재시작

  • Auto Scaling Group(ASG) 내 실행 중인 인스턴스를 하나씩 종료(Terminate)합니다.
  • ASG는 자동으로 새로운 인스턴스를 생성하며, 생성된 인스턴스는 시작 시 Docker Hub에서 최신 이미지를 Pull하여 적용합니다.
  • 안정적인 동작을 위해, 새로운 인스턴스가 준비될 때까지 대기한 뒤 다음 인스턴스를 종료합니다.

5) Slack에 알림 메시지 발송

  • 배포 완료 후, Slack 채널알림 메시지를 발송하여 팀원들에게 배포 상황을 공유합니다.

결론

  • 이번 포스트에서는 Jenkins를 활용한 무중단 배포를 위한 CI/CD 파이프라인의 개념과 필요성, 그리고 시스템 설계 과정을 살펴보았습니다.

  • 이러한 설계를 통해 CI/CD 파이프라인이 배포 효율성과 안정성을 어떻게 향상시키는지 이해할 수 있었습니다.

  • 다음 포스트에서는 EC2 환경에서 Jenkins 설치 및 초기 설정 과정을 상세히 다루어 실제 구현 단계를 시작하겠습니다.