prometedor 2023. 9. 29. 20:00

CI/CD 란?

- 어플리케이션 개발 단계부터 배포때까지 이 모든 단계들을 자동화를 통해서 조금 더 효율적이고 빠르게 사용자에게 빈번히 배포할 수 있도록 만드는 것

 

CI => Continuous Integration : 지속적인 통합

CD => Continuous Delivery : 지속적인 제공 / Continuous Deployment : 지속적인 배포

 

CI (Continuous Integration)

- 버그 수정이나 새로 만든 기능들이 매일 repository 에 주기적으로 빌드되고 테스트 되어서 merge 되는 것을 말함

- 코드 변경 사항을 주기적으로 빈번하게 merge 해야 함

1. 동일한 소스파일 위에서 두 명의 개발자가 서로 다른 코드를 오랜 기간 변경을 하다가 나중에 merge 를 하려고 하면 어려움을 겪을 수 있음

=> 새로운 기능을 추가하는 시간 보다 merge 충돌을 해결하기 위해서 시간을 더 많이 쓰게 될 수 있음

      ㄴ 최대한 작은 단위로 나누어서 개발하고 통합하는 것이 중요함

2. 주기적으로 merge 된 코드의 변경사항이 자동으로 빌드가 되어서 코드 변경사항 이후에도 빌드가 성공적으로 되는지 확인이 되어야 하며, 새로 추가된 코드의 변경사항 뿐만 아니라 기존의 시스템에 다른 버그를 처리하지는 않았는지 자동으로 테스트까지 되어야 함

3. main repository 가 있고, 개발자들은 하루에도 몇 번씩 주기적으로 코드의 변경사항을 main repository 에 merge 를 함

- 코드 리뷰를 통해 코드가 적절하게 작성되었는지 확인을 해야 함

- 이렇게 merge 가 되었으면, 자동으로 팀에서 만든 CI 스크립트를 통해서 추가된 코드와 함께 이 repository 가 build 가 되고, build 가 잘 된다면 팀에서 작성한 unit test, Integration test 등 여러가지 테스트들도 스크립트를 통해서 실행이 됨

- build 및 test 가 정상적으로 이루어지면 나중에 배포할 때 반영이 될 수 있음

- 새로 추가한 코드에 문제가 있어 build 에 실패하거나 build 는 성공했는데 test 에서 실패한다면 문제를 일으킨 개발자에게 자동으로 알려줌

 

CI 장점

- 주기적으로 merge 를 하기 때문에 merge 충돌을 피할 수 있어 개발의 생산성을 더 높일 수 있음

- merge 되는 모든 코드들은 자동으로 build 되고 test 되기 때문에 코드의 결함이나 문제점이 빠르게 발견될 수 있다는 장점이 있음

   => 그러므로 버그 수정이 용이함

- 결국 이를 통해 조금 더 나은 코드 퀄리티를 가질 수 있음

 

 

CD (Continuous Delivery / Continuous Deployment)

- 어떻게 하면 자동화해서 배포를 만들 수 있을 지를 고민하는 단계

- CI 를 통해서 주기적으로 merge 된 코드의 변경사항들이 자동으로 build 가 되고 test 가 되었다면 배포하는 단계에서 배포할 즉, release 할 준비 과정을 거치고, 여기서 준비된 release 가 정상적인지 문제가 없는지 직접 개발자 혹은 검증 팀이 검증 후 최종적으로 사용자에게 배포해도 되겠다고 결정이 되면 수동적으로 배포하는 단계를 Continuous Delivery 라고 함

- release 가 준비가 되자마자 자동으로 사용자에게 배포하도록 만들 수도 있는데, 이렇게 모든 과정을 자동화 해놓는 것을 Continuous Deployment 라고 함

- 최종 단계가 자동화가 되었는지 아닌지에 따라 Continuous Delivery, Continuous Deployment 로 구분 됨

 

 

 

모든 회사 혹은 팀이 같은 프로세스를 거치는 것은 아님!

 

CI 와 CD 가 완벽히 분리된 것이 아니라 대부분의 회사에서 CI 와 CD 를 거쳐서 배포를 하기 때문에 CI/CD 를 묶어서 부르곤 함

 

=> 개발자가 작은 단위로 기능을 나누어서 주기적으로 main repository 에 merge 를 하면 자동으로 build 를 하고 test 과정을 거쳐서 release 준비를 하고, 여기서 수동적으로 또는 자동으로 최종 배포를 거치게 됨

 

 

CI/CD 를 위한 다양한 툴

- Jenkins, Buildkite

- GitHub Actions

- GitLab CI/CD

- Bitbucket PipeLines

- circleci