지속적 통합 vs 전달 vs 배포

소프트웨어 개발에 어느 정도 종사해 왔다면 CI/CD라는 용어를 본 적이 있을 겁니다.

지속적 통합, 전달 및 배포는 피드백 루프 단축 및 반복 작업의 자동화를 통해 소프트웨어 릴리스 프로세스의 속도를 개선하는 관행입니다. 이러한 관행은 사용자에게 가치 있고 작동하는 소프트웨어를 빈번히 전달하겠다는 애자일 원칙을 실현하는 데 핵심적 역할을 합니다.

팀에 맞는 흐름을 파악하여 정기적 릴리스 주기를 지원할 수 있는 CI/CD 도구와 프로세스를 준비한 팀은 효과적인 CI/CD 파이프라인에서 자부심을 느낍니다. 이는 개발자가 도구를 사용하여 환경과 개발하는 최종 제품을 모두 개선한다는 신호입니다.

하지만 처음으로 이 관행을 접하는 경우 빌드, 테스트 및 배포 프로세스를 자동화된 시스템으로 변환하는 것이 어렵고 불가능하게 느껴질 수 있습니다. 하지만 그런 감정을 느낄 필요는 없습니다. CI/CD 파이프라인 구축의 진정한 가치는 파이프라인을 별도의 단계로 완벽하게 나누어 단계별로 구축이 가능하다는 점에 있습니다. 그럼 하나씩 살펴보겠습니다.

CI와 CD는 어떻게 다르고 각각의 주요 특징은 무엇인지 살펴보겠습니다.

지속적 통합 vs 전달 vs 배포

지속적 통합이란?

지속적 통합은 코드를 모두 취합해 테스트하기까지 완벽한 코드를 기다리지 않고 개발 프로세스 전반에 걸쳐 "통합" 중 수행된 단계를 조금씩, 자주 실행하는 관행입니다.

대부분의 상용 및 오픈소스 소프트웨어에서 일반적인 것처럼 두 명 이상이 소프트웨어 제품을 개발하는 상황을 가정할 경우, 언젠가 각각의 개발자가 작업한 부분을 결합하여 최종 결과물이 적절히 작동하는지 확인해야 할 시점이 도래합니다. 지속적 통합이 적용된 경우 그 시점은 하루에 한 번 이상 발생합니다.

이유는 간단합니다. 모든 코드가 작성될 때까지 통합을 방치할 경우 코드 섹션을 살펴보고 다시 작성하는 데 상당한 시간이 소요될 가능성이 높으며, 이러한 상황은 솔루션이 적절히 작동하는지 확인하는 것은 물론 빌드를 완료하는 데도 발생합니다. 코드는 복잡합니다. 세밀한 사전 설계 작업을 거쳤더라도 로직의 상호작용 및 문제 방지 방식을 정확히 예측하는 것은 매우 어렵습니다. 코드가 많을수록 더욱 복잡해지며 작동하지 않는 부분이 있을 때 다시 살펴봐야 할 분량도 증가합니다.

지속적인 통합을 사용하면 개발자는 변경 사항을 정기적으로(1일 1회 이상) 소스 관리 시스템에 커밋하여 변경 사항을 공유하고, 솔루션의 테스트 빌드 및 통과 현황을 확인합니다. 그러므로 문제가 발생하면 문제의 원인을 파악하기 위해 점검해야 할 변경 사항의 개수가 더 적습니다. 또한 신속한 피드백이 제공되므로 수행 중인 작업의 컨텍스트를 놓치지 않으며 훨씬 간편하게 이슈를 수정할 수 있습니다.

좋은 CI 프로세스의 몇 가지 필수 요소는 다음과 같습니다.

소스 관리 시스템 사용

소스(버전) 관리 시스템은 반드시 필요합니다. 소스 관리 시스템을 사용하지 않거나 코드의 일부만 해당 시스템에 있는 경우 첫 단계는 모든 코드를 가져오고 모든 팀원이 사용하도록 요청하는 것입니다.

조기에 자주 커밋하기

소스 관리 시스템을 사용하는 경우 모두가 조기에, 자주 커밋하는 습관을 기르도록 합니다. 커밋 시에는 작업 크기가 영향을 미칠 수 있습니다. 각각의 작업을 더 작은 부분으로 나누면, 더욱 쉽게 로컬에서 변경을 완료하고 테스트할 수 있어 커밋할 준비가 됩니다.

모든 커밋으로 솔루션 빌드

프로젝트의 모든 구성원과 코드의 변경 사항을 정기적으로 공유하는 것은 시작에 불과합니다. 다음 단계로 최신 변경 사항으로 솔루션 빌드가 가능한지 확인합니다. 이 작업을 수동으로 수행할 수 있지만 빌드를 자동으로 트리거하면 훨씬 쉽고 효율적입니다. 이때 CI 서버가 필요합니다.

테스트 자동화

성공적 빌드는 좋은 신호이지만 더욱 확실히 하려면 일부 테스트를 실행하는 것이 좋습니다. 다시 강조하자면 수동으로 테스트하는 것보다 자동 테스트를 실행하는 것이 훨씬 쉽고 효율적입니다. 자동화된 테스트 작성에 더 많은 노동력이 필요한 듯 보이지만, 빠른 피드백을 얻기 위해 모든 빌드에서 테스트를 실행할 경우 시간을 훨씬 단축할 수 있습니다.

피드백 경청

습득한 정보로 어떤 일을 수행하는 경우에만 빌드 및 테스트를 자동화할 가치가 있습니다. CI 도구는 대시보드 및 라디에이터부터 인스턴트 메시징 플랫폼과 통합 등의 다양한 피드백 메커니즘을 제공합니다.

DevOps 문화 구축

지속적인 통합의 이점을 적절히 활용하려면 모든 팀원이 작동하지 않는 빌드를 수정하거나 테스트 실패에 책임감을 갖는 팀 문화를 조성해야 합니다. 마지막으로 커밋한 팀원만을 탓할 경우 역효과를 낳습니다. 변경 사항을 조기에, 자주 커밋하는 편이 모두의 이익에 부합함에도 팀에서 이를 실천하는 데 방해가 되기 때문입니다.

이와 같은 모든 요소를 함께 활용하면 코드에 대한 피드백을 빠르게, 정기적으로 받을 수 있습니다. 버그 수정, 리팩터링 또는 신규 기능의 일부 혹은 테스트를 통과한 클린 빌드 결과 등 코드베이스의 모든 변경 사항을 확인함으로써 팀은 부적절한 기반에서 새로운 일을 수행하면 필연적으로 수반되는 재작업을 방지할 수 있습니다. 지속적 통합의 자체적 구현은 작동하는 소프트웨어를 사용자에게 전달하기 위한 프로세스의 속도를 개선하는 큰 변화입니다.

지속적인 전달 이해하기

지속적 전달은 지속적 통합으로 확립된 빌드 및 테스트 자동화의 토대를 기반으로 삼습니다.

지속적인 전달을 활용하면 소프트웨어 빌드를 프로덕션으로 출시하는 데 사용되는 수동 단계를 자동화된 프로세스로 전환할 수 있습니다.

이전에는 개발자에서 테스터로, 테스터에서 릴리스 관리자로 핸드오프가 제공되었지만 지속적인 전달을 도입하면 다양한 분야의 사람들이 포함된 팀으로 빌드, 테스트 및 제품 릴리스의 전체 프로세스를 완전히 파악할 수 있습니다. 지속적인 전달의 이점은 다음과 같습니다.

  • 기존의 사일로를 방지하므로 사용자에게 제품을 제공하기 위한 비즈니스 및 운영상 요구 사항을 개발 팀에서 더욱 잘 이해할 수 있습니다.
  • 따라서 대체로 수동으로 진행되는 긴 호흡의 프로세스에 개발 관행을 도입할 기회를 제공합니다.
  • 제품을 라이브로 전달하는 단계를 자동화하면 프로세스 속도를 개선할 수 있을 뿐 아니라 오류 위험이 감소하여 더욱 안정적이고 신뢰할 수 있는 프로세스가 구축됩니다.

사용자에게 소프트웨어를 제공하는 정확한 단계(즉, 전달 파이프라인의 필수 단계)는 비즈니스 및 사용자의 니즈에 따라 다르지만 실제 릴리스에 앞서 하나 이상의 사전 프로덕션 환경으로 배포하는 것이 일반적입니다.

이러한 환경은 보안, 로드, 성능 테스트와 같은 추가 테스트 계층을 위한 테스트 환경, 지원 및 영업팀에서 새로운 기능을 익힐 수 있는 샌드박스 환경, 변경 사항의 적절한 작동을 확인하는 QA 및 제품 전문가를 위한 수용 테스트 환경일 수 있습니다.

지속적 전달을 활용하면 성공적인 각각의 빌드가 각 사전 프로덕션 환경에 자동으로 배포되며, 모든 단계별로 품질이 개선된다는 확신을 얻을 수 있습니다.

이는 실행하는 데 약간의 투자를 필요로 하지만 추구할 만한 목표입니다.

한 번만 빌드

파이프라인의 각 단계에서 동일한 빌드 아티팩트로 진행할 경우에만 해당 아티팩트가 이전 테스트 단계를 모두 통과했다고 확신할 수 있습니다.

소스 관리 시스템에 구성 저장

모든 구성 파일을 소스 관리 시스템에 저장하여 배포의 일관성과 반복성을 보장할 수 있습니다.

모든 배포 자동화

각 환경으로 배포는 매번 정확히 동일한 방식으로 자동 실행될 수 있도록 스크립트로 작성해야 합니다. 같은 이유로 라이브 릴리스의 스크립트도 작성해야 하지만, 지속적인 전달을 사용할 경우 이 마지막 단계가 자동으로 수행되지 않습니다.

환경 정리

완전히 일관성 있는 접근 방식을 위해 각각의 새 배포에서 환경 자체를 동일한 조건으로 다시 설정해야 합니다. 컨테이너 덕분에 로컬 인프라 또는 클라우드에서 이를 훨씬 쉽게 구현할 수 있습니다.

별도의 환경 문제

동일한 아티팩트를 각 환경에 자동으로 배포하려면 애플리케이션 자체와 환경별 변수 또는 매개변수 간의 명확한 구분이 필요합니다.

파이프라인 관리

지속적 통합과 마찬가지로 자동화된 전달 파이프라인도 관리하는 경우에만 투자할 가치가 있습니다. CI/CD에서 프로세스와 도구만큼이나 팀 문화도 중요합니다. 효과적으로 CI/CD를 활용하려면 팀에서 파이프라인을 관리하고 코드 자체의 버그 또는 자동화된 배포나 테스트 문제로 인해 발생하는 모든 이슈를 해결하는 데 책임감을 발휘해야 합니다.

지속적 전달을 통해 팀은 소프트웨어 제공을 위한 책임을 다하고 프로세스 전반에서 적절한 시기에 제공되는 피드백의 이점을 누릴 수 있습니다. 지속적인 통합과 마찬가지로 시간이 지날수록 이 관행이 구축되고 개선될 수 있습니다.

지속적 배포 설명

지속적 배포는 지속적 통합 및 전달의 관행의 논리적 귀결입니다.

빌드가 파이프라인의 모든 이전 단계를 무사히 통과할 경우 프로덕션에 자동으로 릴리스됩니다. 즉, 소프트웨어의 변경 사항이 모든 테스트를 통과하는 즉시 사용자에게 전달되는 것입니다. 지속적 배포는 프로덕션에 사용할 수 있도록 코드 변경의 피드백 루프를 단축하므로 품질 저하 없이 변경된 사항이 실제 환경에서 실행되는 방식에 대한 인사이트를 적시에 제공합니다.

프로덕션으로의 소프트웨어 배포 자동화가 모든 제품과 조직에 적합하지는 않지만 각각의 개별적 요소가 그 자체로 가치를 지니므로 이를 달성하는 데 필요한 단계를 고려하는 것이 좋습니다.

테스트에 대한 확신

프로덕션으로 자동 배포를 수행하려면 파이프라인, 특히 자동화된 테스트에 대한 높은 수준의 신뢰가 필요합니다. 팀이 테스트 커버리지와 성능에 투자하고 새로운 기능보다 빌드 및 파이프라인 수정을 우선적으로 고려하는 훌륭한 테스트 문화가 핵심입니다.

프로덕션 모니터링

위의 모든 조치를 적용하더라도 지속적 배포가 위험한 관행처럼 느껴질 수 있습니다. 테스트에서 버그가 발견되지 않고 프로덕션 환경에서만 발생하면 어떻게 될까요? 잠재적으로 시간, 돈, 평판이 모두 걸려 있습니다. 수동 배포에서도 동일한 문제가 발생할 수 있지만 "시스템"이 수정이 필요한 버그를 자동으로 릴리스하는 것만큼 관계자의 신뢰를 잃는 일은 없을 겁니다. 버그 보고서를 받을 때까지 기다리지 않고 주도적으로 문제의 징후를 찾는 것이 가장 중요합니다. 특히 릴리스 직후 비정상적 변경 사항의 통계를 모니터링하면 사용자가 인지할 만한 문제로 이어지기 전에 이슈에 대해 경고받을 수 있습니다.

릴리스 항목 선택

신규 배포부터 지속적 배포를 반대하는 일반적 근거는 개발자가 조기에, 자주 커밋하고 인력에 의한 감독 없이 릴리스할 경우 아직 사용하기엔 부족한 미완성 혹은 절반쯤 완료된 기능을 사용자가 발견할 수 있다는 점입니다. 브랜치에 의존하고 지속적 통합의 이점을 놓치는 대신 기능 플래그 사용이라는 솔루션을 이용해 보십시오. 개발자는 코드 작성 시 기능 플래그를 통해 사용자에게 표시할 항목과 숨길 항목을 제어할 수 있습니다.

파이프라인 간소화

프로덕션에서 문제가 발생하면 신속하게 대응하는 것이 좋습니다. 경우에 따라 릴리스를 이전 버전으로 롤백할 수 있으나 상황은 대개 그렇게 간단하지 않습니다. 데이터베이스 마이그레이션 및 알려진 이슈 수정을 통해 이후의 문제를 제외한 모든 문제를 방지할 수 있으며 유일한 옵션을 수정을 공개하는 것입니다. 파이프라인 단계를 건너뛰면 정상적으로 테스트를 수행할 경우 포착 가능한 다른 문제가 초래될 수 있으므로 향후 더 오랜 시간이 소요됩니다. 대신 빌드 속도부터 성능 테스트를 아우르는 파이프라인 간소화에 투자하는 것이 좋습니다. 이를 통해 필요할 때 변경 사항을 빠르게 배포할 수 있을 뿐 아니라 프로세스 전반의 피드백 루프를 단축할 수 있습니다.

롤아웃 제어

지속적 배포는 모든 이전 단계가 기준을 충족할 경우 자동으로 릴리스되는 것을 의미하지만 모든 제어를 포기하는 것은 아닙니다. 위험을 최소화하고 롤아웃을 제어하는 데 사용되는 다양한 배포 방식이 있습니다. 카나리(Canary) 릴리스를 사용하면 초기에 소그룹의 사용자를 대상으로 테스트할 수 있으며 블루-그린 배포는 새 버전으로 전환을 관리하는 데 사용할 수 있습니다.

지속적 통합, 전달 및 배포는 모두 가치 있고 작동하는 소프트웨어를 사용자에게 빈번히 제공한다는 목표에 부합합니다. 통합 및 릴리스를 조금씩, 자주 수행하는 접근 방식을 통해 프로세스를 보다 쉽게 관리할 수 있으며 팀은 이러한 단계를 정기적으로 실천하며 발전할 수 있습니다.

자동화 도입으로 프로세스의 속도뿐 아니라 신뢰도도 향상됩니다. 파이프라인의 각 단계는 이전 단계를 기반으로 구성되며 개발자는 언제든 적합한 정도를 선택하고 추후 다시 빌드할 수 있습니다.

CI와 CD의 주요 차이점

지속적 통합 vs 전달 vs 배포

지속적인 통합, 전달 및 배포는 소프트웨어 전달 프로세스의 순차적 단계입니다. 팀이 소프트웨어를 더 빠르게 릴리스하고 피드백 루프를 단축하며 반복 작업을 자동화하도록 도와줍니다. 지속적 통합, 전달 및 배포 사이의 주된 차이점을 구분하는 것만큼 중요한 일은 안정적이고 신뢰할 수 있는 방식으로 소프트웨어를 사용자에게 제공하기 위해 이 세 단계를 어떻게 결합시킬 것인지 이해하는 것입니다.

지속적 통합은 새로운 코드 변경을 기본 브랜치에 병합하는 과정입니다. 지속적 전달은 소프트웨어 빌드 및 테스트에 필요한 수작업을 자동화합니다(예: 테스트 자동화). 지속적 배포는 빌드 및 테스트 단계를 자동화하는 과정에서 자연스럽게 이어지는 단계로, 이 단계에서 소프트웨어는 필요한 모든 체크포인트를 통과하면 자동으로 배포됩니다.

일반적으로, CI와 CD를 비교하는 것이 중요한 것이 아니라 안정적이고 신뢰할 수 있는 파이프라인을 만드는 데 이러한 모든 구성 요소가 어떤 방식으로 함께 작동할 것인지가 관건입니다.