지속적 통합 및 지속적 배포 (CI/CD)

CI(Continuous Integration)와 CD(Continuous Delivery)의 개념과 필요성 이해

Featured image

현대 개발 환경에서 가장 Trendy하게 언급되는 개발 방법론이 애자일(Agile) 개발 방법론이다. 애자일 개발 방법론은 비효율적이고 일정 예측이 힘든 무계획적인 개발과, 변경에 느리고 계획 시간에 대한 비용이 많이 드는 계획이 너무 많은 개발(대다수의 고전적 개발 방법들) 사이의 타협점을 잡기 위해 나왔다. 애자일 개발 방법론의 핵심은 개발을 위한 전체 계획을 다 세우고 가는 방식이 아닌, 일정 주기를 가지고 끊임없이 제품 배포버전을 만들어내며 그때마다 요구사항을 추가하거나 수정해나가는 점진적인 방식으로 개발 프로세스를 가져간다는 점이다.

Compare agile with waterfall

이런 과정에서 반복적으로 일어나는 작업을 줄이고 개발자의 실수로 인한 장애를 피함으로써, 전체적인 개발 시간과 비용을 줄이기 위한 방법으로 지속적 통합지속적 배포라는 접근법이 사용되고 있다.

지속적 통합 (Continuous Integration, CI)

지속적 통합 (CI)이란, 개발의 초기에 작은 작업단위로 자주 통합해서 코드의 품질을 지속적으로 관리를 하기 위한 접근법이다.

개발자가 개발업무를 하기 위해서는 아래와 같은 과정을 거쳐야 한다.

  1. 원격 저장소에서 프로젝트 작업 코드를 자신의 작업 공간으로 내려받는다.
  2. 자신의 작업공간의 코드를 수정한다.
  3. 자신의 작업공간의 코드를 원격 저장소로 제출한다.

자신의 작업을 원격 저장소로 제출하기 전에 항상 저장소의 코드를 자신의 작업공간에 업데이트를 하고, 충돌이 나는 사항이 있다면 주의 깊게 소스 코드를 통합하는 작업을 수행 하여야 원격 저장소에 안정적인 버전의 코드를 유지 할 수가 있다. 그런데 제출해야 하는 자신의 작업량이 너무 많거나, 저장소의 변경 내용이 너무 많이서 자신이 베이스로 했던 코드와 너무 다른 경우 통합하는 시간이 작업 시간보다 오히려 더 길어지는 통합 지옥(integration hell)에 빠질수도 있다. 또한 대규모 통합 작업 이후에 각각의 개발자들은 코드 통합 후 저장소 코드의 안정성 보장을 위해서, 제출을 하기 전에 자신의 코드가 잘 빌드가 되는지 확인하고 자신의 작업 추가로 인한 문제가 없는지 완벽히 테스트를 수행해야 한다. 통합 지옥에 빠지지 않고 자신의 작업을 저장소로 제출하기 위해서는 더 작은단위로 작업을 쪼개서 자주 통합을 해주어야 한다. CI는 이러한 통합, 빌드테스트의 작업량을 줄여서 전체 개발 비용과 시간을 줄이는 것에 촛점을 맞추고 있다.

지속적 배포 (Continuous Delivery, CD)

지속적 배포 (CD)란, 지속적인 통합과 마찬가지로 짧은 주기로 소프트웨어를 개발하고, 신뢰할 수 있는 수준의 버전을 준비하여 언제든 안정적인 버전의 업데이트를 출시 할 수 있도록 하는 것을 목표로 하는 접근법이다. 지속적 배포를 적용하면 고객들에게 업데이트를 더 빠르게 작은 단위로 제공하여 신속하게 피드백을 받고 작은 scope로 대응 할 수 있다.

Continuous Delevery process

자동화 도구

CI/CD가 개발 프로세스에 자리를 잡으면서 더 빈번하게 발생하게 된 반복된 과정들이 생겨났고, 이를 도와주기 위한 많은 도구들이 생겨났다. 가장 대표적으로 Jenkins가 있으며, 그 밖에도 다양한 도구들이 존재한다. 이제는 원격 Git 저장소에서도 자체적으로 CI/CD 기능을 built-in 으로 내장하고 있다. 이러한 도구들은 반복된 과정의 작업들을 자동화 해주어서 개발자가 개발에만 집중하고, 통합 및 배포에 시간을 뺐기지 않도록 도와준다. 더 다양한 도구들은 여기서 확인할 수 있다.

CI/CD automation tools