ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [📋] dev_deploy 작성 flow
    Project/Extra 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를 사용할지 아직 결정되지 않았으므로, 이 부분은 추후 추가 작성 예정입니다.

    참고

    'Project > Extra' 카테고리의 다른 글

    [📋] Jwt Token 저장 위치 - http header vs cookie  (0) 2024.07.27
    [회의] BackEnd 4차 회의  (5) 2024.07.24
    [📋] WebSocket(1)  (0) 2024.07.17
    [📋] MariaDB 연동 시도  (1) 2024.07.17
    [📋] QR 구현 방안 생각해보기  (0) 2024.07.17
Designed by Tistory.