Github Action 과 Elastic Beanstalk 배포 자동화

흑이·2023년 12월 21일
0

8월달에 배포를 해봤는데.. 뒤늦게 정리를 해본다.


CI/CD

  • 서비스를 배포하고 운영하던 중에 코드를 변경할 일이 생기면 코드를 수정하고, 로컬 환경에서 테스트를 진행, 빌드 후 jar 파일을 생성 AWS에 jar 파일 업로드하여 배포 버전을 실행해야 한다.

  • 전에 다니던 회사가 딱 저런 상황이여서 저 반복되는 작업이 얼마나 불편한지 잘 알고 있다...

  • 빌드부터 배포까지의 과정을 자동화할 수 있고, 배포가 잘 되는지 모니터링을 할 수 있는 방법이 CI/CD 이다.



CI 지속적 통합

  • 개발자를 위해 빌드와 테스트를 자동화하는 과정

  • CI는 변경 사항을 자동으로 테스트해 애플리케이션에 문제가 없다는 것을 보장

  • 수정된 코드가 저장소에 업로드되면 CI를 시작, 실패하면 코드의 오류를 쉽게 파악할 수 있다.


CD 지속적 제공, 지속적 배포

  • CI 작업이 끝난 후 실행하는 작업
  • 수정된 코드를 자동으로 서버에 배포하는 작업을 자동화

지속적 제공

  • 애플리케이션에 적용할 코드의 빌드와 테스트 후 깃허브 같은 저장소에 자동으로 업로드하는 과정

지속적 배포

  • 지속적 제공을 통해 성공적으로 병합한 코드 내역을 AWS와 같은 배포 환경으로 보내는 것(release)


Github Action

  • 깃허브에서 제공하는 서비스

  • 저장소에 특정 이벤트(코드 업데이트)가 발생하면 코드를 빌드, 테스트한 이후 배포까지 작업을 반복할 수 있다.



1. EB 생성

  • EC2, Code Deploy를 통해 배포환경을 구성하고, 로드밸런서 연결, 오토스케일링 그룹을 생성 연결하는 모든 행위가 이 Beanstalk에서는 자동으로 이루어진다.

  • 개발자는 코드를 업로드하기만 하면 Elastic Beanstalk가 프로비저닝, 로드 밸런싱, Auto Scaling, 애플리케이션 상태 모니터링, 배포를 자동으로 처리



2. github script 작성

  • .github 디렉터리 생성, 그 안에 workflows 디렉터리를 다시 만들고 cicd.yml 파일 생성

// 1 워크플로의 이름 지정
name: Deploy Device API Server

// 2 워크플로가 시작될 조건 지정
on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest  // 3.실행 환경 지정
    // 4. 실행스텝지정
    steps:

      - name: Checkout source code
        uses: actions/checkout@v2

      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          distribution: 'corretto'
          java-version: '17'
          cache: 'gradle'

      - name: Add permission for gradlew
        run: chmod +x ./gradlew
        shell: bash

      - name: Build with Gradle
        run: ./gradlew clean build -x=jar
        shell: bash

		// 5. 현재 시간 가져오기
      - name: time for Versioning
        uses: 1466587594/get-current-time@v2
        id: current-time
        with:
          format: YYYY-MM-DDTHH-mm-ss
          utcOffset: "+09:00"
          
		// 6. 배포용 패키지 경로 저장
      - name: Set artifact
        run: echo "artifact=$(ls ./build/libs)" >> $GITHUB_ENV

		// 7. 빈스토크 배포
      - name: 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: awskk
          environment_name: awskk-env
          version_label: main-${{ steps.current-time.outputs.formattedTime }}
          region: ap-northeast-2
          deployment_package: ./build/libs/${{env.artifact}}
          wait_for_environment_recovery: 30

    1. 워크플로의 이름을 지정
    1. 워크플로를 시작할 트리거 조건 지정, main 브랜치에 푸시를 할 때마다 워크플로 시작
    1. 리눅스나 윈도우와 같은 실행 환경을 지정
    1. 실행 스텝을 그룹화, 작업work(uses) 또는 명령어(run)로 이루어 짐

실행 스텝 그룹화 정리

  • name : 스텝의 이름을 지정

  • uses : uses 키워드는 지정한 리포지토리를 확인하고 코드에 대한 작업을 실행

  • action/check-out : checkout이라는 작업의 v2 버전을 실행

  • run : run 키워드는 실행할 명령어를 입력합니다. ./gradlew clean build에는 그레들을 사용해 프로젝트를 빌드 이전 상태로 돌리고 다시 빌드하는 명령어를 실행합니다.


    1. 1466587594/get-current-time 기존의 Momentjs을 지원하여 동일한 포맷을 사용하면 된다고 한다.
  • Momentjs는 javaScript 날짜 라이브러리

    1. 빌드 이후에 생성된 jar 파일을 찾아 artifact 환경 변수에 값을 넣음, $GITHUB_ ENV를 통해 깃허브 워크플로 전체적으로 사용할 수 있는 환경 변수를 설정 가능
    1. einaregilsson/beanstalk-deploy 플러그인을 사용해 빈스토크 배포를 진행
  • secrets.AWS_ACCESS_KEY_ID와 secrets.AWS_SECRET_ACCESS_KEY는 깃허브 액션에서 가져오는 비밀값

  • 이 값은 AWS에서 만든 뒤 깃허브에서 설정해야 한다.

  • 애플리케이션 이름(application_name)과 환경 이름(environment_name)은 일래스틱 빈스토크에서 확인할 수 있다.




3. IAM 사용자 생성 및 권한 부여

  • AWSElasticBeanstalk 권한은 빈스토크를 사용하기 위해 필요한 모든 관리 권한을 사용자에게 제공하는 권한, 테스트용이기 때문에 권한을 부여 한다.

  • 액세스 키 생성
  • 보안 자격 증명 -> 액세스 키 만들기 -> 서드 파티 서비스 -> 태그 값 지정


4.github repo 비밀키 등록

  • 생성된 액세스키를 깃허브 레포에 접속하여 비밀키를 등록


5. 배포

  • 작업을 한 뒤 리포지터리에 업로드하면 깃허브 액션이 빌드를 자동으로 실행하고, 빌드에 성공하면 새 버전을 빈스토크에 배포된다.

  • 빌드 버튼을 클릭하면 빌드 과정에 대한 로그를 확인할 수 있다.

  • 빈스토크 도메인에 접속해보면 정상적으로 배포된 화면을 볼 수 있다.


참고
https://goldenrabbit.co.kr/2023/07/05/github-actions%EB%A1%9C-%EB%B0%B0%ED%8F%AC-%EC%9E%90%EB%8F%99%ED%99%94%ED%95%B4-%EB%B3%B4%EA%B8%B0a-k-a-ci-cd-1%ED%8E%B8/

https://goldenrabbit.co.kr/2023/07/05/github-actions%ec%9c%bc%eb%a1%9c-%eb%b0%b0%ed%8f%ac-%ec%9e%90%eb%8f%99%ed%99%94%ed%95%b4-%eb%b3%b4%ea%b8%b0a-k-a-ci-cd-2%ed%8e%b8/

https://jojoldu.tistory.com/549

https://sooolog.dev/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-Github-Action%EA%B3%BC-Beanstalk%EC%9C%BC%EB%A1%9C-CI,CD-%ED%95%98%EA%B8%B0-A%EB%B6%80%ED%84%B0-Z%EA%B9%8C%EC%A7%80-(2)/

https://wonit.tistory.com/596

0개의 댓글