seong

Github Actions 사용해서 배포해보기 - v5 본문

AWS

Github Actions 사용해서 배포해보기 - v5

hyeonseong 2022. 11. 8. 15:57

1. Github의 main push

2. Github의 레포에 푸시가 되면Action에 hook이 동작한다.

3. 동작이 되면 테스트 서버의 ubuntu가 실행된다.

4. 파일들을 그럼 테스트 서버에서 git clone가 되고, 테스트가 순서대로 실행된다.

5. 모두 실행되면 deploy.zip이 만들어진다 - 여기까지 CI

CD 시작

6. 만들어진 zip파일을 Elastic에 던진다. -> 이때 시크릿 키를 담아서 준다.

7. AWS는 키를 보고 통과시켜줌

8. 압축을 푼다

9. make파일이 실행된다.

10. appstart파일을 만든다

11. proc 파일이 실행된다.

12. 그럼 appstart가 실행된다.

13. jar가 실행된다.

 

name: aws-v5
on:
  push:
    branches:
      - main

# actions/setup-java@v2는 사용자 정의 배포를 지원하고 Zulu OpenJDK, Eclipse Temurin 및 Adopt OpenJDK를 기본적으로 지원합니다. v1은 Zulu OpenJDK만 지원합니다.
jobs:
  build: # 마음대로 적어도됨.
    runs-on: ubuntu-18.04
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Set up JDK 11
        uses: actions/setup-java@v1
        with:
          java-version: 11
      - name: Grant execute permission for gradlew
        run: chmod +x ./gradlew
        shell: bash
      - name: Build with Gradle
        run: ./gradlew clean build
        shell: bash
    # UTC가 기준이기 때문에 한국시간으로 맞추려면 +9시간 해야 한다.
      - 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}}"
        shell: bash

      # EB에 CD 하기 위해 추가 작성
      - 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@v20
        with:
          aws_access_key: ${{ secrets.AWS_ACCESS_KEY }}
          aws_secret_key: ${{ secrets.AWS_SECRET_KEY }}
          application_name: aws-v5-beanstalk # 엘리스틱 빈스톡 애플리케이션 이름!
          environment_name: Awsv5beanstalk-env # 엘리스틱 빈스톡 환경 이름!
          version_label: aws-v5-${{steps.current-time.outputs.formattedTime}}
          region: us-east-1 # 서울 ap-northeast-2 버지니아북부 us-east-1
          deployment_package: deploy/deploy.zip

branches :main - main브랜치에 푸시 될 경우 동작

jobs - 임무, 해야할 일

runs-on - os의 버전이 들어가는 부분 

- 자바 설치

jdk가 있는 환경으로 checkout 해서 JDK버전 11을 설치

gradlew 에 권한을 주고 build gradlew를 실행 

TimeZone 설정

jar파일 생성 부분

deploy파일에 3가지를 복제

1. build 실행한 .jar 파일을 복제 해서 application.jar로 이름을 변경

2. Procfile이란 파일을 deploy에 복제

3. .ebxtensions를 deploy에 복제

복제가 끝나면 deploy폴더내부에 위 3가지를 압축한 deploy.zip을 만듬 

EB 배포 (deploy.zip)

1. EB는 zip압축을 푼다.

2. 

makeFiles 내용 - 가장 먼저 실행되는 스크립트 파일이다. appstart라는 파일을 생성하는 역할 

/sbin/appstart 라는 파일 생성(sbin은 어디에서나 실행되는 파일)

mode 권한은 000755 

#! ~~ bash 는 해당 파일이 bash로 작동한다는 것을 알림 

배포를 하면 .zip 압축되어있던 것들을 모두 var/app/current에 모두 압축을 풀어 배포함.

deploy라는 파일 내부 

- 폴더 3개 deploy.zip(jar파일 포함)

- 이것을 서버에 던져줌

 이후 makrFiles가 실행.

압축을 푼다.

Proc파일이 읽어진다. 

이후 makeFiles의 #run app 부분이 실행된다.


push후 깃에가서 Actions가면 그대로 실행하고 에러가 발생하지 않았다면 성공이 되어있다.

여기까지 되었으면 jar파일이 만들어져있고 이것을 서버에 주면된다. 

만약 에러가 발생했다면 아래 처럼 나온다.

이것을 해결하고 push 하면 jar파일이 다시 생성된다 - 여기 까지 CI

jar까지 만들어졌다면 AWS 서버에 줘야하는데, 서로 다른 플랫폼이다. 그래서 신뢰를 하지못한다.

이때 필요한 경우가 신뢰할 수 있는 키 값이 필요하다.이때 IAM사용자가 필요한데 외부 라이브 러리이기 때문에 IAM사용자 회원가입이 필요하다.

그렇다고 키만 필요한가? 그것이 또 아니다 서버에 주고 난 후 어떤 행동을 할지 설정해서 같이 주어야한다.

 

 

참고 해야할 문서

https://docs.github.com/en/actions

 

'AWS' 카테고리의 다른 글

AWS v5 - IAM 키 생성  (0) 2022.11.08
aws배포된것 삭제 하기  (0) 2022.11.07
timezone 서울로 셋팅  (0) 2022.11.03
AWS - MobaXerm을 사용해 간단하게 서버 실행 해보기  (0) 2022.09.28
AWS - EC2 인스턴스 셋팅 및 시작  (0) 2022.09.28