CI는 Continuous Integration의 약어로, 지속적인 통합을 의미한다. 소프트웨어 개발 과정에서 개발된 코드를 지속적으로 통합하고 빌드하면서 코드 품질을 유지하고 향상시키는 프로세스이다. 이를 통해 버그나 오류를 최대한 빨리 발견하고 수정할 수 있어 개발 생산성을 높이는 데에 큰 도움이 된다.
CI의 개념은 1990년대 후반에 등장한 개념으로, 익스트림 프로그래밍(XP)의 창시자 중 한 명인 Martin Fowler가 처음 제시된 개념이다. CI 개념 이전에는 개발자들은 머지데이를 따로 정해, 지금까지 해온 개발작업들을 모두 병합하는 과정을 거쳤다. 어느정도 규모를 가진 코드의 양끼리 결합하다 보니, 병합시 문제가 발생하는 경우 디버깅도 어렵고, 시간도 많이 필요했다. 또한 병합 이전 빌드와 테스트 과정을 매번 반복해야 한다는 점에서 비효율적인 업무 운영이 이루어지기도 했다.
CI 가 실제 개발에서 중요하다고 판단되기 시작한 것은 2000년 이후 Travis CI 등의 CI 오픈소스들이 등장했을 때이다. CI 의 핵심은 코드를 실 서비스에 반영하기 이전, 진행되는 빌드와 테스트 과정을 자동화하므로써, 업무시간을 단축시키는 데에 있다.
CD는 Continuous Deployment의 약어로, 지속적인 배포를 의미한다. CI 가 자주 사용되는 것은 개발의 효율성을 일으켰지만, 서비스가 점점 커지고 배포해야할 빌드의 양이 많아지는 점 역시 많은 업무 시간을 소모해야했다. 더불어 컨테이너 및 클라우드를 활용한 가상서버의 사용이 많아진 이후 부터는 배포 자동화에 대한 설계 역시 강조되었다.
CD는 Continuous Delivery와 Continuous Deployment가 함께 혼용되어 사용된다. 지속적 제공은 성공적으로 병합된 결과물을 릴리즈하는 과정까지를 의미하며, 필요한 경우에 따라서는 병합된 결과물도 테스트하는 과정을 진행하기도 한다. 지속적 배포는 성공적으로 릴리즈된 결과물을 사용자가 접근 할 수 있도록 production에 배포하는 과정을 말한다.
CD의 경우 CI의 연장선적 개념으로, 일반적으로 자주 사용하는 파이프라인 툴은 모두 CI/CD 전체 과정을 설계할 수 있는 기능을 가지고 있다.
새로운 서비스에서 발생하는 다운타임을 제로로 하는 배포 전략이다. 서비스 배포를 진행 시에, 기존의 서비스에 업데이트한 내용을 반영하기 위해서는 기존의 서비스를 종료하고 새로운 서비스를 시작해야하는 과정을 거쳐야했다. 이때 기존의 서비스를 종료시키고 새로운 서비스를 빌드, 테스트, 배포를 진행하는 과정이 수반되기 까지 서비스에 접속할 수 없는 시간을 다운타임이라고 한다.
현대에는 다양한 플랫폼을 활용한 서비스 사용이 증가하면서도, 전세계적 고객을 대상으로 한 서비스의 경우를 생각할 때도 다운타임 이슈는 사용자에게 큰 문제점이 된다. 따라서 서비스 배포시에는 다운타임을 제로로 하는 무중단 배포가 강조된다.