Как устроен CI/CD pipeline в Node.js проекте?

«Как устроен CI/CD pipeline в Node.js проекте?» — вопрос из категории DevOps, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Типичный CI/CD pipeline для Node.js проекта состоит из последовательных этапов, автоматизирующих сборку, тестирование и развертывание. Вот пример конфигурации для GitHub Actions:

.github/workflows/ci-cd.yml:

name: Node.js CI/CD Pipeline
on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main ]

jobs:
  test-and-build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'

      - name: Install dependencies
        run: npm ci --audit=false

      - name: Run linter (ESLint)
        run: npm run lint

      - name: Run tests with coverage
        run: npm test -- --coverage

      - name: Build project (для TypeScript)
        run: npm run build

      - name: Upload coverage report
        uses: codecov/codecov-action@v3

  deploy-staging:
    runs-on: ubuntu-latest
    needs: test-and-build
    if: github.ref == 'refs/heads/develop'
    steps:
      - name: Deploy to Staging (AWS Elastic Beanstalk example)
        run: |
          # Команды для деплоя, например, с помощью AWS CLI
          eb deploy myapp-staging --label ${{ github.sha }}

  deploy-production:
    runs-on: ubuntu-latest
    needs: test-and-build
    if: github.ref == 'refs/heads/main'
    steps:
      - name: Approve and Deploy to Production
        # Часто требует ручного подтверждения (manual approval)
        run: echo "Производственный деплой инициирован..."

Ключевые этапы локально и в CI:

  1. Установка: npm ci для воспроизводимых зависимостей.
  2. Линтинг: Проверка стиля кода с помощью ESLint и Prettier.
  3. Тестирование: Запуск юнит- и интеграционных тестов (Jest, Mocha).
  4. Сборка: Транспиляция TypeScript, минификация, бандлинг (если применимо).
  5. Деплой: Автоматическое развертывание на staging/production среды (часто в Docker-контейнерах на платформах вроде AWS, GCP, Heroku).