본문 바로가기
Backend/DevOps

CI/CD 란?

by eyi-jin 2023. 7. 12.

개발자들은 어떻게 하면 더 좋은 코드를 만들어낼 수 있을지에 대해서 고민한다.

그리고 개발하는 과정에서는 localhost를 이용해서 개발자만 서비스를 이용할 수 있다.

그러나 우리가 궁극적으로 하고 싶은 것은 사용자에게 우리가 만든 서비스를 결과물로 보여주는 것이다.

어떻게 하면 사용자에게 우리의 서비스를 제공할 수 있을까?

1. 컴파일

첫번째로 우리가 만든 코드를 컴파일 한다.

컴파일이란 우리가 만든 프로그래밍 언어를 기계가 이해할 수 있는 기계어로 번역하는 것이다.

우리가 서비스 제작을 위해서 사용한 java, c++과 같은 프로그래밍 언어는 기계가 이해할 수 없다. 이렇게 개발자의 편의를 위해 작성된 프로그래밍 언어를 컴파일러가 컴파일 해서 기계가 이해할 수 있는 기계어로 번역한다.

2. 빌드

다음은 컴파일된 기계어를 사용자에게 보여주기 위해 빌드하여 완성된 상품, 소프트웨어 산출물로 만든다.

java에서는 maven, gradle과 같은 빌드 도구를 이용하면 컴파일과 함께 소스코드 파일을 .jar, .war 와 같은 산출물로 변환하는 빌드를 할 수 있다.

3. 배포

이렇게 만들어진 산출물을 각각의 서버에서 동작하도록 하여 서비스를 사용자들에게 공개하는 것이 배포이다.

최종적으로 만들어진 서비스를 배포해서 사용자에게 사용하게 하는 것이 우리의 목적이자 개발을 하는 이유가 되는 것이다.

프로젝트를 개발하고 배포를 진행할 때 많은 이들이 CI/CD에 대해 언급하곤 한다. 이 때 말하는 CI/CD란 무엇이고 왜 적용해야할까?

CI/CD

기존 프로젝트에서 사용자에게 추가적인 기능을 제공하기 위해, 기존 코드새로운 코드합쳐야하는 상황을 가정해보자.

만약 통합하는 과정에서 장애가 난다면 개발, 운영팀은 난리가 날 것이다. 코드를 수정하고, 다시 컴파일, 빌드, 배포하는 과정을 통해 수정된 코드가 제대로 동작하는지 테스트하고 검증도 해야한다. 이 과정들은 시간도 많이 걸리고 휴먼 에러가 발생하기도 쉽다.

수정된 코드에 문제가 다시 생기면 또 다시 과정을 반복(통합 지옥)해야한다. 이런 문제를 해결하기 위해서 CI/CD가 생겨났다.

CI (Continuous Integration)

CI는 지속적 통합이라는 뜻으로, 개발을 진행하면서도 품질을 관리할 수 있도록 하는 것이다. 여러 명이 하나의 코드에 대해서 수정을 진행하면서 서로 충돌하는 문제를 CI로 해결할 수 있음을 의미한다.

먼저 소개하자면 CI의 간단한 순서는 아래와 같다.

  1. 개발자가 구현한 코드를 기존 코드와 합친다.
  2. 합쳐진 코드가 올바르게 동작하고 빌드되는지 확인한다.
  3. 빌드 이후 테스트를 진행하고,문제가 있다면 수정하고 다시 1로 돌아간다.
  4. 문제가 없으면, 코드가 비로소 병합된다.

CI가 나오기 전의 병합은 특정한 날(merge day)을 정해서 한꺼번에 코드를 합쳤다. 그래서 소스코드가 충돌하지 않도록 수작업으로 진행됐는데, 알다시피 수작업은 시간이 많이 들게 된다.

CI를 적용하면 각자의 개발자가 자신의 구현해야 할 기능을 구현하면 된다. 이후 완성이 되면 master 브랜치와 통합하고 코드가 잘 빌드되는지 보고, 올바르게 동작하는지 테스트하며 코드에 버그가 있다면 해결한다.

이를 자동화하면 개발자가 빌드와 테스트를 직접 하지 않고도 수정한 코드를 브랜치에 병합하기만 하면 자동으로 빌드와 테스트를 진행할 수 있다.

개발자가 단위별로 구현한 부분을 병합할 때마다 자동화된 빌드와 테스트가 트리거되어 실행된다. 결과를 통해 우리는 어떤 부분에서 문제가 있는지 배포 전에 확인할 수 있고, 문제를 빠르고 정확하게 해결할 수 있다.

CD(Continuous Deployment)

이제 지속적 통합을 거친 우리의 코드는신뢰할 수 있고 바로 배포할 준비가 되었다.

CD는 지속적 배포로 소프트웨어가 항상 신뢰 가능한 수준에서 배포될 수 있도록 관리하자는 개념으로 지속적 제공(Continuous Delivery)과 혼용되기도 한다.

지속적 제공은 CI를 통해서 새로운 소스코드(변경사항)가 빌드와 테스트를 거쳐 github과 같은 저장소에 자동으로 업로드되는 것을 의미한다.

지속적 배포는 이렇게 성공적으로 병합된 내역을 저장소뿐만 아니라 사용자가 사용할 수 있는 릴리즈를 자동화 하는 것을 의미한다. 예를 들자면, 우리가 코드를 수정한 후 몇분 이내에 사용자들에게 그 수정 사항을 적용되는 것이다. (물론 지속적 배포가 제대로 이루어지려면, 테스트 자동화가 제대로 설계되어야 한다.)

아래의 그림에서 한눈에 CI/CD과정을 살펴볼 수 있다.

CI/CD 툴 및 구축

CI/CD 툴에서는 통합(CI) 측면을 다루는 툴도 있고, 개발 및 배포(CD)를 관리하는 툴도 있으며, 지속적인 테스트 또는 관련 기능에 특화된 툴도 있다.

대표적인 CI/CD 툴로는 Travis와 Jenkins가 있다.

또한, 다양한 벤더가 제공하는 관리형 CI/CD 툴도 있다. 주요 퍼블릭 클라우드 공급업체는 모두 GitLab, CircleCI, Travis CI, Atlassian Bamboo 등과 함께 CI/CD 솔루션을 제공한다.

뿐만 아니라 DevOps의 기본 툴은 CI/CD 프로세스에 속해 있는 경우가 많다. 구성 자동화(예: Ansible, Chef, Puppet), 컨테이너 런타임(예: Docker, rkt, cri-o), 컨테이너 오케스트레이션(쿠버네티스)을 위한 툴은 엄밀하게는 CI/CD 툴이 아니지만 많은 CI/CD 워크플로우에 표시된다.

참고

https://www.redhat.com/ko/topics/devops/what-is-ci-cd

아리송한 IT 용어/은어 사전 : 오크, 데브옵스, 통합지옥, 슈도코드

댓글