무중단배포 & 배포자동화(Github Actions + CodeDeploy + Nginx)

2022. 3. 22. 17:51Back-end/Spring

반응형

배포자동화(CI/CD)

 

CI : 테스트, 빌드 자동 (도구로 Github Actions을 사용)

CD : 배포 자동 (도구로 CodeDeploy를 사용)  

 

무중단배포

 

무중단 배포 (도구로 Nginx를 사용)


 

배포 플로우

 

  • Github Actions에서 프로젝트 빌드 후, jar 파일을 압축해서 S3에 업로드합니다.
  • 이어서 CodeDeploy에게 S3에 있는 jar 파일을 가지고 배포를 진행해달라고 전달합니다.
  • CodeDeploy는 배포할 EC2 인스턴스 내부에 있는 CodeDeploy Agent에게 배포 명령을 내리고, Agent는 jar 파일을 S3에서 받아서 주어진 스크립트에 따라 배포를 진행합니다.
  • 새로운 Spring Boot WAS를 띄우고, Nginx 스위칭을 통해 무중단 배포를 할 수 있도록 Agent에게 배포 스크립트를 제공합니다.

 

 

 

GitHub Actions의 개념

 

Github Actions은 18년에 공개되어 베타 테스트를 거쳐 19년 부터 서비스를 하고 있는 비교적 최신 기술이다. 
Github Actions은 Github 저장소를 기반으로 소프트웨어 개발 Workflow를 자동화 할 수 있는 도구이다.
간단하게 말하자면 Github에서 직접 제공하는 CI/CD 도구라고 할 수 있다.
Workflow는 Github 저장소에서 발생하는 build, test, package, release, deploy 등 다양한 이벤트를 기반으로 직접 원하는 Workflow를 만들 수 있다.
Workflow는 Runners라고 불리는 Github에서 호스팅 하는 Linux, macOS, Windows 환경에서 실행된다.

그리고 이 Runners를 사용자가 직접 호스팅하는 환경에서 직접 구동시킬 수도 있다.(self-hosted runner)
Github 마켓 플레이스에는 여러 사람이 공유한 Workflow는 찾을 수 있으며, 자신이 직접 만들어서 공유할 수도 있다.
사용료는 public 저장소는 무료이며, private저장소는 해당 계정에 부여된 무료 사용량 이후에 과금이 부과된다.
Github 무료 계정의 전체 비공개 저장소를 기준으로 한달에 500MB 스토리지와 실행 시간 2,000분(minute)까지 제공된다.

GitHub Actions 사용 이점

 

  • 기존의 Circle CI / Travis CI / Jenkins CI와 같은 서비스 또는 설치형 CI처럼 Github에서도 Actions이라는 CI툴을 선보였으며 별다른 복잡한 절차 없이 Github를 통해 사용할 수 있다는 장점이 있다.
  • 워크 플로우 복제 용이
  • GitHub와 통합
  • 라이브 로그
  • 다중 컨테이너 테스트
  • 리눅스, 맥, 윈도우, ARM 및 컨테이너를 쉽게 빌드, 테스트
  • 여러 운영체제 및 런타임 버전에서 동시 테스트 가능
  • 모든 언어 어플리케이션 빌드, 테스트 및 배포
  • Github Marketplace 를 통해 서로 공유 할 수 있다는 것 입니다. 다른 개발자가 작성한 액션을 재사용 할 수 있으므로 충분한 시간을 절약하고 이미 사용 가능한 코드를 다시 작성하지 않아도된다.

 

GitHub Actions를 사용하여 배포 자동화를 한 이유

 

Github Actions는 Circle CI / Travis CI / Jenkins CI와 같이 별도로 서버를 설치하지 않고 Github의 Actions를 통해 간단히 사용할 수 있다는 점이 실전 프로젝트 마감 기한의 시간제약이 있던 나에게 가장 큰 장점으로 다가왔다. 현재 하고있는 프로젝트가 Travis를 쓸만큼 규모가 크지도 않았고 또 다른 이유로는 Github의 다양한 기능들을 써보고 싶었는데 지금 이 기회에 써보고 싶다는 생각이 강하게 들어 망설임 없이 결정하게 되었다. 


Nginx?

 

 Nginx는 간단하게 말하면 경량 웹 서버이다. 클라이언트로부터 요청을 받았을 때 요청에 맞는 정적 파일을 응답해주는 HTTP Web Server로 활용되기도 하고, Reverse Proxy Server로 활용하여 WAS 서버의 부하를 줄일 수 있는 로드 밸런서로 활용되기도 한다.

 

Apache 서버와 다른 점

 Apache와 같은 웹서버는 클라이언트로부터 받은 요청을 처리할 때 새로운 프로세스 또는 쓰레드를 생성하여 처리한다. 요청마다 쓰레드가 생성되므로 접속하는 사용자가 많으면 그만큼 쓰레드가 생성되어 CPU와 메모리 자원의 소모가 커진다.

 

 Nginx는 Event-Driven 구조로 동작하기 때문에 한 개 또는 고정된 프로세스만 생성하여 사용하고, 비동기 방식으로 요청들을 Concurrency 하게 처리할 수 있다. 위의 그림에서 보이듯이 Nginx는 새로운 요청이 들어오더라도 새로운 프로세스와 쓰레드를 생성하지 않기 때문에 프로세스와 쓰레드 생성 비용이 존재하지 않고, 적은 자원으로도 효율적인 운용이 가능하다. 이러한 Nginx의 장점 덕분에 단일 서버에서도 동시에 많은 연결을 처리할 수 있다.

 

Nginx를 사용하여 무중단 배포를 한 이유

 

가장 큰 이유는 가장 저렴하기 떄문이다.

또 기존에 쓰던 EC2에 적용하면 되어서 인스턴스를 하나 더 만들지 않아도 된다.

 

하나의 EC2 혹은 리눅스 서버에 Nginx 1대와 스프링부트 jar를 2대를 사용하면 된다.
Nginx는 80(http), 443(https) 포트를 할당하고,
스프링부트1은 8081포트로,
스프링부트2는 8082포트로 실행한다.


<여기 사이트들을 참조해서 만들었다.>

 

https://wbluke.tistory.com/41?category=418851 

 

Github Actions + CodeDeploy + Nginx 로 무중단 배포하기 (3)

Nginx 소개 Nginx는 널리 쓰이는 웹 서버 중 하나입니다. 동적 처리를 주로 담당하는 WAS(Web Application Server)와는 다르게 웹 서버(Web Server)는 정적 자원에 대한 응답을 내려주는 역할을 가지고 있는데

wbluke.tistory.com

이 사이트를 제일 많이 참조했다. 거의 이 형태로 만듬. 다만 ubuntu가 아니여서 명령어들이 좀 다르다.

 

https://dazbee.tistory.com/94

 

[Ubuntu/nginx] 스프링 부트 및 우분투 환경에서 nginx 이용한 무중단배포 구현

CI/CD [Ubuntu/Travis-CI/CodeDeploy] SpringBoot 환경 배포 자동화 환경 구축 CI/CD 하루종일 travis와 싸웠다. travis 사이트도 말썽을 부려댔고, 깃헙도 잠깐 터졌고, 티스토리도 잘 안 되는 데다가, 시스템 구..

dazbee.tistory.com

 

ubuntu 환경에서 어떻게 치는지 참조하였다.

 

https://stalker5217.github.io/devops/github_action_ci_cd_4/

 

[Devops] Github Action을 사용한 Spring boot & gradle CI/CD 구축 - 4

github action, AWS S3, AWS CodeDeploy, AWS EC2를 사용하여 CI/CD 환경을 구성해봅시다

stalker5217.github.io

ci/cd 부분이나 전체적으로 첫번째와 비교하며 참고하였다.


도움 출처: 

https://choseongho93.tistory.com/295 

 

[CI/CD] Jenkins 과 GitHub Actions의 개념, 차이점

[CI/CD] Jenkins 과 GitHub Action의 개념, 장단점에 대해 포스팅하겠습니다. JenKins와 GitHub Action 소개와 차이점을 앞서 배포, 빌드, 컴파일에 대해 간략하게 알고 싶다면 아래 링크를 참고해주세요. ▶빌

choseongho93.tistory.com

 

https://jojoldu.tistory.com/267

 

7) 스프링부트로 웹 서비스 출시하기 - 7. Nginx를 활용한 무중단 배포 구축하기

이번 시간엔 무중단 배포 환경을 구축하겠습니다. (모든 코드는 Github에 있습니다.) 7-1. 이전 시간의 문제점? 이전 시간에 저희는 스프링부트 프로젝트를 Travis CI를 활용하여 배포 자동화 환경을

jojoldu.tistory.com

 

https://ndb796.tistory.com/341

 

Ubuntu 16.04에 Nginx 설치하기

Ubuntu 16.04에 Nginx를 설치하는 방법은 매우 간단합니다. 바로 다음과 같은 명령어를 이용하면 됩니다. sudo apt-get install nginx nginx는 처음 설치했을 때 기본적인 환경 설정 파일의 경로가 /etc/nginx/si..

ndb796.tistory.com

 

반응형