[백엔드 기술면접] CI/CD 개념정리
CI/CD
유튜브 드림코딩님꺼 보고 정리했습니다.
서론
CI/CD란 간단하게 말해서 어플리케이션 개발 단계부터 배포 때까지 이 모든 단계들을 자동화를 통해서 조금 더
효율적이고 빠르게 사용자에게 빈번이 배포할 수 있도록 만드는 것을 말합니다.
CI(Continuous Integration)이고 지속적 통합이라는 말이고 CD(continuous Delivery)이며 지속적 제공의 약자
라는 말이고 또 Continuos Deployment, 배포라고 사용하는 경우도 있습니다.
본론
CI(Continuous Integration) 지속적 통합에 대해서
CI(Continuous Integration) 지속적 통합은 버그 수정이나 새로운 기능이 추가 될 때마다 메인 레포지토리에
주기적으로 빌드되고 테스트가 되어 merge 되는 과정을 말합니다.
CI같은 경우 2가지 포인트를 잡고 가자.
- 개발자들이 코드 변경사항을 주기적으로 빈번하게 머지해야 한다.
- 두 명의 개발자가 서로 다른 기능을 개발하고 있다가 오랜 기간 머지를 하지 않고 있다가 나중에 머지
하려는 경우 서로 다른 코드를 어떻게 통합해서 적용할지, 즉 머지 충돌 해결하는 과정이 더 많은 시간을 투자하게 된다. - 최대한 작은 단위로 개발해서 통합하는 과정이 필요하다.
- 두 명의 개발자가 서로 다른 기능을 개발하고 있다가 오랜 기간 머지를 하지 않고 있다가 나중에 머지
- 통합을 위한 단계(빌드, 테스트,머지)의 자동화
- 개발자들은 하루에도 몇 번씩 메인 레포에 머지를 하는데 그전에 코드 리뷰를 통해서 코드가 적절한지 확인을 받고 머지를 한다. 이렇게 머지가 되었으면 팀에서 만든 자동으로 CI script를 통해서 추가된 코드와 함께 이 레포가 빌드가 되고 팀에서 작성한 unit test, integration test 등 여러가지 테스트도 script를 통해서 실행이 되어야 한다. 이렇게 빌드와 테스트가 잘 되었으면 green이라는 초록색 체크가 되면서 배포할 때 반영이 된다.
- 만약 빌드나 테스트 중 실패하게 되면 빨간색 레드 사인이 나오면서 문제를 일으킨 개발자에게 알람이 간다.
이렇게 CI를 사용하면 어떤 장점이 있을까?
- 주기적으로 머지를 하기 때문에 머지 충돌을 피할 수 있어 개발의 생산성이 향상 됩니다.
- 머지되는 코드들은 자동으로 배포되고 테스트 되기 때문에 코드의 결함이나 문제점을 빠르게 발견할 수 있다.
- 이렇게 발견된 결함은 빠르게 수정할 수 있다. 왜냐하면 주기적으로 머지를 하기 위해서 코드의 변경사항이 작기 때문에 문제를 수정할 때도 조금 더 고립된 작은 단위에 문제를 확인 할 수 있기 때문이다.
- 마지막 장점은 이런 과정들을 통해서 조금 더 나은 코드의 퀄리티를 가질 수 있다. 왜냐하면 이렇게 CI를 잘 운영하기 위해서는 모든 개발자들이 자신이 새로 작성하는 코드를 unit test를 꼭 포함해야하기 때문이다. 그래서 CI를 사용한다면 우리 프로젝트에 대부분에 소스 코드들이 자동으로 테스트가 될 수 있도록 만들기 때문에 조금 더 안정성 있는 개발을 할 수가 있다.
CD(Continuous Delivery) 지속적 제공 or (Continuous Deployment) 지속적 배포에 대해서
CI를 통해서 자동으로 빌드되고 테스트가 되었으면 배포하는 과정에서 Prepare Release 과정을 거치 준비된 릴리즈가 정상인지 아무런 문제가 없는지 직접 개발자나 검증팀이 검증 후 최종적으로 사용자에게 배포해도 되겠다라고 결정이 되면 수동으로 배포하는 단계를 Continuous Delivery라고 합니다.
또는 릴리즈가 준비가 되자마자 자동으로 사용자에게 배포할 수 있도록 만들 수 있는데 이렇게 모든 과정을 자동화 하는 것을 Continuous Deployment라고 합니다.
둘 다 비슷해보이지만 최종 단계에서 자동으로 되었는지 수동으로 되었는지 따라 다르다. 이 때 회사마다 최종단계부분이 다르기 때문에 모든 회사가 CI/CD를 쓴다고 해서 프로세스가 같은 것은 아닙니다.
결론
CI와 CD가 완벽히 분리된 것이 아니라 대부분 회사에서 CI와 CD를 거쳐서 배포를 진행하기 때문에 CI/CD 묶어서 부릅니다.
개발자가 작은 단위로 나뉘어서 주기적으로 메인 레포지토리에 머지를 진행하면 자동으로 빌드를 하고 테스트 과정을 거쳐서 릴리즈 준비를 하고 여기서 수동적으로 또는 자동으로 최종 배포를 거치게 됩니다.
CI/CD를 위한 툴들 소개
- JenKins의 Buildkite
- GitHub Actions
- GitLab CI/CD
- Bitbucket Pipelines
- circleci