Nest.js를 배워보자/13. NestJS + Docker 배포하기

CI/CD 구성 예시 (Continuous Integration/Continuous Deployment)

_Blue_Sky_ 2025. 12. 3. 12:53
728x90

 

CI/CD (Continuous Integration/Continuous Deployment)는 코드 변경 사항을 자동으로 테스트하고 빌드하여 프로덕션 환경까지 배포하는 자동화 파이프라인입니다. NestJS 프로젝트를 Docker와 함께 사용하면, "Docker 이미지 빌드""레지스트리 푸시" 단계가 핵심이 됩니다.

CI/CD를 통해 개발자는 코드를 병합(Merge)하는 순간부터 배포까지의 모든 과정을 자동화하여, 배포 속도를 높이고 인적 오류를 최소화할 수 있습니다.

 

A. CI/CD 파이프라인의 일반적인 단계

단계 목적 NestJS/Docker에서의 작업
빌드 (Build) 코드 컴파일 및 이미지 빌드 npm run build 실행 후, docker build 명령어로 최종 프로덕션 이미지 생성.
테스트 (Test) 기능 및 안정성 검증 유닛/통합 테스트(npm run test) 실행 및 빌드된 이미지의 기본 동작 확인.
푸시 (Push) 생성된 이미지를 저장소에 업로드 Docker Hub, AWS ECR, GitLab Registry 등 컨테이너 레지스트리에 태그(tag)를 붙여 푸시(push).
배포 (Deploy) 최종 환경에 서비스 적용 원격 서버에 SSH 접속 후, 새 이미지를 다운로드 및 구동 (예: docker-compose pull & up 또는 Kubernetes 적용).

B. GitHub Actions CI/CD 구성 예시

가장 널리 사용되는 CI/CD 도구 중 하나인 GitHub Actions를 사용하여, 코드가 main 브랜치에 푸시될 때 Docker 이미지를 빌드하고 Docker Hub에 발행하는 예시입니다.

이 파일은 프로젝트 루트의 .github/workflows/docker-ci.yml 경로에 저장됩니다.

# .github/workflows/docker-ci.yml

name: NestJS Docker CI/CD

on:
  push:
    branches: [ main ] # main 브랜치에 푸시될 때마다 워크플로우 실행
  pull_request:
    branches: [ main ]

jobs:
  build_and_push:
    runs-on: ubuntu-latest
    steps:
    
    # 1. 소스 코드 체크아웃
    - name: Checkout Code
      uses: actions/checkout@v4
      
    # 2. 유닛/통합 테스트 (선택 사항이지만 권장)
    - name: Run NestJS Tests
      run: |
        npm install
        npm run test:cov # 커버리지 테스트 실행
    
    # 3. Docker 레지스트리 로그인 (Docker Hub 예시)
    - name: Login to Docker Hub
      uses: docker/login-action@v3
      with:
        username: ${{ secrets.DOCKER_USERNAME }} # GitHub Secrets에 저장된 사용자 이름
        password: ${{ secrets.DOCKER_PASSWORD }} # GitHub Secrets에 저장된 비밀번호/토큰
        
    # 4. Docker 이미지 빌드 및 태그 지정
    - name: Build and Push Docker Image
      uses: docker/build-push-action@v5
      with:
        context: .
        push: true # 이미지 푸시 활성화
        tags: ${{ secrets.DOCKER_USERNAME }}/nestjs-app:latest # 최종 이미지 태그

    # 5. 원격 서버에 배포 (Deployment, 선택 사항)
    # 실제 배포 단계는 환경마다 복잡성이 다름 (AWS CodeDeploy, Kubernetes, SSH 등)
    - name: Deploy to Production Server via SSH
      uses: appleboy/ssh-action@v1.0.0
      with:
        host: ${{ secrets.SSH_HOST }}
        username: ${{ secrets.SSH_USERNAME }}
        key: ${{ secrets.SSH_PRIVATE_KEY }}
        script: |
          # 서버에서 최신 이미지 당겨받기
          docker pull ${{ secrets.DOCKER_USERNAME }}/nestjs-app:latest
          # 기존 컨테이너 중지 및 삭제
          docker-compose down
          # 새 이미지로 컨테이너 재구동
          docker-compose up -d
728x90

C. 핵심 고려 사항

  • Secrets 사용: 비밀번호, API 키, SSH 키 등 민감한 정보는 절대로 설정 파일에 노출하지 않고, CI/CD 도구의 **Secret 관리 기능 (예: GitHub Secrets)**을 사용해야 합니다.
  • 태그 전략: latest 태그 외에도 Git 커밋 해시나 버전 번호를 사용하여 이미지를 태그(tag)하면, 특정 버전으로 롤백(Rollback)하거나 문제를 추적하기 용이해집니다.
  • 배포 자동화: 최종 배포 단계에서는 Blue/Green 배포카나리 배포와 같은 무중단 배포 전략을 고려해야 합니다.

 

728x90