DevOps/AWS

[Github Actions] NestJS 애플리케이션 AWS에 배포하기 06

kyoulho 2023. 3. 23. 19:18

인프라 구성도

저번 시간에 이어 Github Actions를 설정하고 workflow 파일을 작성하겠습니다.

 

 

Github Actions에 Secret 설정하기

Github 레포지토리의 Settings > Secrets and variables > Actions 탭을 선택하고 New repository secret을 선택합니다.

이전에 S3에 접근하기 위해 생성한 사용자 정보와 데이터베이스 정보와 OAuth 정보를 등록합니다.

 

Workflow 파일 작성하기

프로젝트 디렉토리에 .github/workflows/workflow.yml 파일을 생성합니다. 파일명은 사실 아무거나 괜찮다고 합니다.

name: Deploy NestJs Application

on:
  push:
    branches: [ release ]
  pull_request:
    branches: [ release ]
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-20.04
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v3

      - name: Setup Node.js 18.12.1
        uses: actions/setup-node@v3
        with:
          node-version: 18.12.1
          cache: 'npm'

      - name: Install Dependencies
        run: npm install

      - name: Create .env file
        run: |
       	  jq -r 'to_entries | map(select(.key != "AWS_ACCESS_KEY_ID" and .key != "AWS_SECRET_ACCESS_KEY")| "\(.key)=\(.value|tostring))" | .[]' <<< "$SECRETS_CONTEXT" > .env
        env:
          SECRETS_CONTEXT: ${{ toJson(secrets) }}

      - name: Build a Nest Application
        run: npm run build
        shell: bash

      - name: Make a zip file
        run: zip -r ./${{ env.PROJECT_NAME }}.zip . -x "node_modules/*" "coverage/*" "src/*" "test/*" "README.md" "*.git*"
        shell: bash

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v2
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ env.REGION }}

      - name: Upload to S3
        run: aws s3 cp --region ${{ env.REGION }} ./${{ env.PROJECT_NAME }}.zip s3://${{ env.S3_BUCKET_NAME }}/${{ env.PROJECT_NAME }}/${{ env.PROJECT_NAME }}.zip

      - name: Request Deployment
        run: aws deploy create-deployment --application-name ${{ env.AWS_CODEDEPLOY_APPLICATION_NAME }} --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name ${{ env.AWS_CODEDEPLOY_DEPLOYMENT_GROUP_NAME }} --s3-location bucket=${{ env.S3_BUCKET_NAME }},bundleType=zip,key=${{ env.PROJECT_NAME }}/${{ env.PROJECT_NAME }}.zip

    env:
      REGION: ap-northeast-2
      # S3 버킷 이름
      S3_BUCKET_NAME: <버킷 이름>
      # S3 버킷 내 디렉토리 이름
      PROJECT_NAME: <디렉토리 이름>
      # CodeDeploy 애플리케이션 이름
      AWS_CODEDEPLOY_APPLICATION_NAME: <CodeDeploy 애플리케이션 이름>
      # CodeDeploy 배포 그룹 이름
      AWS_CODEDEPLOY_DEPLOYMENT_GROUP_NAME: <CodeDeploy 배포 그룹 이름>

name만으로 충분히 어떤 일을 하는지 이해되실거라 생각됩니다.

여기까지 진행했다면 release 브랜치에 push 혹은 merge 하여 정상 작동하는지 확인해 주세요. S3에 업로드되는지도 확인해 주시고요.

Actions탭에서 빌드 진행 로그를 확인할 수 있으니 문제가 있다면 로그를 보고 수정해 주세요.