ci-cd-for-personal-project-nestjs
✅ 1. Nest.js 프로젝트 셋팅 # nest new {프로젝트명}
$ nest new instagram-server
✅ 2. Github에 프로젝트 올리기 Github에서 Repository 만들기 실무에서는 Private Repository를 쓰는 경우가 많으므로 Private Repository로 만들자.
Github Repository에 프로젝트 코드 올리기 $ cd instagram-server
$ git init
$ git add .
$ git commit -m "first commit"
$ git branch -M main
$ git remote add origin _______
$ git push -u origin main
✅ 3. EC2에 들어가서 기본 환경 구성 EC2 구성하기
보안그룹 3000번 포트 열기 Nest.js가 기본적으로 3000번 포트에서 실행된다.
Node 설치하기 $ sudo apt-get update && /
sudo apt-get install -y ca-certificates curl gnupg && /
mkdir -p /etc/apt/keyrings && /
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && /
NODE_MAJOR=20 && /
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list && /
sudo apt-get update && /
sudo apt-get install nodejs -y
$ node -v # 잘 설치됐는 지 확인
Git clone을 활용해 프로젝트 다운받기 $ git clone {git repository clone 주소}** 참고) Private Repository를 clone할 경우 Github의 계정과 비밀번호를 입력해야 한다. 이 때, 비밀번호는 실제 Github 계정의 비밀번호가 아닌 Github 토큰을 입력해야 한다. 토큰을 발급받는 방법은 아래 링크를 참고하자.
EC2에서 clone 받은 서버가 잘 작동하는 지 확인하기 $ cd {프로젝트 경로}
$ npm i
$ npm run build
$ npm run start:prod
✅ 4. 실제 배포 환경처럼 pm2 활용해서 서버 실행시키기 $ sudo npm i -g pm2
$ pm2 start dist/main.js --name "backend-server"
$ pm2 list # 서버 잘 실행되고 있는 지 확인
$ pm2 logs # 서버 잘 실행됐는 지 로그 확인
✅ 5. 실제 코드가 업데이트 될 때 어떤 과정을 거쳐서 배포하는 지 짚어보기 내 컴퓨터에서 새로운 코드 작성 Commit 찍은 뒤 Github에 Push하기 EC2에 들어가서 Git Pull 받기 $ cd {프로젝트 경로}
$ git pull origin main빌드 후 재배포하기 $ npm i
$ npm run build
$ pm2 kill
$ pm2 start dist/main.js --name "backend-server"
✅ 6. 매번 Github 계정과 비밀번호를 치는 과정 없애기 배포를 할 때마다 Github 계정과 비밀번호를 일일이 치는 과정이 포함되어 있으면 배포를 자동화할 수가 없다. 따라서 최초 한 번만 작성하고 그 이후에는 Github 계정과 비밀번호를 입력하지 않아도 되게 만들어보자.
$ git config --global credential.helper store
$ git pull origin main
# Github 계정 및 비밀번호 입력
$ git pull origin main # 더 이상 비밀번호를 안 묻는 걸 확인할 수 있다. 참고
이 방식은 ~/.git-credentials에 로그인 정보를 저장해둠으로써 github 계정과 비밀번호를 따로 묻지 않는 방식이다. 이 방식의 단점은 EC2에 접근할 수 있는 모든 사용자가 내 Github 정보를 볼 수 있다는 점이 단점이다.
✅ 7. 지금까지 했던 코드 배포 과정을 자동화하기 .github/workflows/deploy.yml 작성하기 name: Deploy To EC2
on:
push:
branches:
- main
jobs:
Deploy:
runs-on: ubuntu-latest
steps:
- name: SSH로 EC2에 접속하기
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.EC2_HOST }} # EC2의 주소
username: ${{ secrets.EC2_USERNAME }} # EC2 접속 username
key: ${{ secrets.EC2_PRIVATE_KEY }} # EC2의 Key 파일의 내부 텍스트
script_stop: true # 아래 script 중 실패하는 명령이 하나라도 있으면 실패로 처리
script: |
cd /home/ubuntu/instagram-server # 여기 경로는 자신의 EC2에 맞는 경로로 재작성하기
git pull origin main
npm i
npm run build
pm2 kill
pm2 start dist/main.js --name "backend-server"SSH란 다른 컴퓨터로 원격 접속하는 방식을 의미한다. appleboy/ssh-action의 공식 문서
Github에 Secret값 넣어주기
Github에 Push해서 Github Actions 잘 작동하는 지 확인하기
실제 서버로 접속해서 잘 작동하는 지 확인하기
✅ 8. .env 파일 넣는 과정 자동화시키기 🧑🏻
현업 프로젝트에서는 민감한 값을 따로 .env로 분리하는 경우가 많다. 민감한 값이기에 .gitignore에 추가해서 .env가 버전관리 되지 않게 셋팅한다. 이 때문에 배포를 할 때 .env를 따로 넣어주어야 하는 귀찮은 과정이 포함된다. 이 과정을 자동화시켜보자.
.gitignore에 .env 추가 .gitignore
...
.env
.env 파일 만들기 .env
DB_NAME=jaeseong
DB_PASSWORD=password
Gitbub Actions 코드 수정하기 .github/workflows/deploy.yml
name: Deploy To EC2
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: SSH로 EC2에 접속하기
uses: appleboy/ssh-action@v1.0.3
env:
ENV: ${{ secrets.ENV }}
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
envs: ENV
script_stop: true
script: |
cd /home/ubuntu/cicd-nest-test
rm -rf .env
git pull origin main
echo "$ENV" > .env
npm i
npm run build
pm2 kill
pm2 start dist/main.js --name "backend-server"
Github에 Secret 값 넣어주기
실제 EC2에 .env 파일도 같이 배포 잘 됐는 지 체크하기
✅ 9. 테스트 코드 실행시키는 과정 자동화시키기 🧑🏻
CI/CD에서 CI에 테스트를 실행시키는 과정 이 일반적으로 포함되어 있다. 통합(Intergration) 하기 전에 테스트를 실행시키는 과정을 자동화 배포 과정에 추가시켜보자.
Nest.js 프로젝트에 내장되어 있는 테스트 코드가 잘 작동하는 지 실행해보기 $ npm run test
Gitbub Actions 코드 수정하기 name: Deploy To EC2
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Github Repository 파일 불러오기
uses: actions/checkout@v4
- name: Node 설치
uses: actions/setup-node@v4
with:
node-version: "20"
- name: 의존성(라이브러리) 설치
run: npm ci
- name: .env 파일 만들기
run: |
touch .env
echo '${{ secrets.ENV }}' >> .env
- name: 테스트 코드 실행
run: npm run test
- name: SSH로 EC2에 접속하기
uses: appleboy/ssh-action@v1.0.3
env:
ENV: ${{ secrets.ENV }}
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
envs: ENV
script_stop: true
script: |
cd /home/ubuntu/cicd-nest-test
rm -rf .env
git pull origin main
echo "$ENV" > .env
npm i
npm run build
pm2 kill
pm2 start dist/main.js --name "backend-server"npm i 대신에 npm ci 를 쓴 이유
테스트 코드 실패하면 배포가 안 되는 지 확인해보기