최근에는 소프트웨어 개발 시 애자일(Agile) 형태를 많이 추구하게 되는데,
간단하게 설명하자면 작업 계획을 짧은 단위로 세우고, 만들어 나가는 사이클을 반복함으로써
고객의 요구 변화에 유연하고도 신속하게 대응하는 일종의 개발 방법론이라고 할 수 있다.
개발주기를 이렇게 짧은 라이프 사이클로 진행하다보면,
개발과 운영 사이에 상당히 많은 갭(Gap)이 발생할 수 있다.
매번 개발자가 코드를 수정하고 빌드와 테스트, 배포까지 한다면 상당히 많은 시간이 소요되지만,
레포지토리에 코드를 올리는 것만으로 빌드와 테스트, 배포까지 해결된다면
불필요한 시간을 단축시키고 개발에 더 많은 시간을 투자할 수 있게 된다.
이러한 방법을 제공하는 것이 바로 CI/CD이다.
CI/CD란?
CI/CD는 애플리케이션 개발 단계를 자동화하여 애플리케이션을 보다 짧은 주기로 고객에게 제공하는 방법이다.
CI/CD는 애플리케이션의 통합 및 테스트 단계에서부터 제공 및 배포에 이르는 애플리케이션의 라이프 사이클 전체에 걸쳐 지속적인 자동화와 지속적인 모니터링을 제공한다.
이러한 구축 사례를 일반적으로 CI/CD 파이프라인이라 부르며
개발 및 운영팀의 애자일(agile) 방식 협력을 통해 지원된다.
또한 CI/CD는 DevOps 엔지니어의 핵심 업무라고 불리기도 한다.
더 상세한 설명을 하기 전에,
CI
= 지속적인 통합
+ 자동화
CD
= 지속적인 배포
+ 자동화
개발 --> CI --> CD 순으로 Flow가 진행됨을 먼저 알고가면 좋을 것 같다.
CI(Continuous Integration)
CI/CD의 CI는 Continuous Integration의 약자로 지속적인 통합을 의미한다.
CI를 성공적으로 구현하면, 애플리케이션에 대한 새로운 코드 변경 사항이
정기적으로 빌드 및 테스트되어 공유 레포지토리에 통합되므로,
여러 명의 개발자가 동시에 애플리케이션 개발과 관련된 코드 작업을 할 경우
서로 충돌할 수 있는 문제를 해결할 수 있다.
일반적으로 애플리케이션에 대해 수정/변경된 내용을 반영하는 경우,
다른 개발자가 동시에 적용하는 변경 사항과 충돌할 가능성이 있다.
그러나 CI를 통해 자동화된 프로세스를 구현한다면,
개발자들이 코드 변경 사항을 메인 레포지토리를 통해 업로드했을 때
코드를 병합하는 작업을 더욱 수월하게 자주 수행할 수 있다.
개발자가 애플리케이션에 적용한 변경 사항이 병합되었을 때
변경 사항이 다른 개발자가 수정한 내역이나 프로그램에 영향을 주지 않으며,
애플리케이션에 문제가 발생하지 않도록 병합 작업을 수행한다.
또한 각기 다른 레벨의 자동화 테스트(보통 단위테스트 및 통합 테스트) 실행을 통해
변경 사항이 어플리케이션에 제대로 적용되었는지를 확인한다.
자동화된 테스트에서 기존 코드와 신규 코드 간의 충돌이 발견되면 CI를 통해 이러한 버그를 더욱 빠르게 확인할 수 있고, 이렇게 확인된 소스를 수정하여 원활하게 배포할 수 있다.
CD(Continuous Delivery/Continuous Deployment)
CD는 지속적인 전달(Continuous Delivery) 및 지속적인 배포(Continuous Deployment)의 의미를 가지고 있고, 두가지 용어를 혼용하여 사용한다.
CI를 통한 빌드의 자동화 및 유닛의 통합 테스트 수행 이후 이어지는 CD(Continuiuns Delivery) 프로세스는
유효한 소스코드를 레포지토리에 자동으로 전달한다.
따라서 효과적인 CD의 프로세스를 실현하기 위해서는 개발 파이프라인 CI가 먼저 구축되어야 한다.
이러한 CD 프로세스를 수행하면 보다 빠르고 손쉽게 어플리케이션을 운영 환경으로 배포할 수 있다.
지속적인 배포(CD, Continuous Deployment)란 개발자의 변경 사항을 리포지토리에서
고객이 사용 가능한 프로덕션 환경까지 자동으로 릴리스하는 것을 의미한다.
지속적인 배포는 다음 단계를 자동화함으로써 지속적인 제공(Continuous Delivery)이 가진 장점을 활용한다.
지속적 배포인 CD(Continuous Deployment)는 파이프라인의 마지막 단계로,
개발자의 변경 사항을 리포지토리에서 고객이 사용 가능한 프로덕션 환경까지 자동으로 릴리스하기 때문에
피드백을 지속적으로 수신하고 통합하는 일이 훨씬 수월해진다.
이러한 CI/CD 적용 시, 애플리케이션 배포의 위험성을 줄여주므로,
애플리케이션 변경 사항을 한 번에 모두 릴리스하지 않고, 세분화하여 더욱 쉽게 릴리스할 수 있다.
단, 자동화된 테스트는 CI/CD 파이프라인의 여러 테스트 및 릴리스 단계를 수행할 수 있어야하기 때문에
많은 선행 투자가 필요하며, 여러가지 도구들을 조합하여 서로 유기적으로 작동할 수 있도록 만들어야한다.
CI/CD 파이프라인의 요소
CI/CD 파이프라인의 단계는 각기 다른 태스크 하위 집합으로 이루어져 있는데,
이를 파이프라인 단계(pipeline stage)라고 부르며, 일반적인 파이프라인 단계는 다음과 같다.
- 빌드(Build) - 애플리케이션을 컴파일하는 단계
- 테스트(Test) - 코드를 테스트하는 단계. 이 단계를 자동화하여 시간과 수고를 줄일 수 있다.
- 릴리스(Release) - 애플리케이션을 리포지토리에 제공하는 단계
- 배포(Deploy) - 코드를 프로덕션에 배포하는 단계
- 검증 및 컴플라이언스(Validation & compliance) - 빌드 검증 단계는 해당 조직의 필요에 따라 결정된다. Clair와 같은 이미지 보안 스캔 툴을 사용하여 알려진 취약점(CVE)과 비교하는 방법으로 이미지의 품질을 보장할 수 있다.
Reference