본문 바로가기
Skills/DevOps

#3 AWS Elastic Beanstalk 기반 CI/CD 블루그린 배포 - deploy.yml

by Hoseok 2023. 5. 23.
728x90
반응형

 

 

 

 

Elastic Beanstalk에 접근하기 위해서는,

 

* Elastic Beanstalk 콘솔

 

* AWS Command Line Interface(AWS CLI)

 

* EB CLI

 

를 사용할 수 있다.

 

그러나 Github Actions 플러그인 Beanstalk Deploy를 사용할 경우, 배포 코드만 작성해 주면

 

사용할 수 있다는 장점이 있으므로, deploy,yml 파일을 작성해서 사용하도록 할 것이다. 

 

 

* Beanstalk Deploy 문서

https://github.com/marketplace/actions/beanstalk-deploy

 

Beanstalk Deploy - GitHub Marketplace

Deploy a zip file to AWS Elastic Beanstalk

github.com

 

 

Github Actions Workflow

 

1. 프로젝트 루트 디렉토리에 .github/workflows 디렉토리를 생성한다.

 

2. .github/workflows 디렉토리 내에 yaml 파일을 생성한다. 이름은 임의로 지정할 수 있으나 .yml 확장자를 이용한다.

 

3. yml 파일에, 실행할 스크립트, 커맨드 라인 명령, 환경 변수 설정 등 배포에 필요한 작업을 작성한다.

 

4. github 저장소에 push가 되면, Github Actions는 deploy.yml 파일을 자동으로 감지하고 워크플로를 시작한다.

 

 

 

deploy.yml 코드

name: 프로젝트명
on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: 17
          distribution: zulu
      - name: Grant execute permission for gradlew
        run: chmod +x ./gradlew
      - name: Build with Gradle
        env:
          AWS_ACCESS_KEY: ${{secrets.AWS_ACCESS_KEY}}
          AWS_SECRET_KEY: ${{secrets.AWS_SECRET_KEY}}
          BOOT_ACCESS_KEY: ${{secrets.BOOT_ACCESS_KEY}}
          BOOT_SECRET_KEY: ${{secrets.BOOT_SECRET_KEY}}
          HS512_SECRET: ${{secrets.HS512_SECRET}}
          SENTRY: ${{secrets.SENTRY}}
        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}}"

      - 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: Deploy to EB
        uses: einaregilsson/beanstalk-deploy@v21
        with:
          aws_access_key: ${{ secrets.AWS_ACCESS_KEY }}
          aws_secret_key: ${{ secrets.AWS_SECRET_KEY }}
          application_name: 엘리스틱 빈스톡 애플리케이션 이름
          environment_name: 엘리스틱 빈스톡 환경 이름
          version_label: aws-v5-${{steps.current-time.outputs.formattedTime}}
          region: ap-northeast-2
          deployment_package: deploy/deploy.zip

 

main 브랜치에 push가 되면, Github Actions는 이를 감지하고, deploy.yml 코드를 실행할 것이다.

 

jobs 이하에 실행할 Actions들을 적어주면 된다.

 

즉, Gradle Build를 통해 만들어진 JAR 파일을 ZIP 파일로 만든 후에,

 

Elastic Beanstalk에 배포하는 스크립트이다. 

 

 

스크립트 파트별 설명

 

OS환경 설정

runs-on: ubuntu-latest

 

 

ubuntu 환경에서 build가 실행된다.

 

Gradlew Build

steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: 17
          distribution: zulu
      - name: Grant execute permission for gradlew
        run: chmod +x ./gradlew
      - name: Build with Gradle
        env:
          AWS_ACCESS_KEY: ${{secrets.AWS_ACCESS_KEY}}
          AWS_SECRET_KEY: ${{secrets.AWS_SECRET_KEY}}
          BOOT_ACCESS_KEY: ${{secrets.BOOT_ACCESS_KEY}}
          BOOT_SECRET_KEY: ${{secrets.BOOT_SECRET_KEY}}
          HS512_SECRET: ${{secrets.HS512_SECRET}}
          SENTRY: ${{secrets.SENTRY}}
        run: ./gradlew clean build

 

Checkout

 

Checkout은 Github의 코드를 CI서버로 내려받는 액션이라고 볼 수 있다.

 

git init - Git 저장소 만들기

git config - 설정 정보 받아오기

git fetch - 원격 저장소 코드 가져오기

git checkout - main 브랜치로 전환

git log - 마지막 커밋의 해시값 확인

 

의 명령어가 내부적으로 실행된다.

 

* checkout 문서

https://github.com/actions/checkout

 

GitHub - actions/checkout: Action for checking out a repo

Action for checking out a repo. Contribute to actions/checkout development by creating an account on GitHub.

github.com

 

Set up JDK 17

 

JDK 설정.

 

* setup-java 문서

https://github.com/actions/setup-java

 

GitHub - actions/setup-java: Set up your GitHub Actions workflow with a specific version of Java

Set up your GitHub Actions workflow with a specific version of Java - GitHub - actions/setup-java: Set up your GitHub Actions workflow with a specific version of Java

github.com

 

 

Grant execute permission for gradlew

 

gradlew 실행 권한 주기.

 

 

Build with Gradle

 

gradle build.

 

${{}} 는 Github Secrets 접근 문법이다.

 

 

 

현재 시간 설정

- 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}}"

 

현재 시간을 KST(Korean Standard Time, 한국 표준 시간)으로 맞추기 위해 UTC+9:00 시간으로 맞춰준다.

 

 

Generate deployment package

- 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: Deploy to EB
        uses: einaregilsson/beanstalk-deploy@v21
        with:
          aws_access_key: ${{ secrets.AWS_ACCESS_KEY }}
          aws_secret_key: ${{ secrets.AWS_SECRET_KEY }}
          application_name: 엘리스틱 빈스톡 애플리케이션 이름
          environment_name: 엘리스틱 빈스톡 환경 이름
          version_label: aws-v5-${{steps.current-time.outputs.formattedTime}}
          region: ap-northeast-2
          deployment_package: deploy/deploy.zip

 

build가 끝나면 매 build마다 jar의 파일명이 버전별로 바뀌게 된다.

 

하나로 통일해서 사용하기 위해 해당 배포 jar의 파일명을 application.jar로 바꿔준다.

 

앞서 만들어준 Procfile과 .ebextensions 파일 역시 ZIP 파일로 함께 만들어준다.

 

 

Deploy to EB

 

Beanstalk 플러그인을 사용하여 동작되며, 미리 설정해둔 IAM 키를 기반으로

 

Elastic Beanstalk에 접근한다.

 

현재 시간을 version_label에 달아줌으로써 유니크한 버전 관리가 가능해진다.

 

 

 

728x90
반응형