본 내용은 내일배움캠프에서 활동한 내용을 기록한 글입니다.
오늘 튜터님께서 CD workflow 멈춤 현상에 대한 다른 해결 방법을 알려주셨음 (아직까지 멈추지 않아서 적용하진 않음)
바로 Github Action VM(가상머신)에서 npm ci
와 npm run build
를 진행하고 생성된 빌드 파일을 SSH로 접속해서 EC2 인스턴스 서버에서는 pm2로 서버를 실행하는 방식임
순서를 따지면
npm ci
로 의존성 패키지 설치npm run build
를 진행해서 빌드 파일 생성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' }}
# 작업을 실행 할 VM의 OS 지정
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'
#!/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
내일은 튜터님과 일정 외 멘토링을 진행할 예정
튜터님께서 금요일에 발표할 PPT의 목차나 구성에 대해서 구상하라고 말씀하셨음
그래서 내일 오전 중으로 팀원들과 PPT에 대한 목차 및 어떤 내용이 들어갈지 구상할 예정
그러면서 문서 작업 및 발표에 대한 역할을 분담할 예정
오늘 튜터님께서 CD workflow 멈춤 현상에 대한 다른 방안을 알려주셨음
Github Action VM과 EC2 인스턴스와 각자 역할을 분담해서 CPU의 부담을 줄여주는 방법임
Github Action는 별도의 VM를 가지고 있다는 개념만 파악하면 구조와 실행 순서는 쉽게 파악할 수 있음
하지만 튜터님께서는 어떻게 이런 방법을 찾아내신 건지 정말 대단하다고 생각함
방법에 대한 코드를 받고 비슷한 내용을 찾으려고 해도 못 찾았음
일단 아직까진 이전 방식으로 CD workflow가 정상 동작하고 있으니 오늘 튜터님께서 알려주신 방법은 또 에러나서 멈추면 적용해볼 예정