8/24 21:17 업데이트

들어가며 ...


안녕하세요. bmart-5 팀의 추연호 입니다.

이번 프로젝트에서 Github actions와 S3, CodeDeploy를 활용하여 EC2에 자동 배포하는 환경을 구축했는데, 삽질의 과정이 꽤나 고되고, 힘들었기 때문에 도입을 고민하시는 다른 팀들의 시간을 줄여드리고자 간단하게 글을 작성하려고 합니다.

참고로 저희 팀의 배포 방식은 프로젝트 전체를 압축해서 EC2에 업로드하는 방식인데, 빌드 결과물만이 아니라 풀스택 코드가 전체가 업로드 되는 방식이라 (node_modules 포함 용량이 150MB 이상) 최적화된 방법은 아닙니다. builld 결과물만 배포하거나, node_modules 를 캐싱하거나, 클라이언트와 서버를 분리해서 배포하는 등으로 팀별로 최적화하신다면 조금 더 가볍고 안정적으로 배포하실 수 있을 거라고 생각합니다.

그럼 제가 성공한 방법에 대한 간단한 Step by Step 튜토리얼 방식으로 진행해 보겠습니다..!

깊은 이해가 부족할 수 있습니다.

Github Action workflow 생성


https://s3-us-west-2.amazonaws.com/secure.notion-static.com/46ae5afc-d9f6-4124-8c8d-0a5be3f9e5ef/_2020-08-23__5.47.40.png

Github Action은 프로젝트에서 Actions > set up a workflow yourself 를 클릭하면 생성할 수 있습니다. Github Action에서는 Runners 라고 불리는 Github에서 제공하는 머신을 제공해주는데, 이 workflow를 생성해서 Runner가 프로젝트의 코드를 가지고 할 동작을 정의할 수 있습니다.

저희 팀의 workflow 파일입니다.

name: Build & Deploy
env:
  PROJECT_NAME: bmart-5
on:
  push:
    branches:
      - master

jobs:
  build:
    runs-on: ubuntu-18.04
    steps:
      - uses: actions/checkout@v2
      - name: Use Node.js
        uses: actions/setup-node@v1
        with:
          node-version: '14.x'
      - name: Install Dependencies
        run: |
          yarn install
          yarn install:client
          yarn install:server

      - name: Build
        run: |
          cd client
          yarn build
          cd ..

      - name: Create env file
        run: |
          cd shared	
          touch .env	
          cat << EOF >> .env	
          ${{ secrets.ENV }}

      - name: Make tar file
        run: tar -cpvzf ./$GITHUB_SHA.tgz *
        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.tgz s3://bmart5-s3-bucket/$PROJECT_NAME/$GITHUB_SHA.tgz

      - name: Code Deploy
        run: aws deploy create-deployment --application-name bmart5-deploy --file-exists-behavior OVERWRITE --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name bmart5-deploy-group --s3-location bucket=bmart5-s3-bucket,bundleType=tgz,key=$PROJECT_NAME/$GITHUB_SHA.tgz
name: Build & Deploy
on:
  push:
    branches:
      - master

먼저 이 부분은, 이 workflow의 이름과, Runner가 trigger될 시점을 정의하는 곳입니다. master 브랜치에 push가 되었을 때 이 Build & Deploy 라는 workflow가 동작하는 것입니다.