[📋] dev_deploy 작성 flow
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 배포판
adopt
(AdoptOpenJDK): 현재 Eclipse Adoptium으로 변경됨.zulu
(Azul Zulu): 다양한 OS와 클라우드 환경 지원.temurin
: Eclipse Adoptium 프로젝트의 JDK 배포판.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 .
단계별 설명
- 디렉토리 생성:
deploy
디렉토리를 생성합니다. - 애플리케이션 파일 복사: 빌드된 JAR 파일을
deploy
디렉토리로 복사. - Procfile 복사: 실행 구성을 정의하는
Procfile
복사. - 환경 설정 복사: Elastic Beanstalk 및 플랫폼 설정 파일 복사.
- 패키지 압축:
deploy
디렉토리를deploy.zip
파일로 압축.
배포 패키지 사용 이유
- 일관성: 개발 환경과 배포 환경 간 일관성 유지.
- 간소화: 배포 파일을 한 번에 관리.
- 버전 관리: 특정 버전으로 롤백 용이.
- 의존성 관리: 필요한 라이브러리와 설정 포함.
- 보안: 불필요한 파일 배포 환경에서 배제.
5. 파일 전달
S3 + CodeDeploy 또는 Elastic Beanstalk를 사용할지 아직 결정되지 않았으므로, 이 부분은 추후 추가 작성 예정입니다.