CI/CD для JavaScript проектов: GitHub Actions от А до Я

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: Почему CI/CD необходим для JavaScript проектов

Современная веб-разработка немыслима без автоматизации. Каждый день разработчики JavaScript (Node.js) сталкиваются с рутинными задачами: запуск тестов, проверка кода линтером, сборка и деплой приложения. Ручное выполнение этих операций не только отнимает время, но и чревато ошибками. Именно здесь на помощь приходит CI/CD (Continuous Integration / Continuous Deployment) — методология, позволяющая автоматизировать все этапы жизненного цикла программного обеспечения.

GitHub Actions — это встроенный инструмент автоматизации на платформе GitHub, который идеально подходит для настройки CI/CD пайплайнов. В этой статье мы разберем, как с нуля настроить полный цикл автоматизации для JavaScript (Node.js) проекта: от запуска тестов до деплоя на сервер. Вы узнаете, как создать рабочий процесс, написать конфигурационные файлы и избежать типичных ошибок.

Основы GitHub Actions: Структура и компоненты

Прежде чем писать код, давайте разберемся с ключевыми концепциями GitHub Actions. Весь пайплайн описывается в YAML-файлах, которые хранятся в директории .github/workflows вашего репозитория.

Ключевые элементы рабочего процесса (Workflow)

  • Workflow — это автоматизированный процесс, состоящий из одного или нескольких Job (задач).
  • Job — набор шагов (Step), выполняющихся на одном Runner (виртуальной машине).
  • Step — отдельная команда или действие (Action).
  • Event — триггер, запускающий workflow (например, push, pull request).

Для JavaScript проектов стандартный workflow выглядит так:

name: CI/CD для Node.js

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    
    strategy:
      matrix:
        node-version: [18.x, 20.x]
    
    steps:
    - uses: actions/checkout@v4
    - name: Установка Node.js
      uses: actions/setup-node@v4
      with:
        node-version: ${{ matrix.node-version }}
    - name: Установка зависимостей
      run: npm ci
    - name: Линтинг
      run: npm run lint
    - name: Тесты
      run: npm test

Обратите внимание на strategy.matrix — это позволяет тестировать код на нескольких версиях Node.js одновременно, что критично для библиотек и пакетов.

Пошаговая настройка CI/CD для Node.js проекта

Рассмотрим полный пример настройки пайплайна для типичного веб-приложения на Express.js. Начнем с базового файла .github/workflows/node-ci.yml.

Шаг 1: Базовая проверка кода

name: Node.js CI

on:
  push:
    branches: [ develop, main ]
  pull_request:
    branches: [ main ]

jobs:
  quality:
    runs-on: ubuntu-latest
    
    steps:
    - 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
    
    - name: Lint code
      run: npm run lint
    
    - name: Run unit tests
      run: npm run test:unit
    
    - name: Build project
      run: npm run build

Ключевые моменты:

  • cache: 'npm' — кэширует node_modules, ускоряя последующие запуски.
  • npm ci — чистая установка зависимостей, быстрее и надежнее, чем npm install.
  • Разделение тестов на unit и integration (опционально) позволяет быстрее получать обратную связь.

Шаг 2: Интеграционные тесты с базой данных

Для тестирования с реальной базой данных используйте сервисы GitHub Actions:

jobs:
  integration-tests:
    runs-on: ubuntu-latest
    
    services:
      postgres:
        image: postgres:15
        env:
          POSTGRES_PASSWORD: testpass
          POSTGRES_DB: testdb
        ports:
          - 5432:5432
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
    
    steps:
    - uses: actions/checkout@v4
    - name: Setup Node.js
      uses: actions/setup-node@v4
      with:
        node-version: '20'
    - name: Install dependencies
      run: npm ci
    - name: Run integration tests
      run: npm run test:integration
      env:
        DATABASE_URL: postgresql://postgres:testpass@localhost:5432/testdb

Здесь мы запускаем контейнер PostgreSQL как сервис, к которому подключаются наши тесты. Это гарантирует изолированность и чистоту окружения.

Автоматический деплой на сервер

После успешного прохождения всех проверок, можно настроить автоматический деплой. Рассмотрим два популярных сценария.

Деплой на VPS через SSH

deploy:
  needs: [quality, integration-tests]
  runs-on: ubuntu-latest
  if: github.ref == 'refs/heads/main'
  
  steps:
  - uses: actions/checkout@v4
  
  - name: Build project
    run: npm ci && npm run build
  
  - name: Deploy to VPS
    uses: easingthemes/ssh-deploy@v4
    with:
      ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
      remote-host: ${{ secrets.REMOTE_HOST }}
      remote-user: ${{ secrets.REMOTE_USER }}
      source: './build/'
      target: '/var/www/myapp/'
  
  - name: Restart application
    uses: appleboy/ssh-action@v1
    with:
      host: ${{ secrets.REMOTE_HOST }}
      username: ${{ secrets.REMOTE_USER }}
      key: ${{ secrets.SSH_PRIVATE_KEY }}
      script: |
        cd /var/www/myapp
        pm2 restart ecosystem.config.js

Важно: Все чувствительные данные (SSH-ключи, пароли) храните в Secrets репозитория (Settings → Secrets and variables → Actions). Никогда не вставляйте их напрямую в YAML-файл.

Деплой на облачные платформы (Heroku, Railway, Vercel)

Для деплоя на популярные платформы используйте готовые Actions:

deploy-to-heroku:
  needs: build-and-test
  runs-on: ubuntu-latest
  if: github.ref == 'refs/heads/main                

Блоги

Рекомендаций по книгам