CS

CI & CD란 (Jenkins, Gitlab CI/CD, Travis)

🤖 Play with Android 🤖 2021. 10. 19. 19:20
728x90

 

 

CI / CD에 대해 알아보기 전에 우선 DevOps라는 것을 알아야 한다.

 

 

📌  DevOps란?

DevOps는 소프트웨어 개발 및 IT 운영을 포함하는 소프트웨어 개발 방법론으로, 지속적인 개발, 지속적인 빌드, 지속적인 테스트, 지속적인 통합, 지속적인 제공 및 엔드-투-엔드 소프트웨어 개발 전반에 걸친 지속적인 모니터링을 포함하는 용어이다.

 

 

이 중에서 지속적인 통합, 지속적인 배포가 있는데 이를 CI/CD라 칭한다.

  • CI(Continuous Integration) : 지속적인 통합
  • CD(Continuous Delivery) : 지속적인 배포

 

 

CI/CI를 쉽게 설명하면, 자동으로 여러 시스템이 통합이 되고 배포가 된다라는 뜻이다.

그럼 무엇이 통합이 되고 배포가 어떤 식으로 된다는 것일까?

 

 

 

 

CI/CD의 사용 예시

 

📌 CI (Continuous Integration)

모든 개발이 끝난 이후에 코드 품질을 관리하는 고전적 방식의 단점을 해소하기 위해 나타난 개념이다.

말 그대로 개발을 하면서 ‘코드에 대한 통합’을 ‘지속적’으로 또한 '자동'으로 진행함으로써 품질을 유지하자는 것이다.

 

 

 

예를 들어

수십 명의 개발자가 참여하는 프로젝트가 있다고 가정해보자.

기획을 통해 기본적인 틀을 잡고, 각 개발자가 자신의 로컬 환경에 작업을 시작한다.

그런데 개발이 끝날때까지 모든 개발자가 한 번도 중앙 저장소에 코드를 올리지 않은 상태에서,

개발이 끝난 이후에 수십 명의 개발자의 코드를 한 번에 통합해야하는 상황이 온다면 일이 상당히 복잡해질 것이다.

 

 

 

그렇다면 지속적 통합을 이루기 위해서는 어떻게 해야할까?

이러한 규칙을 정하면 된다.

  1. 모든 개발자는 퇴근하기 전에 자신의 코드를 중앙 코드와 통합한다.
  2. 통합된 코드에서 본인의 코드가 제대로 동작하는지 테스트한다.
  3. 통합된 코드가 제대로 빌드되는지 테스트한다.
  4. 결과를 정리하고. 버그가 있다면 다음날 업무 목록에 적어둔다.

 

 

하지만 매일 이러한 규칙을 수행한다는 것이 번거로울 수 있다.

그래서 나온 개념이 '자동화'이다.

 

 

 CI 자동화가 잘 이루어졌을 때, 위의 규칙이 얼마나 단순화되는지 확인해보자

  1. 모든 개발자는 퇴근하기 전에 자신의 코드를 중앙 코드와 통합한다.
  2. 다음날 출근 시 메일로 발송된 결과 리포트를 확인하고 버그가 있으면 수정한다.

 

첫 번째 예시의 문제(마지막에 수십 명의 코드를 한 번에 통합할 때의 문제)의 해결함과 동시에 매일 개인이 일일이 코드를 테스트하는 시간도 단축될 것이다.

 

 

 

 

 

 

📌  CD

CD란 지속적 배포(Continuous Delivery)로써,

소프트웨어가 항상 신뢰 가능한 수준에서 배포될 수 있도록 지속적으로 관리하자는 개념이다.

CI의 연장선으로, 배포 이전에 테스트와 빌드는 필수적이기 때문에 사실상 CD가 되려면 항상 CI가 선행되어야 한다.

즉, CI 프로세스를 통해 개발 중에 지속적으로 빌드와 테스트를 진행하고, 이를 통과한 코드에 대하여 테스트 서버와 운영서버에 곧바로 그 내용을 배포해 반영하는 것이다.

이상적인 환경이라면 테스트와 빌드가 ‘지속적’으로 또한 '자동' 이루어지기 때문에, 배포 또한 자연스럽게 ‘지속적’으며 '자동' 이루어지게 된다.

 

 

 

 

 


 

 

🛠  CI/CD Tool

현재에는 Jenkins, Gitlab CI/CD, Travis와 같이, CI/CD 자동화를 쉽게 구현할 수 있도록 도와주는 Tool들이 존재한다.

CI/CD Tool 들에 대해 알아보고 장단점을 분석해보자.

 

 

 

 

📗  Jenkins

 

 

 

Jenkins는 Java로 작성된 CI 서버의 오픈 소스 구현으로, 프로젝트의 빌드 주기를 자동화하는 자체 호스팅 옵션으로 사용할 수 있다. 모든 프로그래밍 언어 및 Windows, Linux 및 macOS를 포함한 여러 플랫폼에서 작동한다.

Jenkins의 주요 이점 중 하나는 많은 커뮤니티 지원을 제공하는 잘 알려진 도구이며 사용 가능한 많은 플러그인 (Slack, GitHub, Docker, Build Pipeline 등)을 포함하여 많은 플러그인이 있으며 대규모 개발자 커뮤니티에서 잘 관리하고 있다.

 

 

장점

  • 무료
  • 다양한 IDE를 지원하며, 커스터마이징이 다양하다.
  • 많은 사용자들을 보유하고 있고, 관련 문서가 다양하다.
  • 호스팅을 직접 해야 하기 때문에 관련된 모든 부분을 관리할 수 있다.

단점

  • 플러그인 매우 많은 것이 오히려 복잡하여 단점이 될 수도 있다.
  • 규모가 작은 프로젝트의 경우, 설정하는데 리소스 낭비가 발생할 수 있다.
  • 호스팅을 직접해야하기 때문에 서버 운영 및 관리 비용이 발생한다.

 

 

 

 

 

 

📙  Gitlab CI/CD

 

 

 

Gitlab은 on-premise git을 제공하는 업체이다. Gitlab은 Commit / Merge/ Release 등의 이벤트가 발생하는 것을 감지하고 이로부터 CI/CD 파이프라인이 동작할 수 있는 환경을 제공한다.

Gitlab Runner라고 하는 서비스를 제공하여 CI/CD 파이프라인을 실행한다. Gitlab Runner는 이벤트가 발생 시, 사전에 등록되어 있는 파이프라인 설정을 참고하여 CI/CD를 동작시키게 된다.

 

장점

  • GitLab과의 손쉬운 연동이 가능하다.
  • Runner가 Docker 컨테이너 기반이라, Docker 친화적이다.
  • UI가 비교적 쉽고 간편하다.
  • 모든 job이 독립적이다.

단점

  • Jenkins에 비해 플러그인의 종류가 적다.
  • 모든 job에 대해 artifact를 정의 및 업로드/다운로드를 해야 한다.

 

 

 

 

 

 

📘  Travis 

 

 

 

Travis는 테스트를 위한 인기 있는 오픈 소스 도구이다. 개발자 또는 테스터는 Travis를 GitHub와 쉽게 동기화하고 테스트를 수행할 수 있다. 모든 규모의 프로젝트에 대해 각 유형의 개인 저장소 계획이 있다. 또한 Travis는 Linux, Mac 또는 iOS와 같은 많은 언어와 플랫폼을 지원한다.

Travis에서 사용자는 테스트 중에 모든 것을 볼 수 있다. 또한 훌륭한 API 및 명령 줄 도구를 사용하여 병렬 테스트 실행을 수행한다.

 

장점

  • GitHub와의 연동된다.(GitHub가 인수하였다.)
  • YML 파일을 통한 쉬운 설정이 가능하다.
  • 다양한 래퍼런스가 존재한다.
  • 직접 서버를 운영할 필요 없이, Travis에서 알아서 VM으로 호스팅해 줌
  • 모든 job이 독립적이다.(서로 간의 영향을 받지 않음)

단점

  • Jenkins에 비해 플러그인의 종류가 적다.
  • 유료 서비스를 사용할 경우, 가격이 꽤 비싸다

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Reference:

https://owin2828.github.io/devlog/2020/01/09/cicd-1.html

https://choseongho93.tistory.com/295

https://jjeongil.tistory.com/810

https://box0830.tistory.com/297

https://www.wallarm.com/what/what-is-ci-cd-concept-how-can-it-work