Dev

CI/CD 지속적 통합/지속적 전달(제공),배포 + release<->deploy

foxlee 2022. 3. 5. 10:23

CI CD

  • 애플리케이션 개발 단계를 자동화하여 애플리케이션을 보다 짧은 주기로 고객에게 제공하는 방법 
  • 지속적인 통합, 지속적인 서비스 제공, 지속적인 배포
  • 새로운 코드 통합으로 인해 개발 및 운영팀에 발생하는 문제(일명 "인테그레이션 헬(integration hell)")을 해결하기 위한 솔루션
  • 애플리케이션의 통합 및 테스트 단계에서부터 제공 및 배포에 이르는 애플리케이션의 라이프사이클 전체에 걸쳐 지속적인 자동화와 지속적인 모니터링을 제공
  • 이러한 구축 사례를 일반적으로 "CI/CD 파이프라인"이라 부르며 개발 및 운영팀의 애자일 방식 협력을 통해 지원

CI - Continuous Integration

  • 개발자를 위한 자동화 프로세스인 지속적인 통합(Continuous Integration)을 의미
  • CI를 성공적으로 구현할 경우 애플리케이션에 대한 새로운 코드 변경 사항이 정기적으로 빌드 및 테스트되어 공유 리포지토리에 통합되므로 여러 명의 개발자가 동시에 애플리케이션 개발과 관련된 코드 작업을 할 경우 서로 충돌할 수 있는 문제를 해결할 수 있음
  • 여러 개발자들이 동일한 애플리케이션의 각기 다른 기능을 동시에 작업할 수 있도록 하는 것을 목표로 하지만 조직에서 특정한 날(머지하는 날)을 정해 모든 분기 소스 코드를 병합하는 경우, 결과적으로 반복적인 수작업에 많은 시간을 소모하게 되고, 이렇게 반복적인 수작업을 하는 이유는 독립적으로 작업하는 개발자가 애플리케이션에 변경 사항을 적용할 때 다른 개발자가 동시에 적용하는 변경 사항과 충돌할 가능성이 있기 때문 -> 이는 팀이 하나의 클라우드 기반 통합 개발 환경(Integrated Development Environment, IDE) 사용하지 않고 각 개발자가 각자의 로컬 IDE를 커스터마이징하는 경우 더욱 복합적인 문제가 될 수 있음
  • 따라서, 개발자는 짧은 주기로 코드 작성 후 병합하고, Github Actions 등의 툴을 통해 빌드/테스트를 자동화하고 테스트 통과 시 병합하도록 함 -> 버그 최소화

CD - Continuous Delivery / Continuous Deployment

  • 지속적인 서비스 제공(Continuous Delivery) 및/또는 지속적인 배포(Continuous Deployment)를 의미
  • 두 가지 의미 모두 파이프라인의 추가 단계에 대한 자동화를 뜻하지만 때로는 얼마나 많은 자동화가 이루어지고 있는지를 설명하기 위해 별도로 사용되기도 함

지속적인 제공 - Continuous Delivery 

  • 개발자들이 애플리케이션에 적용한 변경 사항이 버그 테스트를 거쳐 리포지토리(예: GitHub 또는 컨테이너 레지스트리)에 자동으로 업로드(릴리즈)되는 것
  • 지속적인 제공은 최소한의 노력으로 새로운 코드를 배포하는 것을 목표
  • 개발 파이프라인에 CI가 먼저 구축되어 있어야 하며, 지속적 제공의 목표는 프로덕션 환경으로 배포할 준비가 되어 있는 코드베이스를 확보 -> 코드 변경 사항 병합부터 프로덕션에 적합한 빌드 제공에 이르는 모든 단계에는 테스트 자동화와 코드 릴리스 자동화가 포함
  • 이 프로세스를 완료하면 운영팀(수동)이 보다 빠르고 손쉽게 애플리케이션을 프로덕션으로 배포할 수 있게됨

지속적인 배포(Continuous Deployment)

  • 개발자의 변경 사항을 리포지토리에서 고객이 사용 가능한 프로덕션 환경까지 자동으로 릴리스하는 것
  • 애플리케이션 제공 속도를 저해하는 수동 프로세스로 인한 운영팀의 프로세스 과부하 문제를 해결
  • 프로덕션 이전의 파이프라인 단계에는 수동 작업 과정이 없으므로, 지속적 배포가 제대로 이루어지려면 테스트 자동화가 제대로 설계되어 있어야 함
  • 개발자가 애플리케이션에 변경 사항을 작성한 후 몇 분 이내에 애플리케이션을 자동으로 실행할 수 있는 것을 의미
  • -> 사용자 피드백을 지속적으로 수신하고 통합하는 일이 훨씬 수월해집니다.

이러한 모든 CI/CD 적용 사례는 애플리케이션 배포의 위험성을 줄여주므로 애플리케이션 변경 사항을 한 번에 모두 릴리스하지 않고 작은 조각으로 세분화하여 더욱 손쉽게 릴리스할 수 있지만 자동화된 테스트는 CI/CD 파이프라인의 여러 테스트 및 릴리스 단계를 수행할 수 있어야 하기 때문에 많은 선행 투자가 필요. 

https://www.redhat.com/ko/topics/devops/what-is-ci-cd

Release(N,V) - Deploy(V)

  • release (noun): A version of software intended for use outside the development team. A release need not be customer-centric. Some teams, for instance, differentiate between internal release (e.g. for software QA or demo activities) and external release (e.g. for customers or production). Ideally a release is associated with a checkpoint in the version control system and generated through a well-defined, repeatable process. ("I'm creating the 1.2 release now.")
  • release (verb): The act of making a release version available to a wider audience. ("We're going to release 1.2 to QA tomorrow.")
  • deploy (verb): The act of installing and configuring a version of software onto a target system. The version need not be a release; in some environments you can most certainly deploy development versions. ("I'm deploying 1.2 to the public website.")