[2024.08.06 TIL] 내일배움캠프 79일차 (최종 팀프로젝트, 빌드 파일만 EC2 서버로 옮겨서 실행)

My_Code·2024년 8월 6일
0

TIL

목록 보기
94/112
post-thumbnail

본 내용은 내일배움캠프에서 활동한 내용을 기록한 글입니다.


💻 TIL(Today I Learned)

📌 Today I Done

✏️ 빌드 파일만 EC2 서버로 옮겨서 실행

  • 오늘 튜터님께서 CD workflow 멈춤 현상에 대한 다른 해결 방법을 알려주셨음 (아직까지 멈추지 않아서 적용하진 않음)

  • 바로 Github Action VM(가상머신)에서 npm cinpm run build를 진행하고 생성된 빌드 파일을 SSH로 접속해서 EC2 인스턴스 서버에서는 pm2로 서버를 실행하는 방식임

  • 순서를 따지면

    1. 코드 변경 후 PUSH
    2. CI workflow 진행
    3. CD workflow 진행
    4. 이 때 EC2 인스턴스 서버에 바로 접속하지 않고 Github Action VM에서 진행
    5. Github Action VM에서 workflow에 있는 소스 코드 복사해 가져옴
    6. Github Action VM에서 Node.js 설치하고 npm ci로 의존성 패키지 설치
    7. 이어서 npm run build를 진행해서 빌드 파일 생성
    8. SSH로 EC2 인스턴스 접속
    9. 생성된 빌드 파일을 EC2 인스턴스 서버로 복사
    10. pm2 start ...를 통해서 복사된 빌드 파일 실행
  • 즉, 리소스를 많이 잡아먹는 npm ci를 Github Action VM에서 진행하고 배포 시 실행할 코드인 빌드 파일들만 따로 EC2 인스턴스로 가져와서 서버 실행함

  • 아래는 기존의 cd.yml 파일을 변경한 내용임

name: Sparta Nest.js CD

on:
  workflow_dispatch: # 수동 실행
  workflow_run: # 특정 workflow가 실행됐을 때
    workflows: ['Sparta Nest.js CI'] # CI workflow
    types: [completed] # 완료 되었을 때
    branches: [main] # main 브랜치

env:
  PROJECT_DIR: /home/ubuntu/Give_me_the_ticket

jobs:
  deploy:
    # workflow 완료 후 결과가 성공 일 때
    if: ${{ github.event.workflow_run.conclusion == 'success' }}
    # 작업을 실행 할 VMOS 지정
    runs-on: ubuntu-24.04
    timeout-minutes: 3

    # 작업 내의 단위 작업(step)을 정의
    steps:
      # 소스 코드 가져오기
      - name: Checkout source code # step의 이름 지정 (선택 사항)
        uses: actions/checkout@v4 # 소스 복사를 위해 미리 정의 된 workflow를 불러와서 사용

      # VM에 Node.js 설치하기
      - name: Setup Node.js environment # step의 이름 지정 (선택 사항)
        uses: actions/setup-node@v4 # Node.js 설치를 위해 미리 정의 된 workflow를 불러와서 사용
        with:
          node-version: 20 # 설치 할 Node.js 버전 지정
          cache: 'npm' # npm 사용 시 'npm'

      # 의존성 패키지 설치하기
      - name: Install dependencies # step의 이름 지정 (선택 사항)
        run: |

          # package-lock.json 파일에 저장 된 버전 정보와 동일하게 설치
          npm ci
          npm run build

      # SSH 접속 후 명령을 통해서 배포 진행
      - name: Configure SSH
        run: |
          mkdir -p ~/.ssh/
          echo "$SSH_KEY" > ~/.ssh/ec2.key
          chmod 400 ~/.ssh/ec2.key
          cat >>~/.ssh/config <<END
          Host ec2
            HostName $SSH_HOST
            User $SSH_USER
            IdentityFile ~/.ssh/ec2.key
            StrictHostKeyChecking no
          END
        env:
          SSH_USER: ${{ secrets.AWS_EC2_USERNAME }}
          SSH_KEY: ${{ secrets.AWS_EC2_PEM_KEY }}
          SSH_HOST: ${{ secrets.AWS_EC2_HOST }}

      - name: Prepare to deploy
        run: ssh ec2 'cd ${{ env.PROJECT_DIR }} && git switch main && git pull && echo "${{ secrets.ENV }}" > .env'

      - name: Copy file to EC2
        run: rsync -avzP -e ssh ./dist ec2:${{ env.PROJECT_DIR }}/

      - name: Restart PM2
        run: ssh ec2 'cd ${{ env.PROJECT_DIR }} && ./scripts/run.sh'
  • 아래 코드는 EC2 인스턴스 서버에서 진행될 명령어
#!/bin/bash

# node, npm, yarn 명령어 사용을 위한 설정 (.bashrc 파일에 추가되어 있는 내용)
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

# PM2로 실행 중인 서버 중지 및 삭제
pm2 delete Ticketing

# 서버를 PM2로 실행
pm2 --name Ticketing start dist/src/main.js

# PM2 설정 저장 (선택사항, startup 설정을 해놨다면)
pm2 save


📌 Tomorrow's Goal

✏️ PPT 목차 및 기본 틀 구상

  • 내일은 튜터님과 일정 외 멘토링을 진행할 예정

  • 튜터님께서 금요일에 발표할 PPT의 목차나 구성에 대해서 구상하라고 말씀하셨음

  • 그래서 내일 오전 중으로 팀원들과 PPT에 대한 목차 및 어떤 내용이 들어갈지 구상할 예정

  • 그러면서 문서 작업 및 발표에 대한 역할을 분담할 예정



📌 Today's Goal I Done

✔️ 빌드 파일만 EC2 서버로 옮겨서 실행

  • 오늘 튜터님께서 CD workflow 멈춤 현상에 대한 다른 방안을 알려주셨음

  • Github Action VM과 EC2 인스턴스와 각자 역할을 분담해서 CPU의 부담을 줄여주는 방법임

  • Github Action는 별도의 VM를 가지고 있다는 개념만 파악하면 구조와 실행 순서는 쉽게 파악할 수 있음

  • 하지만 튜터님께서는 어떻게 이런 방법을 찾아내신 건지 정말 대단하다고 생각함

  • 방법에 대한 코드를 받고 비슷한 내용을 찾으려고 해도 못 찾았음

  • 일단 아직까진 이전 방식으로 CD workflow가 정상 동작하고 있으니 오늘 튜터님께서 알려주신 방법은 또 에러나서 멈추면 적용해볼 예정


profile
조금씩 정리하자!!!

0개의 댓글