Skip to content

[프로젝트 설계] 인프라 구축 및 무중단 배포 프로세스

YoonTaeMin edited this page Nov 6, 2023 · 2 revisions

CICD workflow

CI

CI환경 : ubuntu
실행시점 : dev 브랜치로 PR 요청 시

steps :

  • JDK 11 version 으로 설정
  • gradle 의존성 패키지 캐싱
  • gradlew 파일에 대한 실행권한 추가
  • 테스트를 제외한 프로젝트 빌드
  • mysql, redis 설정
  • secret 파일 (application-test.yml) 을 불러와서 세팅
  • test 코드 빌드
  • 테스트 결과 파일 생성

CD

CD환경 : ubuntu
실행시점 : main 브랜치로 merge 시

steps:

  • JDK 11 version 세팅
  • gradle 의존성 패키지 캐싱
  • secret 파일 (application-secret.yml : Jasypt라이브러리를 사용한 설정파일 암호화 key가 담긴 파일) 을 불러와서 세팅
  • 프로젝트 폴더 압축
  • s3 업로드
  • code-deploy에게 배포 명령 실행

Gradle caching 이유

gradle 은 최초로 빌드할때 의존성 패키지들을 모두 다운받고, 빌드시간과 네트워크 통신 시간을 절약하기 위해서 의존성 패키지를 캐싱하여 재사용합니다.
하지만, github actions의 경우 CI or CD가 실행될 때마다 매번 새로운 환경을 구축하고, 새로운 의존성 패키지들을 불러와야 합니다. 따라서, 빌드시간이 늘어나는 현상이 발생합니다.

github actions 는 actions/cache 를 제공하는데 이를 사용하여 의존성 캐싱 작업을 수행할 수 있습니다.

      - name: Gradle Caching
        uses: actions/cache@v3
        with:
          path: |
            ~/.gradle/caches
            ~/.gradle/wrapper
          key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
          restore-keys: |
            ${{ runner.os }}-gradle-

path : 캐시의 저장과 복원에 사용되는 runner 내 파일 경로
key : 캐시를 저장, 복원에 사용되는 키
restore-keys : cache-miss 가 발생하였을 때, 사용할 수 있는 후보 키

결과적으로 약 1분정도의 시간감축이 있었습니다.


인프라 구축 프로세스

사용기술 : NGINX, AWS - load balancer, certificate manager, ec2

setting - load balancer

  • AWS load balancer 에서 80번 포트를 443 포트로 리다이렉트 시켜준다.
  • certificate manager를 통해 발급 받은 ssl 인증서를 443 포트에 적용하였다.
  • 443 포트로 접속 시, ec2-instance:80 으로 포워딩 한다.

setting - ec2

  • nginx를 설치하여 리버스 프록시 서버를 구축하였다.
  • /etc/nginx/sites-available 경로의 설정파일을 작성하여, /etc/nginx/sites-enabled 경로로 심볼릭 링크를 설정하였다.
스크린샷 2023-03-24 오후 6 46 25 (프론트 정적파일에 대한 프록시는 아직 설정하지 않은 상태이다.)

BLUE-GREEN 무중단 배포 프로세스

사용기술 : NGINX, github actions, AWS - s3, code-deploy

CI/CD

  • PR(feature -> dev) 시, github actions CI 실행
  • merge(dev -> main) 시, github actions CD 실행
  • 프로젝트 폴더(zip)을 AWS s3에 업로드한다.
  • ec2 내부에 설치된 code-deploy agent에 의해서 s3에 있는 프로젝트 폴더(zip)가 ec2 내부로 배포된다.

server switch (BLUE-GREEN)

  • 프로젝트폴더/scripts 내부의 스크립트 파일을 작성하여 code-deploy가 배포할때, 처리할 작업들을 나열하였다.
  • appspec.yml 을 작성하여 ec2 내부에 프로젝트 배포 경로를 지정하고, 스크립트 파일(프로젝트폴더/scripts)의 작업 순서를 지정하였다.
  • run_new_was.sh -> health_check.sh -> switch.sh

쉘 스크립트 처리 순서

1. (8081 run -> 8082 switch -> 8082 restart) or (8082 run -> 8081 switch -> 8081 restart)
2. switch 되는 포트의 서버 health check
3. NGINX 포워딩 포트 변경
Clone this wiki locally