icon

CI/CD 파이프라인 구축


 지속적 통합(CI)과 지속적 배포(CD)는 현대 소프트웨어 개발의 핵심 실천 사항입니다.

 CI/CD는 코드 변경사항을 자주, 안정적으로 제공하며 자동화된 빌드, 테스트, 배포 프로세스를 통해 개발 생산성과 소프트웨어 품질을 향상시킵니다.

CI/CD의 이점

  1. 빠른 피드백 루프 : 버그 조기 발견 및 수정
  2. 생산성 향상 : 수동 작업 감소
  3. 일관된 릴리스 프로세스 : 인적 오류 최소화
  4. 품질 향상 : 자동화된 테스트로 신뢰성 증가
  5. 빠른 배포 : 새로운 기능을 신속하게 사용자에게 제공

GitHub Actions 기반 CI/CD 파이프라인

 GitHub Actions 워크플로우 파일 (.github/workflows/main.yml)

name: NestJS CI/CD
 
on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]
 
jobs:
  build:
    runs-on: ubuntu-latest
 
    steps:
    - uses: actions/checkout@v2
 
    - name: Use Node.js
      uses: actions/setup-node@v2
      with:
        node-version: '14.x'
 
    - name: Install dependencies
      run: npm ci
 
    - name: Run linter
      run: npm run lint
 
    - name: Run tests
      run: npm test
 
    - name: Build
      run: npm run build
 
  deploy:
    needs: build
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
 
    steps:
    - uses: actions/checkout@v2
 
    - name: Deploy to production
      uses: azure/webapps-deploy@v2
      with:
        app-name: my-nestjs-app
        publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}

 이 워크플로우는 코드를 체크아웃하고 의존성을 설치하며 린팅, 테스트, 빌드를 수행한 후 메인 브랜치에 푸시된 경우 Azure Web App에 배포합니다.

다양한 CI/CD 도구 비교

 1. Jenkins

  • 장점 : 높은 커스터마이징 가능성, 다양한 플러그인
  • 단점 : 설정과 유지보수가 복잡할 수 있음
  • NestJS 적용 : Jenkinsfile을 사용하여 파이프라인 정의

 2. GitLab CI

  • 장점 : GitLab과의 통합이 원활, 컨테이너 기반 실행
  • 단점 : GitLab에 종속적
  • NestJS 적용 : .gitlab-ci.yml 파일로 파이프라인 구성

테스트 자동화 통합

  1. 단위 테스트
- name: Run unit tests
  run: npm run test
  1. 통합 테스트
- name: Run integration tests
  run: npm run test:integration
  1. E2E 테스트
- name: Run E2E tests
  run: npm run test:e2e

코드 품질 검사 및 보안 취약점 스캔

  1. ESLint를 사용한 린팅
- name: Run linter
  run: npm run lint
  1. Prettier를 사용한 포맷팅 검사
- name: Check formatting
  run: npm run format:check
  1. npm audit를 사용한 취약점 스캔
- name: Security audit
  run: npm audit

다양한 환경에 대한 자동 배포

 환경별 배포 설정

deploy-dev:
  if: github.ref == 'refs/heads/develop'
  runs-on: ubuntu-latest
  steps:
    - name: Deploy to development
      run: ./deploy-script.sh development
 
deploy-staging:
  if: github.ref == 'refs/heads/staging'
  runs-on: ubuntu-latest
  steps:
    - name: Deploy to staging
      run: ./deploy-script.sh staging
 
deploy-prod:
  if: github.ref == 'refs/heads/main'
  runs-on: ubuntu-latest
  steps:
    - name: Deploy to production
      run: ./deploy-script.sh production

고급 배포 전략

  1. 블루-그린 배포
deploy:
  steps:
  - name: Deploy Blue
    run: ./deploy-blue.sh
  - name: Switch traffic
    run: ./switch-to-blue.sh
  - name: Verify Blue
    run: ./verify-deployment.sh
  - name: Rollback if needed
    if: failure()
    run: ./rollback-to-green.sh
  1. 카나리 배포
deploy:
  steps:
  - name: Deploy Canary
    run: ./deploy-canary.sh 10%
  - name: Monitor Canary
    run: ./monitor-canary.sh
  - name: Full Rollout
    if: success()
    run: ./complete-rollout.sh
  - name: Rollback Canary
    if: failure()
    run: ./rollback-canary.sh

CI/CD 파이프라인 성능 최적화

  1. 캐싱 사용
- uses: actions/cache@v2
  with:
    path: ~/.npm
    key: ${{ runner.OS }}-node-${{ hashFiles('**/package-lock.json') }}
  1. 병렬 작업 실행
jobs:
  test:
    strategy:
      matrix:
        node-version: [12.x, 14.x, 16.x]
    steps:
      - uses: actions/setup-node@v2
        with:
          node-version: ${{ matrix.node-version }}
      - run: npm test

Best Practices 및 주의사항

  1. 환경 변수 및 시크릿 관리 : 민감한 정보는 저장소 설정에서 관리
  2. 테스트 커버리지 모니터링 : 커버리지 임계값 설정 및 강제
  3. 단계적 배포 : 개발 → 스테이징 → 프로덕션 순으로 배포
  4. 롤백 전략 : 문제 발생 시 신속한 롤백 메커니즘 구현
  5. 모니터링 및 알림 : 배포 성공/실패에 대한 알림 설정
  6. 문서화 : 파이프라인 구성 및 프로세스 문서화
  7. 정기적인 리뷰 : CI/CD 파이프라인 정기적 검토 및 최적화
  8. 환경 일관성 : 개발, 테스트, 프로덕션 환경의 일관성 유지
  9. 아티팩트 관리 : 빌드 아티팩트의 버전 관리 및 보관
  10. 성능 모니터링 : 파이프라인 실행 시간 모니터링 및 최적화

 CI/CD 파이프라인을 구축하는 것은 개발 프로세스를 크게 개선하고 소프트웨어의 품질을 향상시킵니다.

 GitHub Actions를 사용하면 비교적 쉽게 강력한 CI/CD 파이프라인을 구현할 수 있으며, 코드 저장소와 긴밀하게 통합되어 효율적인 워크플로우를 제공합니다.