본문 바로가기
AWS

Elastic BeansTalk + GitHub Action CI/CD 설정

by meetyou 2023. 1. 20.

이번에는 엘라스틱 빈스톡과 깃액션을 통해서 ci/cd 설정을 해보겠습니다.

 

문제1

yml 파일 환경 변수 만들어줄때 여러가지 선택지가 있었습니다.

1. git action에 secret에 변수 하나하나 다 넣어주기

2. git action에 secret에 yml 파일을 base64로 인코딩해서 넣어주기

3. git action에 property로 만들어주기

 

저는 여러번의 테스트 끝에 2번 방법을 성공했습니다!

 

---여기는 안읽어도 됨---

1번 방법 실패 이유 : 

일단 말이 안됐다. 시크릿에 yml에 설정된 변수들을 다 넣어준다는게 그래서 이건 바로 제꼈다!

3번 방법 실패 이유 : 

나는 기존 프로젝트에 yml로 되어있어 property로 바꿔야하는데

application.yml 과 application.property 둘중에 하나만 써야한다. 혼용해서 쓰는게 안된다.

나는 쓴다면 property보단 yml을 쓰고 싶어서 포기했다.

---잡담 끝 ------

 

해결방법 : Yml 파일을 base64로 인코딩해서 넣어주기

1. yml 파일 내용을 base64로 인코딩

아래의 사이트에서 인코딩할 수 있습니다.

https://www.convertstring.com/ko/EncodeDecode/Base64Encode

 

Base64로 인코딩 - 온라인 Base64로 인코더

 

www.convertstring.com

 

2. 인코딩한 내용을 github action에 secret에 추가

NAME은 사용할 변수 이름을 넣고

Secret는 아까 base64에서 인코딩한 내용을 넣어줍니다.

 

3. github/workflows/main.yml 작성

배포를 하기위한 실행환경 등을 구성하는 내용입니다.

main.yml에 application-secret.yml을 만들어 준다는 내용도 추가해줍니다.

name: 프로젝트명-webapp

on:
  push:
    branches: [ "main" ]

permissions:
  contents: read

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout
      uses: actions/checkout@v3
      
    - name: Set up JDK 11
      uses: actions/setup-java@v3
      with:
        java-version: '11'
        distribution: 'temurin'
        
    - name: make application-secret.yml
      run: |
        cd src/main/resources
        touch ./application-secret.yml
        echo $시크릿키명 | base64 --decode >> ./application-secret.yml
      shell: bash
      env:
          시크릿키명: ${{ secrets.시크릿키명 }}
        
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew # gradle wrapper를 실행할 수 있도록 권한 부여
      
    - name: Build with Gradle
      run: ./gradlew clean build # 프로젝트 빌드
        
    - name: Get current time
      uses: 1466587594/get-current-time@v2  # 빌드 완료 시간 가져오기
      id: current-time
      with:
        format: YYYY-MM-DDTHH-mm-ss
        utcOffset: "+09:00"

    - name: Show Current Time
      run: echo "CurrentTime=${{steps.current-time.outputs.formattedTime}}" # 빌드 완료 시간 출력하기
      working-directory: ${{ env.working-directory }}
      shell: bash
    
    # gradle build를 통해 만들어진 jar 파일 beanstalk에 배포하기 위한 zip 파일로 만듬
    - name: Generate deployment package
      run: |
        mkdir -p deploy
        cp build/libs/*.jar deploy/application.jar
        cp Procfile deploy/Procfile
        cp -r .ebextensions deploy/.ebextensions
        cd deploy && zip -r deploy.zip .
      
    - name: Beanstalk Deploy
    # You may pin to the exact commit or the version.
      uses: einaregilsson/beanstalk-deploy@v21
      with:
        # AWS Access Key
        aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }} 
        # AWS Secret Key
        aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        # AWS Region
        region: ap-northeast-2
        # Beanstalk application name
        application_name: 엘라스틱 빈스톡 애플리케이션 이름
        # Beanstalk environment name. If empty a version will be created but not deployed anywhere.
        environment_name: 엘라스틱 빈스톡 환경 이름
        # Version label for new Beanstalk version
        version_label: github-action-${{steps.current-time.outputs.formattedTime}}
        # Version description for the new Beanstalk version
        deployment_package: deploy/deploy.zip

 

4. ebextensions 생성

최상위 경로에 .ebextensions/00-makeFiles.config 생성해줍니다.

00-makeFiles.config

files:
    "/sbin/appstart" :
        mode: "000755"
        owner: webapp
        group: webapp
        content: |
            #!/usr/bin/env bash
            JAR_PATH=/var/app/current/application.jar

            # run app
            killall java
            java -Dfile.encoding=UTF-8 -jar $JAR_PATH

 

5. Procfile 생성

최상위 경로에 Procfile 생성

web: appstart

** .ebextensions, Procfile 경로 참고

 

이렇게 해서 배포를 잘 마무리 할 수 있었습니다