EC2 + Github Actions로 Next.js 배포 및 자동화(CI/CD) - 4편: Github Actions workflow분석

류하준·2022년 10월 16일
5
post-thumbnail
post-custom-banner

Github Actions는 레포지토리의 .github/workflows 하위의 yml파일을 기반으로 동작한다.
Github Actions -> S3 -> CodeDeploy -> EC2로 배포되도록 작성된 workflow를 분석해보자.

Deploy.yml

# workflow의 이름을 설정해준다.
name: CI/CD

# workflow가 작동되는 이벤트를 정의한다.
# 해당 workflow같은 경우는 main branch에 push 될 경우 작동된다.
on:
  push:
    branches:
      - main

# 아래 S3와 CodeDeploy에서 사용 될 env값을 정의한다.
# 이 값은 2편과 3편에서 설정해준 S3의 버킷명과
# CodeDeploy의 applicationName, groupName과 일치해야한다.
env:
  S3_BUCKET_NAME: dev-recruit.mash-up.kr
  CODE_DEPLOY_APPLICATION_NAME: dev-recruit-code-deploy
  CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: dev-recruit

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: 16

      # pacakge.json에 명시된 의존성을 설치한다.
      - name: Install dependencies
        run: yarn install

      # 프로젝트를 빌드한다.
      - name: Build next app
        run: yarn build

      # S3에 올리기 전 빌드파일을 압축해준다.
      # 여기서 $GITHUB_SHA라는 값을 사용하는데 이 값은 Github에서 기본적으로 제공하는 환경변수다.
      # $GITHUB_SHA는 해당 워크플로우를 트리거 한 커밋의 고유값이 할당되어있다.
      - name: Make zip file
        run: zip -qq -r ./$GITHUB_SHA.zip . -x "node_modules/*"
        shell: bash

      # 2편에서 만든 IAM사용자를 이용해 AWS 서비스에 접근하는데 필요한 권한을 얻어오는 단계이다.
      - name: Configure AWS credentials
        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: ap-northeast-2

      # Make zip file 단계에서 압축된 빌드 파일을 S3 버킷에 업로드하는 단계이다.
      - name: Upload to S3
        run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$S3_BUCKET_NAME/$GITHUB_SHA.zip

      # S3에 업로드 된 빌드 파일을 이용해 CodeDeploy가 정의된 동작을 하도록 트리거해주는 단계이다.
      # CodeDeploy의 동작에 대한 정의는 다음편에서 다뤄볼것이다.
      - name: Code Deploy
        run: |
          aws deploy create-deployment \
          --deployment-config-name CodeDeployDefault.AllAtOnce \
          --application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \
          --deployment-group-name ${{ env.CODE_DEPLOY_DEPLOYMENT_GROUP_NAME }} \
          --s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=$GITHUB_SHA.zip

주석이 제거된 Deploy.yml

name: CI/CD

on:
  push:
    branches:
      - main

env:
  S3_BUCKET_NAME: dev-recruit.mash-up.kr
  CODE_DEPLOY_APPLICATION_NAME: dev-recruit-code-deploy
  CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: dev-recruit

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: 16

      - name: Install dependencies
        run: yarn install

      - name: Build next app
        run: yarn build

      - name: Make zip file
        run: zip -qq -r ./$GITHUB_SHA.zip . -x "node_modules/*"
        shell: bash

      - name: Configure AWS credentials
        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: ap-northeast-2

      - name: Upload to S3
        run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$S3_BUCKET_NAME/$GITHUB_SHA.zip

      - name: Code Deploy
        run: |
          aws deploy create-deployment \
          --deployment-config-name CodeDeployDefault.AllAtOnce \
          --application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \
          --deployment-group-name ${{ env.CODE_DEPLOY_DEPLOYMENT_GROUP_NAME }} \
          --s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=$GITHUB_SHA.zip

이로써 Github Actions의 workflow를 모두 작성했다!
다음편에서 CodeDeploy의 동작에 대한 정의를 하는 appspec.yml파일을 작성해보자

post-custom-banner

3개의 댓글

comment-user-thumbnail
2023년 4월 18일

선생님....돌아오세요.ㅡㅜㅠ

답글 달기
comment-user-thumbnail
2023년 6월 7일

선생님....돌아오세요22

답글 달기
comment-user-thumbnail
2023년 8월 23일

다음편 궁긍합니다!

답글 달기