CI/CD Continous Integration/Continous Delivery, Deployment의 줄임말입니다.
기본 개념은 지속적 통합 및 지속적 제공/배포이며 개발과 운영 팀에 발생하는 문제를 해결하기 위한 나온 솔루션(인테그레이션 헬)으로
애플리케이션의 전체 라이프 사이클에 대해 지속적인 자동화와 모니터링을 제공하여 이를 해결한다고 합니다.
이것을 제공하기 위해 작업하는 행위를 CI/CD의 파이프 라인을 구축했다고 이야기합니다.
각 단계에서 하고자하는 것에 대해 이야기 해보겠습니다.
Continous Integeration은 개발자를 위한 자동화 프로세스를 의미한다고 합니다.
코드 추가/변경 사항에 대해 정기적으로 빌드 및 테스트 되어 공유 리포지토리에 통합되는 것을 목적으로하며, 협업을 통해 애플리케이션 개발을 이룰 경우 서로 충돌할 수 있는 문제를 해결할 수 있습니다.
Continous Integeration은 크게 3가지 Phase로 나눌 수 있으며 Build, Test, Merge로 구성됩니다.
Continuous Delivery는 개발 후 변경 사항에 대한 버그 테스트를 마친 후 리포지토리(github, 컨테이너 레지스트리)에 코드를 자동으로 업로드하는 것을 의미합니다.
운영 팀은 레포지토리에 업로드된 이 이미지를 이용하여 운영되는 서버에 애플리케이션을 배포할 수 있습니다.
즉 Continuous Delivery는 최소한의 노력으로 컨테이너 레지스트리에 등록된 이미지를 배포하게 하는 것을 의미합니다.
(개발 팀과 운영 팀간의 가시성과 커뮤니케이션 부족 문제를 해결할 수 있음)
Continous Deployment는 리포지토리에 업데이트된 애플리케이션을 프로덕션 환경에 자동으로 릴리즈하는 것을 의미합니다.
좀더 자세히 이야기 해볼까요?
Continuous Integration은 여러 개발자들이 동일한 애플리케이션의 각기 다른 기능을 동시에 작업 할 수 있게 하도록 하는 것을 목표로 합니다.(사실 저의 회사의 규모도 작고, 대부분 1개발자 1서버로 업무를 배분하는 경우가 많아서, 이에 대한 경험이 부족하다고 생각합니다. ㅎㅎ)
CI를 하지 않고, 코드 병합을 위한 시간을 가지는 것은 결과적으로 반복적인 수작업에 많은 시간을 소모하게 됩니다.(버그 발생 시 수정 재commit 등에 대한 오버헤드)
하지만 CI를 이용한다면 코드 변경 사항을 공유 브랜치 또는 트렁크로 다시 병합하는 작업을 더욱 수월하게 자주 수행 할 수 있다고 합니다. 또한
빌드 자동화, 테스트 자동화(단위 테스트, 통합 테스트)를 통해 버그나 코드 충돌이 발생할 경우 더욱 빠르게 대응할 수 있다고 합니다.
• Pushing to the code repository
• Static analysis
• Pre-deployment testing
• Packaging and deployment to the test environment
• Post-deployment testing
Continuous Delivery는 CI의 빌드 자동화, 유닛 및 통합 테스트 수행 후, 이어지는 지속적 제공 프로세스에서는 유효한 코드를 리포지토리에 자동으로 릴리스합니다. 그러므로 효과적인 지속적 제공 프로세스를 실현하기 위해서는 개발 파이프라인에 CI가 먼저 구축되어 있어야 합니다. 지속적 제공의 목표는 프로덕션 환경으로 배포할 준비가 되어 있는 코드베이스를 확보하는 것입니다. 지속적 제공의 경우, 코드 변경 사항 병합부터 프로덕션에 적합한 빌드 제공에 이르는 모든 단계에는 테스트 자동화와 코드 릴리스 자동화가 포함됩니다. 이 프로세스를 완료하면 운영팀이 보다 빠르고 손쉽게 애플리케이션을 프로덕션으로 배포할 수 있게 됩니다.
Continuous Deployment
CI/CD 파이프라인의 마지막 단계는 지속적 배포입니다. 프로덕션 준비가 완료된 빌드를 코드 리포지토리에 자동으로 릴리스하는 지속적 제공의 확장된 형태인 지속적 배포는 애플리케이션을 프로덕션으로 릴리스하는 작업을 자동화합니다. 프로덕션 이전의 파이프라인 단계에는 수동 작업 과정이 없으므로, 지속적 배포가 제대로 이루어지려면 테스트 자동화가 제대로 설계되어 있어야 합니다. 실제 사례에서 지속적 배포란 개발자가 애플리케이션에 변경 사항을 작성한 후 몇 분 이내에 애플리케이션을 자동으로 실행할 수 있는 것을 의미합니다(자동화된 테스트를 통과한 것으로 간주). 이를 통해 사용자 피드백을 지속적으로 수신하고 통합하는 일이 훨씬 수월해집니다. 이러한 모든 CI/CD 적용 사례는 애플리케이션 배포의 위험성을 줄여주므로 애플리케이션 변경 사항을 한 번에 모두 릴리스하지 않고 작은 조각으로 세분화하여 더욱 손쉽게 릴리스할 수 있습니다. 그러나 자동화된 테스트는 CI/CD 파이프라인의 여러 테스트 및 릴리스 단계를 수행할 수 있어야 하기 때문에 많은 선행 투자가 필요합니다