Github Action & S3 & Code Deploy을 이용한 빌드 & 배포 자동화

HeavyJ·2023년 3월 12일
0

자바/스프링부트

목록 보기
3/17

배포를 할 때 build를 한 뒤에 File Zilla를 사용하여 일일히 EC2 서버에 접속한 뒤 jar파일을 옮기는 방식으로 배포를 했습니다.
이 방식은 일단 깃허브와 연동도 되지 않아 불편할 뿐만 아니라, 소위 노가다 방식으로 매번 빌드를 하고 파일을 옮겨야 하기 때문에 굉장히 귀찮았습니다.

불편함을 해소 하고자 빌드&배포 자동화 방식들을 구글링 했고, 여러 방식들을 찾게 되었습니다. 그 중 Github Action 방식을 사용하기로 했습니다.

Github Action은 워크플로우를 통해 자동화가 가능합니다. 워크플로우는 레포지터리 내에서 .github/workflows 폴더 아래에 위치한 gradle.yaml 파일로 설정을 합니다.

# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle

# (하고 싶은 이름 아무거나 하면 됩니다.)
name: ConcertCalendar(SpringBoot & Gradle) CI/CD 

on:
  push:
    branches: [ "master" ]
  pull_request:
    branches: [ "master" ]

permissions:
  contents: read
  
env:
  S3_BUCKET_NAME: 내 S3 버켓 이름
  PROJECT_NAME: 내 프로젝트 이름

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3
      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          # 사용하는 자바 버전 17
          java-version: '17'
          distribution: 'temurin'
  
      - run: touch ./src/main/resources/application-secret.properties
      - run: echo "${{ secrets.APPLICATION_SECRET }}" > ./src/main/resources/application-secret.properties
      - run: cat ./src/main/resources/application-secret.properties
 
      # gradlew에 권한 부여
      - name: Grant execute permission for gradlew
        run: chmod +x gradlew
      
      # gradlew 빌드
      - name: Build with Gradle
        run: ./gradlew clean build --exclude-task test

      # 압축파일 형태로 전달
      - name: Make zip file
        run: zip -r ./만들고 싶은 파일 이름.zip .
        shell: bash
        

      # S3 Bucket으로 Copy
      - name: Deliver to AWS S3
        uses: aws-actions/configure-aws-credentials@v1
        with: 
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ secrets.AWS_REGION }}
        
      - name: Upload to S3
        run: aws s3 cp --region ap-northeast-2 ./만들고 싶은 파일 이름.zip s3://$S3_BUCKET_NAME/$PROJECT_NAME/만들고 싶은 파일 이름.zip

      # Deploy
      # applicatio-name => aws code deploy application 이름
      - name: Deploy
        run: |
          aws deploy create-deployment \
          --application-name 어플리케이션 이름 \
          --deployment-config-name CodeDeployDefault.AllAtOnce \
          --deployment-group-name Code Deploy 그룹 이름 \
          --file-exists-behavior OVERWRITE \
          --s3-location bucket=S3 버켓 이름,bundleType=zip,key=concert-calendar/ConcertCalendar.zip \
          --region ap-northeast-2 \

on 속성으로 해당 워크플로우가 언제 실행되는지 정의합니다.

on:
  push:
    branches: [ "master" ]
  pull_request:
    branches: [ "master" ]

master 브랜치로 push가 되거나 pull request가 들어올 경우 워크플로우가 실행되도록 설정해줍니다.

env로 S3_BUCKET_NAME과 PROJECT_NAME을 환경변수로 설정해줍니다.

env:
  S3_BUCKET_NAME: 내 S3 버켓 이름
  PROJECT_NAME: 내 프로젝트 이름

Jobs는 독립된 가상머신에서 돌아가는 하나의 처리 단위입니다.
step 안에 작업 단위들을 단계별로 입력할 수 있습니다.

먼저 자바 버전을 세팅해줍니다.

      - uses: actions/checkout@v3
      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          # 사용하는 자바 버전 17
          java-version: '17'
          distribution: 'temurin'

그리고 프로젝트의 보안을 위해 암호만 모아놓은 application-secret.properties를 Github 내 SECRET과 touch, echo 명령어를 통해 새로 만들어주는 작업을 진행해줍니다.
(보안이 필요한 yml, properties 파일이 없는 경우 없어도 됩니다)

      - run: touch ./src/main/resources/application-secret.properties
      - run: echo "${{ secrets.APPLICATION_SECRET }}" > ./src/main/resources/application-secret.properties
      - run: cat ./src/main/resources/application-secret.properties

gradlew에 권한을 부여하고 gradlew로 빌드를 해주니다.

      # gradlew에 권한 부여
      - name: Grant execute permission for gradlew
        run: chmod +x gradlew
      
      # gradlew 빌드
      - name: Build with Gradle
        run: ./gradlew clean build --exclude-task test

빌드한 프로젝트를 압축파일 형태로 만듭니다.

      # 압축파일 형태로 전달
      - name: Make zip file
        run: zip -r ./만들고 싶은 파일 이름.zip .
        shell: bash

기존에 만들었던 S3 버켓으로 압축했던 파일을 Copy 해줍니다.
aws-access-key-id, aws-secret-access-key, aws-region은 Github내 Secret을 사용해서 보안을 유지해줍니다.

      # S3 Bucket으로 Copy
      - name: Deliver to AWS S3
        uses: aws-actions/configure-aws-credentials@v1
        with: 
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ secrets.AWS_REGION }}
        
      - name: Upload to S3
        run: aws s3 cp --region ap-northeast-2 ./만들고 싶은 파일 이름.zip s3://$S3_BUCKET_NAME/$PROJECT_NAME/만들고 싶은 파일 이름.zip

Code Deploy를 사용하여 서버를 실행할 EC2에 배포를 해줍니다.

      # Deploy
      # applicatio-name => aws code deploy application 이름
      - name: Deploy
        run: |
          aws deploy create-deployment \
          --application-name 어플리케이션 이름 \
          --deployment-config-name CodeDeployDefault.AllAtOnce \
          --deployment-group-name Code Deploy 그룹 이름 \
          --file-exists-behavior OVERWRITE \
          --s3-location bucket=S3 버켓 이름,bundleType=zip,key=concert-calendar/만들고 싶은 파일 이름.zip \

이렇게 Github Action을 사용하여 빌드와 배포의 자동화가 가능합니다. Github Action의 가장 큰 장점은 레포지터리에 push만 되면 자동으로 실행이 되며 레포지터리 안에서 workflows 내에 yml 파일로 설정이 가능하다는 점입니다.

profile
There are no two words in the English language more harmful than “good job”.

2개의 댓글

comment-user-thumbnail
2023년 3월 13일

저도 Github Action으로 자동화 해보려고 알아보고 있었는데, 세팅값을 잘 정리해놓으셔서 참고하기 좋네요.

답글 달기
comment-user-thumbnail
2023년 3월 14일

코드 디플로이에서 일어나는 영역에 대해서는 쓰지 않으신 점이 매우 아쉽습니다.
무중단 자동배포인지 중단형 자동배포인지 궁금하기도 하네요.

그리고 제 경험상 docker를 사용하면 중단형 자동배포에서는 훨씬 좋았던 경험이 있습니다!

답글 달기