CI/CD에 대하여 - Part 1. CI 지속적 통합
지속적 통합은 기존에 있던 기능과 새로운 기능의 통합을 의미한다.
(CI tool: CI를 자동화 해주는 소프트웨어)
테스트를 통해 결함과 버그를 조기에 발견 할 수 있으며, 이는 개발자의 생산성을 향상할 수 있습니다.
제품의 결함과 버그를 발견하고 수정하는 것은 소프트웨어의 품질을 보증하고, 더 안정적이고 사용하기 쉽게 만듭니다.
소프트웨어 개발 분야의 설계 및 개발 방법론에 있어서 저명한 마틴 파울러는 지속적 통합에 대해 다음과 같이 정의합니다.
팀 구성원이 각자의 작업을 자주 통합하는 소프트웨어 개발 방식
- Martin Fowler
프로젝트에서 제품을 빌드하기 위해 함께 조정해야 하는 수많은 파일이 포함되어 있기 때문입니다.
이 모든 파일이 단일 소스 레파지토리가 아닌 곳에 뿔뿔이 흩어져 있다면 추적하는 것이 굉장히 힘들어질 것입니다.
사람들에게 이상한 명령을 입력하게 하거나 대화 상자를 클릭하게 하는 것은 시간 낭비입니다.
빌드가 수동으로 진행된다면, 수 많은 실수를 낳을 수 있습니다.
빌드 프로세스에 자동화된 테스트를 포함 함으로써 버그를 더 빠르고 효율적으로 파악할 수 있습니다.
지속적 통합의 일부인 테스트 주도 개발(TDD)을 통해 손상된 빌드를 즉시 확인, 수정할 수 있습니다.
메인라인: 시스템의 현재 상태를 의미하며 회사마다 어떤 브랜치를 메인라인으로 두는지는 조금씩 다르지만, 여기서는 master 브랜치를 메인라인으로 취급하도록 하겠습니다.
각자의 진행 상황을 추적하는 데 도움이 됩니다.
짧은 주기로 커밋을 하므로, 충돌이 발생한 후 빠르게 충돌 상황을 감지할 수 있습니다.
위에서 언급한 원칙 외에도, 그 밖에 Martin Fowler가 제시한 나머지 원칙도 함께 소개합니다.
빌드가 중단되는 것이 나쁜 것은 아니지만, 이러한 상황이 매번 항상 발생하는 경우 사람들이 커밋 전에 로컬에서 업데이트 및 빌드에 대해 충분히 주의하지 않고 있음을 시사합니다.
지속적 통합 도구를 사용하면 빌드의 오류를 즉시 확인 할 수 있습니다.
지속적 통합의 요점은 신속한 피드백을 제공하는 것입니다.
오랜 시간이 걸리는 빌드는 지속적 통합의 가장 큰 장애물입니다.
다른 환경에서 테스트하는 경우 환경의차이로 인해 테스트에서 발생하는 일이 프로덕션에서 발생하지 않을 위험이 있습니다.
누구나 최신 실행 파일을 쉽게 얻을 수 있어야 합니다.
지속적 통합을 수행하려면 커밋 테스트를 실행하기 위한 환경과 2차 테스트를 실행하기 위한 하나 이상의 환경이 필요합니다. 이러한 환경 간에 실행 파일을 하루에 여러 번 이동하기 때문에 이 작업을 자동으로 수행하고 싶을 것입니다. 따라서 응용 프로그램을 모든 환경에 쉽게 배포할 수 있는 스크립트를 갖는 것이 중요합니다.
매일 프로덕션에 배포하지 않을 수도 있지만, 자동 배포는 프로세스 속도를 높이고 오류를 줄이는 데 도움이 됩니다. 또한 테스트 환경에 배포하는 데 사용하는 것과 동일한 기능을 사용하기 때문에 저렴한 옵션이 될 수 있습니다.
지속적 통합이 있기 전에는 어떻게 릴리즈를 만들었을까요?
지속적 통합을 도입함으로써 기존 개발 방식의 어떠한 문제를 해결해주었을까요?
언젠가는 저장소가 개발자들의 베이스라인과는 너무 많이 달라지게 되는 "통합의 지옥"이라 불리는 상황에 빠지게 된다. 이 경우, 작업하는 시간보다 작업 내용을 통합하는데 소요되는 시간이 더 증가하게 되어, 최악의 경우 개발자들이 자신들의 변경 내용들을 취소하고 작업들을 완전히 처음부터 다시하는 것이 나을 수도 있다.
지속적인 통합은 "통합의 지옥"의 함정을 피하는 것을 내포하며 재작업에 들어가는 비용과 시간을 줄이는데 초점이 맞추어져 있다.