CI/CD

심야·2023년 2월 6일
0

데브옵스

목록 보기
3/13

사용자가 서비스를 사용하려면 아래 과정이 필요하다.

  1. 컴파일
  2. 빌드
  3. 배포

컴파일

컴파일이란 우리가 만든 프로그래밍 언어를 기계가 이해할 수 있는 기계어로 번역하는 것이다. Java, C, Python 등등 언어는 컴퓨터가 이해할 수 없다. 사람이 읽기 편하게 만든 언어를 컴파일러가 컴파일 해 기계가 이해할 수 있는 언어 즉, 0과 1로 번역해준다.

빌드

컴파일이 완료되면 기계어를 사용자에게 보여주기 위한 프로그램을 만들어야 한다. 프로그램으로 가공하기 위한 과정을 빌드라 부른다.

java는 maven, gradle과 같은 빌드 도구를 이용하면 컴파일과 함께 소스코드 파일을 .jar, .war 과 같은 결과물로 변환하는 빌드도 가능하다.

배포

.jar, .war 이런 결과물을 각 서버에서 동작하도록 해 서비스를 사용자에게 공개하는 것이 배포이다.

CI/CD

프로젝트에서 개발, 빌드, 배포 과정은 필수적이다. 개발은 사람이 직접 해야 하지만 빌드와 배포는 컴퓨터가 대신 할 수는 없을까? 아니, 빌드와 배포를 왜 컴퓨터에게 맡기려고 할까?

예를 들어 서비스에 버그 또는 서비스를 위협하는 치명적인 취약점이 발견되었다고 하자.

그럼 개발자는 패치 버전을 개발해 빌드 후 배포할 것이다. 그리고 이 과정에서 패치 버전이 제대로 동작하는지 테스트하고 검증할 것이다. 그런데 이 과정을 사람이 수동으로 빌드하고 테스트, 검증하면 시간이 많이 걸리고 실수할 가능성이 높다. 만약 실수해서 다시 빌드, 테스트, 배포 과정을 거친다면? 엄청난 시간적 손실이 발생한다. 즉, 개발 생산성이 저하된다.

이 반복적인 과정을 더욱 효과적으로 관리하기 위해 CI/CD가 생겨났다.

개념

CI/CD (Continuous Integration/Continuous Delivery)는 자동화하여 애플리케이션을 더욱 짧은 주기로 고객에게 제공하는 방법이다. CI/CD 기본 개념은 지속적인 통합, 지속적인 서비스 제공, 지속적인 배포이다. CI/CD는 애플리케이션 통합 및 테스트 단계에서부터 제공 및 배포에 이르는 애플리케이션 라이프 사이클 전체에 걸쳐 지속적인 자동화와 지속적인 모니터링을 제공한다. 따라서 CI/CD는 새로운 코드 통합으로 인해 개발 및 운영팀에 발생하는 문제를 해결하기 위한 솔루션이다.

지속적인 통합 (Continuous Integration, CI)

현대적인 애플리케이션 개발에서는 여러 개발자들이 동일한 애플리케이션 각각의 다른 기능을 동시에 작업할 수 있도록 하는 것을 목표로 한다. 그러므로 개발자들은 코드 변경사항을 주기적으로 빈번하게 Merge 해야 한다. 그러나 여러 개발자가 코드 변경사항을 오랜 시간이 지난 후 Merge 하면 충돌이 발생할 것이며 충돌을 해결하는데 많은 시간을 할애하게 된다. 따라서 개발자는 최대한 작은 단위로 기능을 나눠 주기적으로 빈번하게 Merge 해야 한다. 그리고 Build, Test, Merge 즉 통합을 위한 단계의 자동화가 진행되어야 한다. 개발자가 애플리케이션에 적용한 변경 사항이 Merge 되면 이러한 변경 사항이 애플리케이션을 손상시키지 않도록자동으로 애플리케이션을 구축하고 각기 다른 레벨의 자동화된 테스트(단위 테스트, 통합 테스트)를 실행 해 변경 사항이 애플리케이션에 제대로 적용되었는지를 확인한다.

CI 장점

주기적으로 자주 병합 과정이 일어나 코드가 충돌될 일이 적다. 따라서 개발 생산성이 향상된다.

자동화된 빌드, 테스트 과정으로 문제점을 빠르게 발견하고 버그 수정이 쉬워진다.

항상 테스트를 통과한 코드만이 레포지토리에 업로드 되어 좋은 코드 퀄리티를 유지할 수 있다.

지속적인 제공 (Continuous Delivery, CD)

지속적인 제공은 소프트웨어가 신뢰할 수 있는 수준에서 배포될 수 있도록 관리하자는 개념이다.

CI의 빌드 자동화, 유닛 및 통합 테스트를 거친 코드는 신뢰할 수 있는 코드로 지속적 제공 프로세스에서 신뢰할 수 있는 코드는 레포지토리에 자동으로 업로드한다.

지속적 제공의 경우, 코드 변경 사항 병합부터 프로덕션에 적합한 빌드 제공에 이르는 모든 단계에는 테스트 자동화와 코드 릴리스 자동화가 포함된다. 이 프로세스를 완료하면 운영팀이 더욱 빠르고 손쉽게 애플리케이션을 프로덕션으로 배포할 수 있게 된다.

지속적인 배포 (Continuous Deployment, CD)

지속적인 배포는 성공적으로 Merge 된 내역을 레포지토리 그리고 사용자가 사용 가능한 프로덕션 환경까지 자동으로 릴리즈하는 것을 의미한다. 이는 애플리케이션 제공 속도를 저해하는 수동 프로세스 때문에 발생하는 운영팀의 프로세스 과부하 문제를 해결할 수 있다.

CI/CD 파이프 라인

파이프 라인 사용 목적은 반복적인 프로세스를 자동화 해 시간을 절약하고 정밀도를 높이는 것이다.

이러한 장점은 CI/CD 인프라와의 호환성과 효율성을 높여주며 최신 버전의 애플리케이션을 업데이트하고 제공하려는 일련의 처리단계를 수행할 수 있다.

CI/CD 파이프라인 구성 요소

  • 빌드(Build) - 애플리케이션을 컴파일하는 단계
  • 테스트(Test) - 코드를 테스트하는 단계. 이 단계를 자동화하여 시간과 수고를 줄일 수 있다.
  • 릴리스(Release) - 애플리케이션을 리포지토리에 제공하는 단계
  • 배포(Deploy) - 코드를 프로덕션에 배포하는 단계
  • 검증 및 컴플라이언스(Validation & compliance) - 빌드 검증 단계는 해당 조직의 필요에 따라
    결정된다. Clair와 같은 이미지 보안 스캔 툴을 사용하여 알려진 취약점(CVE)과 비교하는 방법으로 이미지의 품질을 보장할 수 있다.

출처

https://tecoble.techcourse.co.kr/post/2021-08-14-ci-cd/
https://www.redhat.com/ko/topics/devops/what-cicd-pipeline
https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-CI-CD-%ED%8C%8C%EC%9D%B4%ED%94%84-%EB%9D%BC%EC%9D%B8-%EC%9D%B4%EB%9E%80
https://www.redhat.com/ko/topics/devops/what-is-ci-cd
https://itholic.github.io/qa/
https://www.youtube.com/watch?v=0Emq5FypiMM&list=WL&index=9

profile
하루하루 성실하게, 인생 전체는 되는대로.

0개의 댓글