🕋

CI/CD 구성도

Created
Jul 23, 2022 10:51 AM
Tags
설계
notion image
notion image
  • 컨테이너(도커)를 사용한 이유
    • 컨테이너를 사용하여 구성한 환경을 이미지화 시켜서 항상 같은 환경으로 애플리케이션이 돌아가게 할 수 있습니다. 이로 인해 애플리케이션 환경을 구축할때 같은 과정을 반복하지 않고 해당 환경으로 일괄적으로 배포할 수 있다는 장점이 있습니다. 또한 컨테이너가 내려갈 경우 자동으로 재시작하게 만들어 가용성적인 측면에서도 뛰어난 환경을 만들 수 있다는 점에서 채택하게 되었습니다.
  • 스프링 애플리케이션이 두 개 존재하는 이유
    • 프론트와의 이슈중에 프론트가 작업중에 배포중에 서버가 내려가면서 502에러가 발생하는 상황이 계속해서 발생하였고 이런 상황을 막기 위해 무중단 배포를 사용하여 현재 무중단 배포를 위해 블루-그린 배포 방법을 사용하여 하나를 active, 다른 하나를 standby 상태로 두어 배포중에 서비스가 중단되는 상황을 막기 위해서 두개가 존재하며, 실제 서비스 중에는 하나의 애플리케이션으로 동작하고 있습니다.
    • nginx를 사용한 이유
      • 현재 무중단 배포를 사용하기 때문에 어떤 애플리케이션에 요청을 보낼지 계속해서 바뀌는 상황이 발생하고 현재 띄워져 있는 애플리케이션에 요청을 보내기 위해서 리버스 프록시 역할을 하는 nginx를 사용했습니다.
  • github actions를 사용한 이유
    • 서버에 배포하기 전에 미리 빌드를 해보고, 문제 없이 빌드가 되는지 확인하고 빌드된 파일을 컨테이너 이미지로 만들어 도커허브에 업로드하는 용도로 사용했습니다. 문법이 간단하고 레포지터리에서 바로 확인할 수 있다는점과 github actions를 사용하면 github에서 CI가 돌아가는 컨테이너를 무료로 제공해주기 때문에 추가적으로 비용을 쓰지 않아도 된다는 점에서 채택하게 되었습니다.
  • jenkins를 사용한 이유
    • CI가 성공적으로 수행되어 빌드가 완료되면 운영서버에 자동으로 배포하기 위해 완료시점에 젠킨스에게 요청을 보내 서버에 배포스크립트를 실행하는 역할을 하기 위해 젠킨스를 사용했습니다.
  • 사용자 시나리오
      1. 사용자는 서비스를 요청하기 위해 서버 URL을 DNS에 질의합니다.
      1. DNS는 freenom에 등록한 checkmoi.ga의 IP주소를 반환합니다.
      1. 사용자는 전달받은 IP를 가지고 http 또는 https로 서비스를 요청합니다(80포트, 443포트)
          • 여기서 http로 요청을 보낼경우 자동으로 https로 리다이렉션 해준다.
      1. nginx는 현재 올라와있는 서버에 요청을 전달합니다.
      1. 서버는 요청을 받아 처리하고 다시 nginx에게 전달합니다.
      1. nginx는 사용자에게 응답을 전달합니다.
  • 개발자 시나리오
      1. 작성한 코드를 github 레포지터리에 push 합니다.
      1. 개발자는 해당 코드를 develop 브랜치에 PR을 합니다.
      1. github actions workflows 파일에 정의한 작업을 수행합니다.
          • 작성한 테스트 코드 실행
          • 자코코로 테스트 커버리지 측정
          • 소나큐브를 통한 코드 정적 분석
      1. 코드 리뷰를 실시합니다.
      1. 코드 리뷰에 문제가 없으면 merge를 실시합니다
      1. github actions workflows 파일에 정의된 작업을 수행합니다.
          • 애플리케이션 빌드 후 컨테이너 화 작업
      1. CI가 성공적으로 완료되면 젠킨스에 배포 요청을 보냄
      1. 젠킨스는 미리 정의된 배포 스크립트를 운영 서버에 실행
        1. blue(active), green(standby) → 현재 실행중인 애플리케이션 blue, 대기중인 애플리케이션 green
          • green에 도커 이미지를 최신화
          • green 실행
          • green이 정상적으로 올라올때 까지 대기 (서비스 가능한 상태가 될때까지)
          • green이 정상적으로 올라왔으면 nginx가 green을 가르키도록 변경
          • blue 종료
      1. 배포 완료