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
'Nest.js를 배워보자 > 13. NestJS + Docker 배포하기' 카테고리의 다른 글
| Docker Compose + MySQL (Local Development Environment) (0) | 2025.12.03 |
|---|---|
| 환경변수 관리 (0) | 2025.12.03 |
| Dockerfile 구성 (0) | 2025.12.03 |