Project/Extra

[📋] dev_deploy 작성 flow

shin0112 2024. 8. 7. 16:17

GitHub Actions로 무중단 배포 설계하기

개요

GitHub Actions를 사용하여 무중단 배포를 구현할 예정입니다. 본격적으로 dev_deploy를 작성하기 전에, 어떤 구성 요소를 사용할지 미리 생각해 보는 시간을 가지기 위해 작성한 문서입니다.

이론

0. 들어가기 앞서

GitHub Actions는 repository 내부의 .github/workflows 디렉토리에 dev_deploy.yml 파일로 작성됩니다. 트리거 조건과 배포 환경도 고려해야 하기 때문에 조건을 간단히 정리합니다.

  • Trigger 조건: develop -> main으로 PR이 closed(=merge)될 때
  • OS 환경: ubuntu-latest
  • Language: Java 17
  • 빌드 도구: Gradle

1. 사전 설정 작성

이름(name) 정의

name은 작업의 이름으로, 해당 배포 작업을 구분하기 쉽게 설정합니다.

name: Extra Deploy

트리거(trigger) 설정

배포가 진행될 시점을 설정합니다. on 키워드를 사용하며, 아래 조건을 적용합니다:

  • PR과 관련된 이벤트에서 main 브랜치의 PR이 closed될 때
  • 수동 실행 옵션
on:
  pull_request:
    branches:
      - main
    types:
      - closed
  workflow_dispatch:

해석:

  • pull_request 이벤트에서 main 브랜치에 대한 PR이 closed될 때 실행됩니다.
  • workflow_dispatch로 수동 실행을 지원합니다.

2. 빌드 조건 작성

jobs 키워드를 사용하여 빌드 조건을 작성합니다. runs-on으로 OS 환경을 설정하며, steps에서 작업 단계를 정의합니다.

OS 환경 설정

build:
  runs-on: ubuntu-latest

PR 상태 확인

PR이 정상적으로 merge된 경우에만 작업이 실행되도록 조건을 추가합니다:

build:
  runs-on: ubuntu-latest
  if: github.event.pull_request.merged == true

 

3. 코드 작성

1. 코드 가져오기

GitHub Actions에서 작업을 시작하기 위해 repository의 코드를 가져옵니다. 이를 위해 actions/checkout을 사용합니다.

- name: Checkout
  uses: actions/checkout@v2

2. Java 설정하기

현재 프로젝트는 Java 17을 사용하므로 JDK 17을 설정합니다.

- name: Set up JDK 17
  uses: actions/setup-java@v3
  with:
    java-version: 17
    distribution: 'adopt'
  • java-version: 사용하려는 Java 버전을 지정합니다.
  • distribution: Java 배포판을 선택합니다.
주요 Java 배포판
  1. adopt (AdoptOpenJDK): 현재 Eclipse Adoptium으로 변경됨.
  2. zulu (Azul Zulu): 다양한 OS와 클라우드 환경 지원.
  3. temurin: Eclipse Adoptium 프로젝트의 JDK 배포판.
  4. oracle: Oracle 공식 JDK.

3. Gradle로 빌드

Spring Boot 프로젝트이므로 Gradle을 사용하여 빌드합니다. gradlew 권한을 부여한 후 빌드 작업을 수행합니다:

# 권한 부여
- name: Grant execute permission for gradlew
  run: chmod +x ./gradlew
  shell: bash

# 빌드 실행
- name: Build with Gradle
  run: ./gradlew clean build -x test
  shell: bash

 

4. Deployment Package 지정

배포 패키지를 생성하여 애플리케이션에 필요한 모든 파일과 설정을 포함합니다. 이를 통해 배포를 간소화하고 일관성을 유지할 수 있습니다.

패키지 생성 코드

- name: Generate deployment package
  run: |
    mkdir -p deploy
    cp build/libs/*.jar deploy/application.jar
    cp Procfile deploy/Procfile
    cp -r .ebextensions_dev deploy/.ebextensions
    cp -r .platform deploy/.platform
    cd deploy && zip -r deploy.zip .

단계별 설명

  1. 디렉토리 생성: deploy 디렉토리를 생성합니다.
  2. 애플리케이션 파일 복사: 빌드된 JAR 파일을 deploy 디렉토리로 복사.
  3. Procfile 복사: 실행 구성을 정의하는 Procfile 복사.
  4. 환경 설정 복사: Elastic Beanstalk 및 플랫폼 설정 파일 복사.
  5. 패키지 압축: deploy 디렉토리를 deploy.zip 파일로 압축.

배포 패키지 사용 이유

  1. 일관성: 개발 환경과 배포 환경 간 일관성 유지.
  2. 간소화: 배포 파일을 한 번에 관리.
  3. 버전 관리: 특정 버전으로 롤백 용이.
  4. 의존성 관리: 필요한 라이브러리와 설정 포함.
  5. 보안: 불필요한 파일 배포 환경에서 배제.

5. 파일 전달

S3 + CodeDeploy 또는 Elastic Beanstalk를 사용할지 아직 결정되지 않았으므로, 이 부분은 추후 추가 작성 예정입니다.

참고