JSCODE Logo
면접 스터디블로그후기멘토진
회사명 : JSCODE대표 : 박재성사업자 등록번호 : 244-22-01557통신판매업 : 제 2023-인천미추홀-0381 호
학원 명칭 : 제이에스코드(JSCODE)원격학원학원설립ㆍ운영 등록번호 : 제6063호

서울특별시 구로구 경인로 20가길 11(오류동, 아델리아)

Copyright ⓒ 2025 JSCODE - 최상위 현업 개발자들의 프로그래밍 교육 All rights reserved.

이용약관개인정보처리방침
← 블로그 목록으로 돌아가기

[실습] 개인 프로젝트에서 많이 쓰는 CI/CD 구축 방법 (Nest.js)

JSCODE 박재성
JSCODE 박재성
2025-12-01
author
JSCODE 박재성
category
CI/CD
createdAt
Dec 1, 2025
series
비전공자도 이해할 수 있는 CI/CD 입문
slug
ci-cd-for-personal-project-nestjs
type
post
updatedAt
Dec 1, 2025 12:06 PM

✅ 1. Nest.js 프로젝트 셋팅

# nest new {프로젝트명} $ nest new instagram-server
 

✅ 2. Github에 프로젝트 올리기

  1. Github에서 Repository 만들기
    1. 실무에서는 Private Repository를 쓰는 경우가 많으므로 Private Repository로 만들자.
       
  1. Github Repository에 프로젝트 코드 올리기
    1. $ 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에 들어가서 기본 환경 구성

  1. EC2 구성하기
    1.  
  1. 보안그룹 3000번 포트 열기
    1. Nest.js가 기본적으로 3000번 포트에서 실행된다.
       
  1. Node 설치하기
    1. $ 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 # 잘 설치됐는 지 확인
       
       
  1. Git clone을 활용해 프로젝트 다운받기
    1. $ git clone {git repository clone 주소}
      ** 참고) Private Repository를 clone할 경우 Github의 계정과 비밀번호를 입력해야 한다. 이 때, 비밀번호는 실제 Github 계정의 비밀번호가 아닌 Github 토큰을 입력해야 한다. 토큰을 발급받는 방법은 아래 링크를 참고하자.
      github 토큰 발급하기
      위와 같이 private으로 된 repository를 다운받으려고 하면 github의 아이디와 비밀번호를 입력하라고 한다. 그런데 이걸 맨날 private에서 public으로 바꿔서 하기엔 너무 귀찮다. 실제로도 그렇게 어렵지 않다. 5분을 참으면 하루가 편해진다. g
      github 토큰 발급하기
      https://velog.io/@nara7875/github-토큰-발급하기
      github 토큰 발급하기
       
       
  1. EC2에서 clone 받은 서버가 잘 작동하는 지 확인하기
    1. $ 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. 실제 코드가 업데이트 될 때 어떤 과정을 거쳐서 배포하는 지 짚어보기

  1. 내 컴퓨터에서 새로운 코드 작성
  1. Commit 찍은 뒤 Github에 Push하기
  1. EC2에 들어가서 Git Pull 받기
    1. $ cd {프로젝트 경로} $ git pull origin main
  1. 빌드 후 재배포하기
    1. $ 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, Pull/Push할 때 id password 묻지 않게 하기
배경
Git, Pull/Push할 때 id password 묻지 않게 하기
https://pinedance.github.io/blog/2019/05/29/Git-Credential
 
이 방식은 ~/.git-credentials에 로그인 정보를 저장해둠으로써 github 계정과 비밀번호를 따로 묻지 않는 방식이다. 이 방식의 단점은 EC2에 접근할 수 있는 모든 사용자가 내 Github 정보를 볼 수 있다는 점이 단점이다.
 
 

✅ 7. 지금까지 했던 코드 배포 과정을 자동화하기

  1. .github/workflows/deploy.yml 작성하기
    1. 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의 공식 문서
        • SSH Remote Commands - GitHub Marketplace
          Executing remote ssh commands
          SSH Remote Commands - GitHub Marketplace
          https://github.com/marketplace/actions/ssh-remote-commands
          SSH Remote Commands - GitHub Marketplace
       
       
  1. Github에 Secret값 넣어주기
    1. notion image
      notion image
 
  1. Github에 Push해서 Github Actions 잘 작동하는 지 확인하기
    1. notion image
 
  1. 실제 서버로 접속해서 잘 작동하는 지 확인하기
 
🧑🏻
벌써 자동 배포 셋팅이 끝났다! 😊😊
 

✅ 8. .env 파일 넣는 과정 자동화시키기

🧑🏻
현업 프로젝트에서는 민감한 값을 따로 .env로 분리하는 경우가 많다. 민감한 값이기에 .gitignore에 추가해서 .env가 버전관리 되지 않게 셋팅한다. 이 때문에 배포를 할 때 .env를 따로 넣어주어야 하는 귀찮은 과정이 포함된다. 이 과정을 자동화시켜보자.
  1. .gitignore에 .env 추가
    1. .gitignore
      ... .env
       
       
  1. .env 파일 만들기
    1. .env
      DB_NAME=jaeseong DB_PASSWORD=password
       
       
  1. Gitbub Actions 코드 수정하기
    1. .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"
       
  1. Github에 Secret 값 넣어주기
    1.  
  1. 실제 EC2에 .env 파일도 같이 배포 잘 됐는 지 체크하기
 

✅ 9. 테스트 코드 실행시키는 과정 자동화시키기

🧑🏻
CI/CD에서 CI에 테스트를 실행시키는 과정이 일반적으로 포함되어 있다. 통합(Intergration) 하기 전에 테스트를 실행시키는 과정을 자동화 배포 과정에 추가시켜보자.
 
  1. Nest.js 프로젝트에 내장되어 있는 테스트 코드가 잘 작동하는 지 실행해보기
    1. $ npm run test
       
  1. Gitbub Actions 코드 수정하기
    1. 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를 쓴 이유
      npm install vs npm ci :: 마이구미
      이 글은 npm install 과 npm ci. 명령어를 비교해본다. 두 명령어 모두 의존성 목록을 설치하는 것이지만, 서로 다른 방향을 가진다. 둘 사이의 차이점을 이해하면 유용하게 사용할 수 있을 것이다. 다른 패키지 매니저(yarn) 가 아닌 npm 을 기준으로 다루게 된다. 우선 npm install 명령어는 우리가 알다시피 특정 파일과 밀접한 관계가 있다. package.json package-lock.json 두 파일을 간단하게 살펴보자. package.json 은 우리가 설치하고자 하는 모듈에 대한 의존성 목록이 존재한다. 여기서 의존성 목록의 버전은 version range 를 따르고 있다. (~, ^
      npm install vs npm ci :: 마이구미
      https://mygumi.tistory.com/409
      npm install vs npm ci :: 마이구미
 
 
  1. 테스트 코드 실패하면 배포가 안 되는 지 확인해보기
    1. notion image
 
 
author
category
createdAt
series
비전공자도 이해할 수 있는 CI/CD 입문
slug
type
series-footer
updatedAt
Dec 6, 2025 12:46 AM
📎
이 글은 비전공자도 이해할 수 있는 CI/CD 입문·실전 강의의 수업 자료 중 일부입니다.