[Devops] CI/CD 개념

김영한·2020년 12월 3일
2

Devops

목록 보기
1/4

📢 개요

최근 학과에서 알고리즘 대회를 개최했었는데 대회에서 사용한 온라인 저지가 마음에 들지 않아 다음 대회를 위해 새로 개편한다는 소식이 있었다.
나도 그 프로젝트에 참여하게 되었고 내가 맡은 파트는 spring과 테스트 및 배포 자동화 환경을 운영/관리하는 역할이였다.
특히 배포 자동화 환경에 대해서는 꼭 경험해보고 싶은 분야였기 때문에 마침 좋은 기회인 것 같아 계속 포스팅하면서 공부해볼 생각이다.😊

💡 CI/CD의 전체적인 개념

  • 애플리케이션 개발 단계를 자동화하여 보다 짧은 주기로 고객에게 제공하는 방법으로 핵심적인 부분만 말하자면 개발 - 빌드 - 테스트 - 배포까지의 전 과정을 자동화하는 것이 CI/CD이다.
  • 이러한 구축 사례를 일반적으로 CI/CD 파이프라인이라고 부르며 애자일 방식의 협력을 통해 지원한다.
  • 지속적인 통합(Continuous Integration), 지속적인 제공(Continuous Delivery), 지속적인 배포(Continuous Deployment)로 구성된다.

⭐ CI : 지속적 통합

  • 개발을 진행하면서 지속적으로 코드에 대한 통합을 진행하는 것
  • 개발의 편의성이 증가한다.
  • 빌드 및 테스트를 거쳐 공유 레포지터리에 병합된다.
  • 자동화된 테스트에서 기존 코드와 신규 코드 간의 충돌이 발생하면 CI를 통해 빠르게 수정 가능하다.

📍 CI를 하면 좋은 점

  • 중간에 누군가 합류를 해도 빌드가 되는 코드를 받을 수 있다.
    • 혼자서 개발할 때는 잘 체감하지 못하지만 여러 명이서 개발하는 프로젝트라면 매우 중요해진다.
    • 직접 소스코드를 보고 디버깅을 하는 등 생산성이 떨어지게 된다.
  • 항상 좋은 코드 퀄리티를 유지할 수 있다.
    • 항상 테스트 코드를 통과하는 코드만 공유 레포지터리에 올라갈 수 있기 때문

⭐ CD : 지속적인 제공, 지속적인 배포

  1. 지속적인 제공
    • CI를 통해 빌드와 테스트를 진행하고, 이를 통과한 코드에 대해 테스트서버와 운영서버에 자동으로 릴리즈하는 것
    • 항상 배포할 수 있는 준비가 되어있는 소스코드를 자동으로 올라갈 수 있도록 한다.
  2. 지속적인 배포
    • CI/CD 파이프라인의 마지막 단계
    • 지속적인 제공을 거쳐 배포가능한 코드를 프로덕션 레벨로 릴리즈하는 것을 의미한다.

📍 CD를 하면 좋은 점

  • 개발부터 배포까지 간소화되기 때문에 피드백을 빠르게 반영할 수 있다.
    • 장애 대응이 빨라진다.
  • 원클릭으로 빌드, 테스트, 배포를 자동화할 수 있다.(수작업x)
  • 애플리케이션 배포의 위험성을 줄여주므로 변경 사항을 작은 조각으로 세분화하여 더 쉽게 릴리즈 할 수 있다.

프로젝트에서 사용할 툴

  • Jenkins
    • 장점
      • 무료이다.
      • Reference, 사용자가 많고 따라서 정보가 많다.
      • 다양한 플러그인을 제공한다.
      • 파이프라인 구성 자유도가 높다.
    • 단점
      • 직접 설치해서 서버를 운용해야한다.
      • 프로젝트 별 보안 및 권한 설정이 불편하다.

💊 CI/CD의 흐름

  • CI
    1. 자신이 개발한 코드를 Github 등 관리 시스템에 저장한다.
    2. 코드에 변동이 생기면 관리 시스템에서는 CI 툴(Jenkins)로 코드의 변경을 알린다.
    3. CI 툴에서는 변경된 코드를 Bulid, Test, Merge한다. 이 과정이 완료되면 통합 결과를 알린다.
  • CD
    1. CI를 통해 코드를 검증한다.
    2. 배포환경과 유사한 곳(docker)에서 실행시켜본다.
    3. 검증된 소프트웨어를 실제 프로덕션 환경으로 배포한다.

🔔 전체적인 흐름

  1. Github에 소스코드를 푸시하면 Github에서는 Jenkins에게 알려준다.
  2. Jenkins에서 빌드-테스트를 진행하고 검증된 소스코드로 도커 이미지를 만든다.
  3. Jenkins 내부에 설정된 스크립트로 만들어진 도커 이미지를 Docker hub로 푸시한다.
  4. Jenkins에서 프로덕션 서버로 스크립트 실행 명령을 날린다. 해당 스크립트를 받은 운영서버는 Docker hub에서 이미지를 다운로드한 후 애플리케이션을 배포한다.

0개의 댓글