CICD란?
Continuous Integration / Continuos Deployment 의 약자로
지속적인 통합, 지속적인 배포를 뜻한다.
지속적인 통합(CI)
CI를 하지않을 경우, 개발자들이 모여서 자신이 짠 코드를 병합하는 시간이 낭비된다.
또한 모여서 코드를 병합하기 전에는 개발자 각각이 다른 코드를 가지고 있는 상태이므로 좋지않다.
CI가 이러한 문제를 해결해준다.
CI란 빌드/ 테스트의 자동화를 뜻한다.
과정
1. 개발자가 코드 병합 요청 -> 2. CI Tool에서 빌드, 테스트를 진행 -> 3. 문제가 없다면 병합 -> 4. 문제 발생 시 개발자에게 피드백
결론
위 과정은 개발자가 직접 할 수도 있지만, 테스트를 하염없이 기다리는 것은 굉장히 지루하고 비효율적이다. 따라서 푸쉬해놓고 다른 일을 하면서 문제가 생기면 CI에게 알림을 받는 방식으로 효율적으로 코드를 최신화하자
CI의 4가지 규칙:
- 모든 소스코드가 살아있고 누구든 현재의 소스에 접근할 수 있는 단일 지점을 유지할 것.
- 빌드 프로세스를 자동화해서 누구든 소스로부터 시스템을 빌드할 수 있게 할 것.
- 테스팅을 자동화해서 언제든지 시스템에 대한 건전한 Test Suite(테스트 묶음)를 실행할 수 있게 할 것.
- 누구든 현재 실행 파일을 얻으면 지금까지 가장 완전한 실행 파일을 얻었다는 확신을 하게 할 것.
CI Tools
- Jenkins: 다양한 플러그인이 있지만, 세팅이 복잡하다. (설치형)
- TravisCI: github와의 연동성, 설치 없이 웹에서 사용가능, yml을 통한 쉬운 설정 (클라우드형)
- Github Action: yml에 설정(설정이 쉬움), 설치 없이 repository에서 관리 (저장소형)
- 그 외..
지속적인 배포(CD)
통합이 완료된 실행파일을 배포할 때, 서버 1대에만 배포한다면 직접 실행파일을 업로드한 후 실행하면 된다.
하지만 서버의 규모가 커져서 100대의 서버에 배포를 해야하는 상황이라면 일일이 직접 배포하는 것은 비효율적이다.
이 문제를 해결하기 위해 CI의 연장선인 CD의 개념이 필요하다.
CD란 빌드의 결과물을 프로덕션으로 릴리스하는 작업을 자동화하는 것을 의미한다.
CD는 지속적 제공(Delivery)과 지속적 배포(Deployment) 두 가지가 있다.
이 둘은 CI에서 Build, Test 완료 후 결과물을 staging환경에 업로드 한 후에 배포하는 과정에서 차이가 있다.
프로덕션으로 릴리스하는 과정을 수동으로 하는 경우는 Delivery에 해당하고, 자동으로 하는 경우가 Deployment이다.
새로운 서비스 배포 타이밍에 기존 서비스를 다운시켜야 함 -> 다운 타임이 발생
이 문제를 해결하기 위한 방법 : 무중단 배포
무중단 배포 방법: Docker, Nginx, S3 + code Depoly 등..
참고자료
CI/CD 개념: https://www.redhat.com/ko/topics/devops/what-is-ci-cd
CI/CD 배포 전략: https://dev.classmethod.jp/articles/ci-cd-deployment-strategies-kr/
CI/CD 구축: https://bcp0109.tistory.com/363