지속적 전달(CD)이란 소프트웨어를 프로덕션에 릴리스하기 위한 수동 준비 단계를 자동화하는 작업입니다.
지속적 전달(CD)은 소프트웨어를 프로덕션에 릴리스하기 위한 준비 단계를 자동화하여 지속적 통합(CI)을 기반으로 구축합니다.
코드 변경 사항을 지정된 브랜치에 병합할 때마다 지속적 통합 프로세스가 자동화된 유닛 테스트를 포함한 일련의 검사를 수행하고 빌드를 생성합니다. 지속적 전달은 각 빌드를 일련의 테스트 및 스테이징 환경으로 자동 배포하고 자동화된 테스트를 추가로 실행하여 이 프로세스를 확장합니다.
이러한 테스트에는 통합 테스트, UI 테스트 및 성능 테스트(로드, 소크, 스트레스 테스트 등)와 엔드투엔드 테스트가 포함됩니다. 업계에 따라 지속적 전달을 활용하여 보안 테스트, 접근성 테스트 및 수동 사용자 수용 테스트 및 실험적 테스트를 실행할 수도 있습니다. 빌드가 각 단계를 성공적으로 통과하면 프로덕션으로 릴리스될 준비가 된 것으로 간주됩니다.
지속적 통합과 마찬가지로 효율적인 지속적 전달은 최대한 많은 프로세스를 자동화합니다. 여기에는 단계별로 피드백을 제공하고, 빌드가 단계를 통과하지 못하면 팀이 빠르게 문제를 해결할 수 있도록 경고하는 것이 포함됩니다.
지속적 전달과 지속적 배포는 모두 빌드를 자동으로 환경에 배포하고 자동화된 테스트를 실행합니다. 그 결과 두 용어는 혼용해서 사용할 때가 많지만, 지속적 전달과 지속적 배포를 구분하는 것이 유용할 수 있습니다.
지속적 배포의 경우 코드 변경이 각 테스트 단계를 통과할 때마다 자동으로 프로덕션에 배포됩니다. 반면에 지속적 전달은 최종 단계인 프로덕션으로 소프트웨어를 릴리스할 때 수동 단계를 거쳐야 합니다.
소프트웨어 개발 팀이라면 지속적 배포가 이상적인 목표처럼 들릴 수 있지만, 상당수의 팀이 지속적 전달을 시행하는 데는 여러 이유가 있습니다.
CI/CD 프로세스의 최종 단계는 코드 변경 사항을 프로덕션으로 배포하는 것입니다. 지속적 전달의 경우 릴리스 프로세스 자체는 자동화되어 있지만 릴리스로 배포할지 여부는 수동으로 결정해야 합니다.
일부 팀에서는 지속적 배포로 넘어가기 전의 징검다리 단계로 지속적 전달을 시행합니다. 프로덕션으로 최종 배포하는 것을 수동으로 실행하면 자동화된 테스트와 검사의 신뢰도를 쌓는 동안 안전을 확보할 수 있습니다. 이 경우 몇 달 정도 지속적 전달을 시행한 다음에 성공적인 모든 코드 변경 사항을 자동으로 프로덕션에 배포하는 단계로 넘어가면 좋습니다.
그러나 하루에 여러 번 또는 한 시간에도 여러 번 소프트웨어 업데이트를 배포하는 방식이 항상 좋지는 않습니다. 모바일 앱, API, 임베디드 소프트웨어 또는 데스크톱 제품처럼 버전이 있는 소프트웨어의 경우, 변경 사항을 그룹화하여 대규모 릴리스로 만드는 것이 합리적일 때가 많습니다. 설치된 제품을 사용하는 사람들이 몇 시간마다 앱을 업데이트하기를 바라지도 않을 것이고, 새로운 API 버전으로 업그레이드하면 고객에게 큰 영향을 줄 수도 있습니다. 지속적 전달과 지속적 배포 중에서 선택할 때는 비즈니스와 사용자에게 맞는 결정을 내려야 합니다.
정확한 빌드 단계, 환경 및 테스트는 제품이나 조직에 따라 달라지지만, 다음의 일반적인 원칙은 지속적 전달 프로세스를 만드는 데 도움이 될 것입니다.
지속적 전달을 통해 소프트웨어를 더 빠르게 릴리스하고 더 빈번하게 하면서도 프로덕션까지 전달되는 버그의 수를 줄일 수 있습니다. 이를 달성하기 위한 핵심은 항상 변경 사항을 지속적으로 테스트하고 문제가 발견되는 즉시 해결하여 언제든 코드가 릴리스될 수 있도록 하는 것입니다.
여기에 더해서 지속적인 전달에는 여러 가지 장점이 있습니다.
지속적 전달 프로세스를 구현하는 데에는 몇 가지 해결 과제가 따릅니다.
지속적 전달 프로세스를 만드는 일은 막연해 보일 수도 있지만 제대로 만든다면 소프트웨어 릴리스 속도는 극적으로 높이고 버그는 최소화할 수 있습니다.
지속적 전달을 효율적으로 구현하려면 DevOps 사고방식을 채택하는 것이 중요합니다. DevOps 관점에서 소프트웨어 개발 프로세스는 한 방향으로 이동하며 요구 사항, 코드 및 보고서가 한 팀에서 다른 팀으로 전달되는 컨베이어 벨트가 아닙니다. DevOps는 짧고 반복적인 주기로 협업과 신속한 피드백을 지원합니다.
'완료의 정의'를 바꾸는 것이 이 사고방식을 채택하는 데 도움이 됩니다. 코드가 테스트를 위해 제출될 때 작업이 완료되는 것이 아니라 새로운 기능이나 코드 변경 사항이 프로덕션으로 릴리스되었을 때만 완료가 된 것입니다. 수정할 때 승인을 위해 변경 보드를 거쳐야 하는 긴 보고서를 사용하는 것보다 파이프라인의 어느 단계에서든 문제가 발견되면 해당 피드백을 즉시 전달하고 협력하는 편이 문제를 더 빠르게 해결할 수 있습니다. 이것이 지속적 전달의 핵심입니다.
지속적 전달을 시작하는 데 도움이 되는 팁을 더 알아보려면 CI/CD 모범 사례 가이드를 참조하세요.
지속적인 전달을 사용하면 소프트웨어를 보다 간편하고 빠르게 릴리스할 수 있어 프로덕션으로의 배포 빈도를 높일 수 있습니다. 대규모 분기별 릴리스나 연간 릴리스 대신 소규모 업데이트가 자주 제공됩니다. 따라서 사용자는 신규 기능과 버그 수정을 더 빠르게 받아볼 수 있으며 개발자는 소프트웨어의 사용 방식을 확인하고 그에 따라 계획을 조정할 수 있습니다.
릴리스 프로세스의 마지막 단계를 계속 제어하고 싶어 하는 조직이 있는 반면, CI/CD 파이프라인의 논리적 귀결은 지속적 배포라는 방식을 사용하는 프로덕션 릴리스의 자동화라고 생각하는 조직도 있습니다. 여기에 관해서는 CI/CD 가이드의 다음 섹션에서 자세히 알아볼 수 있습니다.
TeamCity는 CI/CD 플랫폼으로서 다양한 빌드 도구, 테스트 프레임워크, 컨테이너 및 클라우드 인프라 공급자를 광범위하게 지원합니다. 빌드 시스템을 온프레미스, 클라우드에 호스팅하거나 혼합해서 사용하고자 하는 경우에도 TeamCity는 빌드 작업을 조율하여 효율을 극대화합니다.
TeamCity의 파이프라인 로직은 맞춤 설정할 수 있습니다. 즉, 플랫폼별 테스트와 같은 프로세스를 언제 병렬로 실행할지, 다음 단계로 넘어가기 전에 언제 성공적인 완료를 요구할지 선택할 수 있습니다. 알림도 구성할 수 있어 어디서 작업하든 필요한 정보를 받을 수 있으므로 불필요하게 방해 받을 일이 없습니다. 마지막으로 상세한 결과 덕분에 프로덕션까지 이르는 경로를 명확하게 파악할 수 있습니다.