Framework/SpringBoot

[SpringBoot] Github Action을 이용한 CI/CD (ElasticBeanstalk)

  • -
CI/CD란 무엇인지, SpringBoot 프로젝트를 Github Action을 이용하여 CI/CD를 하는 방법에 대해 작성한 글입니다.

 

🔔 준비 사항

1. 배포할 SpringBoot 프로젝트

2. (1) 프로젝트와 연동되어있는 Github Repository

3. SpringBoot 프로젝트가 배포되어 있는 우분투 서버

 

⚡️ 참고

1. 스프링 버전 3.2.3을 사용하고 있습니다.

2. Elastic Beanstalk 서버를 배포중입니다.

 

CI/CD란? 

CI/CD는 지속적 통합(Continuous Integration) 및 지속적 제공/배포(Continuous Delivery/Deployment)를 의미하며, 소프트웨어 개발 라이프사이클을 간소화하고 가속화하는 것을 목표로 하는 방법론 입니다. (도구를 의미하는 것이 아닙니다!) CI/CD 방법론을 따르면 빌드부터 배포까지의 과정을 자동화할 수 있고, 배포가 잘 되는지 모니터링 할 수 있습니다.

 

CI와 CD를 나눠서 설명해 보겠습니다.

 

CI : 지속적 통합

CI는 Continuous Intergration(지속적 통합)을 줄인 표현입니다. 좀 더 구체적으로는 빌드와 테스트를 자동화 하는 과정이라고 설명할 수 있습니다. CI는 변경 사항을 자동으로 테스트해 애플리케이션에 문제가 없다는 것을 보장합니다. 그리고 코드를 정기적으로 빌드하고, 테스트하므로 여려 명이 동시에 작업을 하는 경우 충돌을 방지하고 모니터링 할 수 있습니다.

 

코드 변경 사항이 코드 저장소에 업로드되면 CI를 시작하고, CI 도중 문제가 생기면 실패하드로 코드의 오류도 쉽게 파악할 수 있습니다.

 

CD : 지속적 제공과 지속적 배포

CD는 CI 작업을 끝낸 다음 실행하는 작업입니다. 배포 준비가 된 코드를 자동으로 서버에 배포하는 작업을 자동화하는 것입니다. CI가 통과되면 개발자가 수작업으로 코드를 배포하지 않아도 자동으로 배포하니 개발자는 더욱 편리해 지겠죠. 따라 CD는 Continuous Delivery라는 지속적 제공과 Continuous Deployment라는 두 가지 의미를 가집니다.

 

지속적 제공

애플리케이션에 적용한 코드의 빌드와 테스트를 성공적으로 진행했을 때 깃허브와 같은 코드 저장소에 자동으로 업로드하는 과정을 말합니다. 최소의 노력으로 코드 배포를 쉽게 하는 것을 목표로 합니다.

 

지속적 배포

지속적 제공을 통해 성공적으로 병합한 코드 내역을 AWS와 같은 배포 환경으로 보내는 것을 의미합니다. (실무에서는 릴리즈라고 합니다.) 지속적인 배포는 지속적 제공의 다음 단계까지 자동화합니다. 즉, 개발자가 애플리케이션에 변경 사항을 커밋한 후 몇 분 이내에 애플리케이션을 자동으로 배포되어 적용됩니다.

 

깃허브 액션

깃허브 액션(Github Actions)은 깃허브에서 제공하는 서비스입니다. 리포지토리에 특정 이벤트가 발생하면 특정 작업을 하거나 주기적으로 특정 작업을 반복할 수 있게 합니다. 예를 들어 누군가 코드를 작성해 깃허브에 업데이트하면 해당 코드에 문제가 없는지 자동으로 코드를 빌드, 테스트한 이후 배포까지 할 수 있습니다.

 

CI 스크립트 작성하기

스프링 프로젝트를 열어주세요.

프로젝트 루트에 .github 폴더 를 생성하고, 그 안에 workflows 폴더를 만듭니다.

workflows 폴더 안에 ci.yml 파일을 추가합니다.

ci.yml의 다음 코드를 작성합니다.

# 워크플로우의 이름
name: CI

# 워크플로우가 시작될 조건
# main branch에서 push작업이 일어났을 때
on:
  push:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest # 실행 환경
    # 실행 스텝 지정
    steps:
      # uses: 지정한 리포지터리를 확인하고 코드에 대한 작업 실행
      - uses: actions/checkout@v3
      - uses: actions/setup-java@v3
        with:
            distribution: 'zulu'
            java-version: '17'
      # name: 스텝의 이름
      - name: Grant execute permission for gradlew
        run: chmod +x gradlew

      - name: Build with Gradle
        run: ./gradlew clean build


추가한 파일을 다음 명령어로 리포지토리에 푸시합니다.

git add .
git commit -m "CI 추가"
git push origin main

 

리포지토리에 Actions에 워크플로우가 보이고 파란색 체크 모양이 보인다면 성공입니다.

 

저는 추가로 secret을 사용하여 gitignore 상태의 파일을 만드는 것까지 했는데, 이와 관련된 게시물을 추후에 작성하겠습니다.

 

 

CD 작성하기

먼저 build.gradle에서 빌드 jar 파일만 생성하도록 그레이들 파일에 다음 코드를 작성해주세요.

jar {
     enabled = false
}

 

그리고 ci.yml 파일을 cicd.yml로 파일 이름을 바꿉니다.

 

 

파일의 맨 아래에 다음 코드를 작성합니다.

 

AWS_ACCESS_KEY_ID와 AWS_SECRET_ACCESS_KEY는 AWS IAM 사용자의 Key ID와 Secret입니다.  

      # CD
      # 현재 시간 가져오기
      - name: Get current Time
        uses: josStorer/get-current-time@v2.0.2
        id: current-time
        with:
          format: YYYY-MM-DDTHH-mm-ss
          utcOffset: "+09:00"

      # 배포용 패키지 경로 저장
      - name: Set artifact
        run: echo "artifact=$(ls ./build/libs)" >> $GITHUB_ENV

      # 빈스토크 배포
      - name: Beanstalk Deploy
        uses: einaregilsson/beanstalk-deploy@v20
        with:
          aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          application_name: byeolukye
          environment_name: Byeolukye-env
          version_label: github-action-${{steps.current-time.outputs.formattedTime}}
          region: ap-northeast-2
          deployment_package: ./

 

깃허브 시크릿을 추가하도록 하겠습니다. 프로젝트 리포지토리 > Setting > Security > Secrets and variables > New Repository Secret

 

Secret에는 각각 IAM 사용자의 Key ID와 Secret을 작성합니다.

 

cicd 파일을 커밋 한 후 push 하면 빌드 완료 후 ElasticBeanstalk를 통해 배포됩니다.

 


부족한 글 읽어주셔서 감사합니다!

궁금한 점이 있다면 댓글을 달아주세요 :)

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.