개발자를 위한 자동화 프로세스인 지속적인 통합(Continuous Integration)
지속적인 서비스 제공(Continuous Delivery) 및 지속적인 배포(Continuous Deployment)
일반적인 앱의 개발 및 유지보수 단계는 아래와 같다.
여기서 지속적 통합 및 지속적 전달을 단계별로 꾀할 수 있다.
개발자를 위한 자동화 프로세스라고 볼 수 있으며, Code - Build - Test 단계에서 꾀할 수 있다.
이 과정에서 개발자는 코드를 잦게 원격 코드 저장소에 push하고, 테스트 및 빌드를 하며 빌드 결과를 통해 빌드가 성공했는지 실패했는지 확인을 하고, 통합 테스트 결과를 통해 개선 방안을 찾는다.
이 지속적인 통합 과정을 통해 개발자는 버그를 일찍 발견할 수 있고, 테스트가 완료된 코드에 대해 빠른 전달이 가능해지며 지속적인 배포가 가능하다.
지속적 통합은 모든 코드 변화를 하나의 리포지토리에서 관리하는 것부터 시작한다.
모든 개발팀이 코드의 변화를 확인할 수 있기 때문에, 투명하게 문제점을 파악할 수 있다. 또한 잦은 풀 리퀘스트(pull request)와 머지(merge)로 코드를 자주 통합한다. 이때, 기본적인 테스트도 작동시킬 수 있다.
지속적 통합으로 보안 이슈, 에러 등을 쉽게 파악할 수 있어 해당 이슈를 빠르게 개선할 수 있다.
지속적인 서비스 제공(Continuous Delivery) 및 지속적인 배포(Continuous Deployment)를 의미하며 두 용어는 상호 교환적으로 사용된다. Release - Deploy - Operate 단계에서 꾀할 수 있다.
지속적 배포의 경우, 코드 변경 사항의 병합부터 프로덕션에 적합한 빌드 제공에 이르는 모든 단계로, 테스트 자동화와 코드 배포 자동화가 포함된다.
이 프로세스를 완료하면 프로덕션 준비가 완료된 빌드를 코드 리포지토리에 자동으로 배포할 수 있기 때문에 운영팀이 보다 빠르고 손쉽게 애플리케이션을 프로덕션으로 배포할 수 있게 된다.
최근에는 클라우드 기술 발전과 맞물려 지속적 통합과 지속적 배포가 빠른 속도로 진행되면서 CI/CD를 하나로 묶어서 다루는 경우가 점차 증가하고 있다.
지속적 배포의 가장 흔한 사례가 Github Page
지정해 둔 디렉토리에 정해진 방식에 따라 잘 커밋하기만 하면, Github Page가 알아서 해당 index.html 파일과 해당 디렉토리에 있는 파일을 잘 번들링 해서 Github Page 서버에 업로드한다.
이렇게 자동으로 인터넷에 배포가 되었고, 주변 가족이나 친구들에게 쉽게 만든 결과물을 공유할 수 있다.
CI/CD는 지속적 통합 및 지속적 제공(CD, Continuous Delivery)의 구축 사례만을 지칭할 때도 있고, 지속적 통합, 지속적 제공, 지속적 배포라는 3가지 구축 사례 모두를 의미하는 것일 수도 있다.
좀 더 복잡하게 설명하면 "지속적인 서비스 제공"은 때로 지속적인 배포의 과정까지 포함하는 방식으로 사용되기도 한다.
결과적으로 CI/CD는
파이프라인으로 표현되는 실제 프로세스를 의미하고, 애플리케이션 개발에 지속적인 자동화 및 지속적인 모니터링을 추가하는 것을 의미!
이 용어는 사례별로 CI/CD 파이프라인에 구현된 자동화 수준 정도에 따라 그 의미가 달라진다.
대부분의 기업에서는 CI를 먼저 추가한 다음 클라우드 네이티브 애플리케이션의 일부로서 배포 및 개발 자동화를 구현해 나간다.
수없이 진행되는 배포 과정을 자동화시키는 방법
위 그림은 배포 과정을 도식화한 것
개발자가 코드를 원격 저장소에 올리면,
그 코드가 빌드 및 테스트와 릴리스를 거쳐 배포 서버로 전달
배포 서버에 도달한 빌드된 코드는 애플리케이션 서버로 최종 배포가 완료되고, 그 결과물을 유저가 직접 확인하게 된다.
여기서 자동화를 꾀하는 부분은 보통 코드가 빌드되면서 최종적으로 배포가 되는 단계까지!
이 부분을 지속적인 통합 및 배포를 위하여 일련의 자동화 단계로 만드는데, 이것을 파이프라인을 구축한다고 표현한다.
파이프라인을 여러 단계로 분리할 때, 대표적으로 쓰이는 세 가지 단계를 알아보자.
Source 단계
: 원격 저장소에 관리되고 있는 소스 코드에 변경 사항이 일어날 경우, 이를 감지하고 다음 단계로 전달하는 작업을 수행
Build 단계
: Source 단계에서 전달받은 코드를 컴파일, 빌드, 테스트하여 가공한다. 또한 Build 단계를 거쳐 생성된 결과물을 다음 단계로 전달하는 작업을 수행한다.
Deploy 단계
: Build 단계로부터 전달받은 결과물을 실제 서비스에 반영하는 작업을 수행한다.
위 단계들은 더 세분화 되거나 간소화 되기도 한다. DevOps를 전문으로 하면, 더 세분화 하기도 한다. 또한 해당 툴을 소개하는 업체에 따라 용어를 미묘하게 다르게 사용하기도 한다. (통일 됐으면...)
위 과정들이 실무에서는 반복적인 프로세스이기 때문에 이 부분을 일련의 자동화 단계로 만든다고 볼 수 있다.
이렇게 구축된 파이프라인은 최신 버전의 소프트웨어 애플리케이션을 업데이트하고 제공하려는 일련의 처리 단계에 걸리는 시간을 수동으로 하는 것보다 더 빠르고 안정적이며 효과적으로 줄여주고 CI/CD 인프라와의 호환성과 효율성을 높여준다.