개발 일기

[CI/CD] CI/CD란? 본문

DevOps/CI CD

[CI/CD] CI/CD란?

개발 일기장 주인 2024. 5. 20. 02:24

왜 공부하게 됐나?

최근 단순히 express, spring boot 프레임워크를 통해 로컬에서 개발하면서 배포 인프라 공부에 항상 부족함을 느꼈다. 어쨋든 로컬에서만 돌려서는 실제 서비스를 할 수가 없는데 지금 당장 프레임워크만 다뤄서 될게 아니라 도커, 쿠버네티스, 깃 액션 등 CI/CD에 대한 나의 능력도 키워야 되겠다는 생각이 들었다. 

그래서 Docker부터 공부하기 시작했고 EC2에 Git Actions을 통해 CI/CD 자동화에 성공했다고 생각했다. 근데 평소에 단순히 CI/CD가 통틀어 배포겠거니 생각하고 썼는데 내가 좀 잘 못 생각하고 쓰고 있었던 것 같다. 그래서 우선 CI/CD가 무엇인지에 대해 정리해보자 블로그를 쓰게 됐다.


배경

개발을 해보니 실제 서비스를 배포할 때 까지는 소스 코드 개발, 테스트, 빌드, 실제 배포환경서 실행(배포) 등 여러 과정들을 거쳐야 했다.

그런데 이 과정을 한번만 거친다면 아무 상관 없었을 것이다.

그러나 오류를 발견하여 수정하거나 요구사항의 변경으로 기능을 개발하는 등 코드를 수정하거나 추가하거나 제거할때 마다 이러한 과정들을 반복해서 진행해야 한다. 

실제로 내가 Git Actions를 쓰지않고 직접 이미지를 빌드하고 Docker Hub에 올리고 그것을 EC2에서 당겨와서 실행시키고 그리고 중간 중간에 또 기존 이미지 및 컨테이너를 제거하고 이러한 잡다하고 귀찮은 과정들을 매번 수행해야 했다.

따라서 CI/CD는 이러한 빌드부터 배포까지 과정들을 자동화하여 애플리케이션을 짧은 주기로 개발 단위를 반복 가능하게 하며 그만큼 개발자들에게 편의를 준다. 

이제 CI/CD 각각에 대해 알아보자.

 

CI(Continuous Integration) - 지속적 통합

  • Continuous Integration이란 "자동화된" 빌드 및 테스트를 수행하는 것으로
    변경된 소스 코드를 원격 저장소에 병합할 때 빌드와 테스트를 자동으로 거치도록 하는 것이다.
  • build  → test  → merge
  • 협업을 하는 경우 여러명의 개발자가 주기적으로 merge하지 않고 큰 단위로 개발하고 merge하게 된다면 conflict로 인한 시간이 발생할 수 있다.
    그러나 작은 단위로 나눠서 개발하여 에러 수정 및 새로운 기능 구현 등을 바로 바로 짧게 짧게 주기적으로 merge한다면 충돌을 최소화하여 개발의 생산성을 향상 시킬 수 있다.
  • CI는 통합을 위해 build, test, merge의 과정을 자동화한다고 했는데
    Git Hub에 Push하게 되면 자동으로 빌드, 테스트가 수행되어 안정적인 배포 파일을 만들 수 있도록 한다.

    빌드와 테스트를 수행하는 과정에 오류가 있다면 피드백을 주어 빠른 대처를 할 수 있도록 한다.

CD(Continuous Delivery & Deployment) - 지속적 서비스 제공 & 배포

CD는 지속적 서비스 제공 또는 지속적 배포 이 두가지로 나눌 수 있다..

  • Continuous Devliery (지속적 제공)
    • Continuous Delivery는 CI를 거친 후 리포지토리에 자동으로 업로드 되는 것을 말한다. 이렇게 업로드 된 Release가 문제가 없는지 증 한 후 어플리케이션을 실시간으로 프로덕션 환경에 "수동"으로 배포할 수 있다.
    • 좀 더 쉽게 풀어서 얘기해보면 코드의 빌드와 테스트를 성공적으로 진행했을 때 깃허브와 같은 코드 저장소에 자동으로 업로드하는 과정을 . 최소의 노력으로 코드 배포를 쉽게 하는 것을 목표로 합니다.

 

  • Continuous Deployment (지속적 배포)
    • Delivery와 다르게 준비된 Release를 확인하지 않고 배포까지 자동화하는 것을 Continuous Deployment라고 한다.
    • 따라서 테스트에 대한 확신이 필요하며 추가적 모니터링이 필요할 수 있다.
    • 지속적 제공을 통해 성공적으로 병합한 코드 내역을 AWS와 같은 배포 환경으로 보내는 것을 의미합니다. 이를 실무에서는 릴리스라고 하죠. 지속적인 배포는 지속적 제공의 다음 단계까지 자동화한다.
    • 즉, 개발자가 애플리케이션에 변경 사항을 커밋한 후 몇 분 이내에 배포 환경까지 자동으로 배포되어 적용된다.

즉, Continuous Deployment와 Continuous Delivery 이 둘은 비슷하지만 최종적으로 프로덕션에 릴리즈(배포)까지 자동화 했는지 아니면 그 전에 프로덕션에 릴리즈하기 위한 준비까지만 되고 추후에 검증 후 수동으로 배포를 진행해야하나 이 차이인 것 같다.

 

 

 

'DevOps > CI CD' 카테고리의 다른 글

[Git Actions] 깃 액션(Git Actions)를 통한 CI/CD  (0) 2024.05.21