ref.
CI/CD 개념
what is ci/cd
[MSA] Automation (CI/CD)
CI/CD의 배경
✔️ 전통적인 배포 파이프라인
- Version Control
코드 변경 사항을 커밋한다.
- Acceptance tests
빌드/컴파일된 코드에 테스트를 수행한다.
- Independent Deployment
컴파일 후 테스트에 성공한 아티팩트를 개발환경에 배포한다.
- Production Deployment
Independent Deployment와 유사한 환경이야한다. production 서버에 코드를 배포한다.
- 위와같은 전통적 배포 과정에서는 사람의 실수로 문제가 발생할 수 있다.
- 분업과 협업에서 코드 Merge 과정은 까다로울 수 밖에 없으며 테스트에 큰 자원이 소모된다.
- 각자의 브랜치가 개발되는 기간이 늘어나면 통합의 어려움이 증대한다. (충돌될 위험이 커지며 이를 해결하는데 리소스를 낭비하게 된다.)
위와 같은 문제점들을 해결함과 동시에 빌드 및 기능 검증을 위한 새로운 방법을 확보함으로써 개발과 배치 속도를 개선하고자 하였다.
👍 기대 효과
- 빠른 개발 및 적용
- 안정적 시스템 운영
- 단위 테스트 및 테스트주도 개발 방법
- 테스트 자동화 구축 → 기존 코드와 신규 코드간 충돌을 발견, 빠르게 자주 수정 가능 (여러 사람이 작성한 코드가 병합될 때 생기는 문제를 미리 감지)
- 매일 코드 변경을 커밋하도록 개발자 독려
- 시스템과 어플리케이션을 최대한 최신상태로 유지
CI/CD의 정의
어플리케이션 개발 단계를 자동화하여 애플리케이션을 보다 짧은 주기로 고객에게 제공하는 방법
👉 지속적 통합, 지속적 서비스 제공, 지속적 배포, 지속적 모니터링
파이프라인으로 표현되는 실제 프로세스를 의미하고, 어플리케이션 개발에 지속적인 자동화 및 지속적인 모니터링을 추가하는 것을 의미한다.
대부분의 기업에서는 CI를 먼저 추가한 다음 클라우드 네이티브 애플리케이션의 일부로서 배포 및 개발 자동화를 구현해 나간다.
Continuous Integration
- 개발자를 위한 자동화 프로세스로서의 지속적인 통합
- 어플리케이션에 대한 새로운 코드 변경 사항이 정기적으로 빌드 및 테스트되어 공유 리포지토리에 통합된다.
- 협업 시 병합 시점에 충돌이 일어날 가능성을 감소시킨다.
- 개발자가 어플리케이션에 적용한 변경 사항이 병합될 때 어플리케이션을 손상시키지 않도록 자동으로 어플리케이션을 구축하고 각기 다른 레벨의 자동화 테스트 실행을 통해 변경 사항이 어플리케이션에 제대로 적용되었는지를 확인한다.
Countinous Delivery/Deployment
- 지속적인 서비스 제공(Countinous Delivery) 또는 지속적인 배포(Continous Deployment)를 의미하며 상호 교환적으로 사용된다.
- Countinous Delivery
- CI의 빌드 자동화, 유닛 및 통합 테스트 수행 후, 이어지는 지속적 제공 프로세스에서는 유효한 코드를 리포지토리에 자동으로 릴리즈한다.
- 개발자가 어플리케이션에 적용한 변경 사항이 버그 테스트를 거쳐 레파지토리(깃헙 or 컨테이너 레지스트리)에 자동으로 업로드된다.
- 프로덕션 환경으로 배포할 준비가 되어있는 코드베이스를 확보한다.
- 운영팀에서 이 레포지토리 내 어플리케이션을 실시간 프로덕션 환경으로 배포할 수 있다.
- 최소한의 노력으로 새로운 코드를 배포하는 것을 목표로 한다.
- Countinous Deployment
- 지속적 제공의 확장된 형태
- 개발자의 변경 사항을 레포지토리에서 고객이 사용 가능한 프로덕션 환경까지 자동으로 릴리즈하는 것을 의미한다.
- 개발자가 어플리케이션에 변경 사항을 작성한 후 몇 분 이내에 어플리케이션을 자동으로 실행할 수 있는 것을 의미한다.
- 어플리케이션 제공 속도를 저해하는 수동 프로세스로 인한 운영팀의 프로세스 과부하 문제를 해결한다.
CI/CD를 활용한 MAS Automation
- 마이크로서비스에서의 CI/CD는 Docker가 그 과정에 포함되면서 일반 모놀로딕 어플리케이션과 차별점이 생긴다. CD는 변경 사항이 적용될 때 어플리케이션이 올바르게 작동하도록 지속적 통합과 테스트가 필요하다. 이를 위해 어플리케이션은 느슨한 결합의 아키텍처를 가져야한다.
- 개별 모듈에서 작업하는 개발 팀은 해당 모듈을 변경, 컴파일 및 테스트하고 다른 모든 모듈과 함께 변경 사항을 응용 프로그램에 패키징 할 수 있어야한다.
- MAS 아키텍처는 어플리케이션의 설계, 개발 및 배포의 유연성에 직접적인 영향을 준다.
- Docker와 같은 컨테이너를 사용하면 개발자팀이 보다 효과적이고 민첩한 방식으로 작업 할 수 있다.
- Docker는 사용자 정이 어플리케이션을 제공하는 모든 조직의 개발, 구축, 테스트에 즉각적인 이점을 제공한다.
- 컨테이너는 어디에서나 실행할 수 있지만 운영 환경에서는 안정적으로 실행되어야 한다. 많은 공용 클라우드 공급자들은 Docker 컨테이너의 배포를 단순화하기 위해 관리를 위한 컨테이너 서비스(CaaS)를 제공한다.