PurpleSchool — курсы программирования онлайн
  • Пути
    • Frontend React разработчик
    • Frontend Vue разработчик
    • Backend разработчик Node.js
    • Fullstack разработчик React / Node.js
    • Mobile разработчик React Native
    • Backend разработчик Golang
    • Devops инженер
    • Backend разработчик Python
  • AI для кодаНовое
  • О нас
    • Отзывы
    • Реферальная программа
    • О компании
    • Контакты
  • Иконка открытия меню
    • Сообщество
    • PurpleПлюс
    • AI Собеседование
    • AI тренажёр
    • Проекты
PurpleSchool — платформа бесплатных roadmap и курсов для разработчиков
ютуб иконка
Telegram иконка
VK иконка
VK иконка
Курсы
ГлавнаяКаталог курсовFrontendBackendFullstack
Практика
КарьераПроектыPurpleПлюс
Материалы
БлогБаза знаний
Документы
Договор офертаПолитика конфиденциальностиПроверка сертификатаМиграция курсовРеферальная программа
Реквизиты
ИП Ларичев Антон АндреевичИНН 773373765379contact@purpleschool.ru

PurpleSchool © 2020 -2026 Все права защищены

  • Курсы
    • FrontendИконка стрелки
    • AI разработкаИконка стрелки
    • BackendИконка стрелки
    • DevOpsИконка стрелки
    • MobileИконка стрелки
    • ТестированиеИконка стрелки
    • Soft-skillsИконка стрелки
    • ДизайнИконка стрелки
    Иконка слояПерейти в каталог курсов
  • Бесплатно
    • Курсы
    • JavaScript Основы разработкиPython Основы PythonCSS CSS FlexboxКарта развитияВопросы для собеседований
    • База знанийИконка стрелки
    • Новостные рассылкиИконка стрелки
  • PurpleSchool — курсы программирования онлайн
    • AI для кодаНовое
    • Сообщество
    • PurpleПлюс
    • AI Собеседование
    • AI тренажёр
    • Проекты
    Главная
    Сообщество
    GitHub Actions: CI/CD пайплайн для Node.js проекта

    GitHub Actions: CI/CD пайплайн для Node.js проекта

    Аватар автора GitHub Actions: CI/CD пайплайн для Node.js проекта

    Антон Ларичев

    Иконка календаря05 апреля 2026
    github-actionsnode.jsdevopsmiddleИконка уровня middle
    Картинка поста GitHub Actions: CI/CD пайплайн для Node.js проекта

    Введение

    GitHub Actions CI/CD для Node.js позволяет автоматизировать весь цикл разработки: от проверки кода до деплоя на продакшен. Настроив CI/CD пайплайн один раз, вы получаете автоматический запуск тестов, линтинг и деплой при каждом пуше или pull request.

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

    Структура GitHub Actions workflow для Node.js

    Каждый CI/CD пайплайн в GitHub Actions описывается YAML-файлом в директории .github/workflows/. Workflow состоит из джобов (jobs), а каждый джоб содержит шаги (steps). Для Node.js проекта типичный пайплайн включает три основных этапа: линтинг, тестирование и деплой.

    Создадим файл .github/workflows/ci.yml:

    name: CI/CD Pipeline
    
    on:
      push:
        branches: [main, develop]
      pull_request:
        branches: [main]
    
    jobs:
      lint:
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v4
          - uses: actions/setup-node@v4
            with:
              node-version: 20
              cache: 'npm'
          - run: npm ci
          - run: npm run lint
    
      test:
        runs-on: ubuntu-latest
        needs: lint
        steps:
          - uses: actions/checkout@v4
          - uses: actions/setup-node@v4
            with:
              node-version: 20
              cache: 'npm'
          - run: npm ci
          - run: npm test
    
      deploy:
        runs-on: ubuntu-latest
        needs: test
        if: github.ref == 'refs/heads/main' && github.event_name == 'push'
        steps:
          - uses: actions/checkout@v4
          - uses: actions/setup-node@v4
            with:
              node-version: 20
              cache: 'npm'
          - run: npm ci
          - run: npm run build
          - name: Деплой на сервер
            run: |
              echo "Деплой приложения..."
    

    Этот workflow запускается при пуше в main или develop и при pull request в main. Джобы выполняются последовательно: сначала линтинг, затем тесты, и только после успеха обоих этапов происходит деплой.

    Как настроить автоматический линтинг в GitHub Actions

    Линтинг помогает поддерживать единый стиль кода и находить потенциальные ошибки до того, как они попадут в основную ветку. Для Node.js проектов стандартным инструментом является ESLint.

    Убедитесь, что в package.json есть скрипт для линтинга:

    {
      "scripts": {
        "lint": "eslint . --ext .ts,.js",
        "lint:fix": "eslint . --ext .ts,.js --fix"
      }
    }
    

    Для более строгих проверок можно добавить параллельный запуск нескольких линтеров:

    lint:
      runs-on: ubuntu-latest
      strategy:
        matrix:
          check: [eslint, prettier, typecheck]
      steps:
        - uses: actions/checkout@v4
        - uses: actions/setup-node@v4
          with:
            node-version: 20
            cache: 'npm'
        - run: npm ci
        - name: Запуск проверки
          run: |
            if [ "${{ matrix.check }}" = "eslint" ]; then
              npm run lint
            elif [ "${{ matrix.check }}" = "prettier" ]; then
              npx prettier --check .
            elif [ "${{ matrix.check }}" = "typecheck" ]; then
              npx tsc --noEmit
            fi
    

    Матричная стратегия запускает ESLint, Prettier и проверку типов параллельно, что сокращает общее время выполнения пайплайна.

    Автоматический запуск тестов в GitHub Actions

    Запуск тестов при каждом пуше гарантирует, что новый код не ломает существующую функциональность. Для Node.js чаще всего используют Jest или Vitest.

    test:
      runs-on: ubuntu-latest
      strategy:
        matrix:
          node-version: [18, 20, 22]
      steps:
        - uses: actions/checkout@v4
        - uses: actions/setup-node@v4
          with:
            node-version: ${{ matrix.node-version }}
            cache: 'npm'
        - run: npm ci
        - run: npm test -- --coverage
        - name: Загрузка отчета о покрытии
          if: matrix.node-version == 20
          uses: actions/upload-artifact@v4
          with:
            name: coverage-report
            path: coverage/
    

    Матрица версий Node.js позволяет проверить совместимость проекта с разными версиями рантайма. Отчет о покрытии кода загружается как артефакт и доступен во вкладке Actions на GitHub.

    Как подключить базу данных к тестам

    Если тесты требуют базу данных, используйте сервисные контейнеры:

    test:
      runs-on: ubuntu-latest
      services:
        postgres:
          image: postgres:16
          env:
            POSTGRES_USER: test
            POSTGRES_PASSWORD: test
            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
        - uses: actions/setup-node@v4
          with:
            node-version: 20
            cache: 'npm'
        - run: npm ci
        - run: npm test
          env:
            DATABASE_URL: postgresql://test:test@localhost:5432/testdb
    

    GitHub Actions поднимет контейнер PostgreSQL перед запуском тестов и автоматически остановит его после завершения джоба.

    Кэширование зависимостей для ускорения пайплайна

    Кэширование node_modules существенно ускоряет CI/CD пайплайн. Параметр cache: 'npm' в actions/setup-node автоматически кэширует глобальный кэш npm на основе package-lock.json.

    Для более тонкой настройки можно использовать actions/cache напрямую:

    - uses: actions/cache@v4
      with:
        path: ~/.npm
        key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
        restore-keys: |
          ${{ runner.os }}-node-
    

    При попадании в кэш команда npm ci выполняется за секунды вместо минут. Это особенно заметно в проектах с большим количеством зависимостей.

    Настройка автоматического деплоя Node.js приложения

    Деплой должен запускаться только после успешного прохождения всех проверок и только для определенных веток. Рассмотрим деплой через SSH на VPS:

    deploy:
      runs-on: ubuntu-latest
      needs: [lint, test]
      if: github.ref == 'refs/heads/main' && github.event_name == 'push'
      environment: production
      steps:
        - uses: actions/checkout@v4
        - uses: actions/setup-node@v4
          with:
            node-version: 20
            cache: 'npm'
        - run: npm ci
        - run: npm run build
        - name: Деплой через SSH
          uses: appleboy/ssh-action@v1
          with:
            host: ${{ secrets.SSH_HOST }}
            username: ${{ secrets.SSH_USER }}
            key: ${{ secrets.SSH_KEY }}
            script: |
              cd /var/www/app
              git pull origin main
              npm ci --production
              npm run build
              pm2 restart app
    

    Секреты (SSHHOST, SSHUSER, SSH_KEY) хранятся в настройках репозитория: Settings -> Secrets and variables -> Actions. Параметр environment: production позволяет настроить правила защиты окружения, включая ручное подтверждение деплоя.

    Частые ошибки при настройке CI/CD пайплайна

    Первая распространенная ошибка: использование npm install вместо npm ci в CI-окружении. Команда npm ci устанавливает зависимости строго по package-lock.json, что гарантирует воспроизводимость сборки.

    Вторая проблема: отсутствие кэширования. Без кэша каждый запуск пайплайна скачивает все зависимости заново, что увеличивает время выполнения в несколько раз.

    Третья ошибка: хранение секретов в коде. Никогда не коммитьте токены, пароли или SSH-ключи в репозиторий. Используйте GitHub Secrets для всех чувствительных данных.

    Четвертая проблема: отсутствие branch protection rules. Настройте защиту основных веток, чтобы мерж был возможен только после успешного прохождения всех проверок CI.

    Заключение

    GitHub Actions CI/CD пайплайн для Node.js проекта с тестами, линтингом и деплоем создается за один YAML-файл и полностью автоматизирует процесс доставки кода. Настроив workflow один раз, вы получаете автоматические проверки качества кода при каждом изменении, что повышает надежность проекта и ускоряет процесс разработки.

    Иконка глаза746

    Комментарии

    0

    Постройте личный план изучения CSS Flexbox - полный курс и практика его использования до уровня Middle — бесплатно!

    CSS Flexbox - полный курс и практика его использования — часть карты развития Frontend

    • step100+ шагов развития
    • lessons30 бесплатных лекций
    • lessons300 бонусных рублей на счет

    Бесплатные лекции

    Лучшие курсы по теме

    изображение курса

    Основы JavaScript

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.8
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    Продвинутый JavaScript

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.8
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    TypeScript с нуля

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.8
    3 999 ₽ 6 990 ₽
    Подробнее

    Похожие статьи

    Картинка поста Git флоу для команды разработчиков: гайд по веткам и релизам
    Иконка аватараАнтон
    Иконка календаря30 сентября 2026
    gitgit-flowкомандная работа+ 2middleИконка уровня middle

    Git флоу для команды разработчиков: гайд по веткам и релизам

    Git флоу для команды разработчиков: разбираем Git Flow, GitHub Flow и trunk-based development — как выбрать модель веток и избежать конфликтов при совместной работе.

    Иконка чипа0
    Иконка глаза125
    Иконка комментариев0
    Иконка аватараАнтон
    Иконка календаря01 октября 2026
    AI-инструментыDevOpsразработка+ 2middleИконка уровня middle

    Gemini CLI в России: как установить и настроить

    Установить Gemini CLI из России можно без VPN и без ухищрений — это обычный npm-пакет, он скачивается и запускается на любой машине. Упирается всё на следующем шаге: 18 июня 2026 года Google перестал обслуживать запросы Gemini CLI для бесплатных аккаунтов и подписчиков Google AI Pro и Ultra, а единственный оставшийся путь — вход по API-ключу — требует биллинга в регионе, где Россия не числится. Ниже разбираем, как агент ставится, как устроены три способа входа, почему ни один из них не доводи...

    Иконка чипа0
    Иконка глаза163
    Иконка комментариев0
    Иконка аватараАнтон
    Иконка календаря29 сентября 2026
    AI-инструментыClaude CodeDevOps+ 2middleИконка уровня middle

    Бесплатный аналог Cursor и Claude Code в России

    Короткий ответ: бесплатных аналогов много, и почти все они ставятся в России без ухищрений — Cline, Kilo Code, OpenCode, Qwen Code, Codex CLI распространяются с открытым исходным кодом, и за сам инструмент никто денег не берёт. Проблема в другом: своей модели у них нет. Платите вы не за агента, а за модель, к которой он ходит, и блокируется из России именно доступ к модели. Поэтому вопрос «чем заменить Cursor и Claude Code» почти всегда оказывается другим вопросом — где взять доступ к сильной модели без зарубежной карты. Ниже разберём, что из бесплатного реально работает, где оно упирается в потолок, и во сколько обходится не искать замену вообще. {{IMAGE_1}} alt: Схема: бесплатные клиенты-агенты Cline, Kilo Code, OpenCode, Qwen Code и платный доступ к модели за ними prompt: Flat vector diagram on dark background, two clearly separated zones. Left zone labeled "free" contains five small rounded cards representing code editor agents with terminal and sidebar icons. Right zone labeled "paid" contains a single large cloud icon representing an AI model, with a lock badge. Arrows go from all five cards to the single cloud. Purple and violet accent colors, thin white lines, no text labels, clean minimal tech illustration, 16:9

    Иконка чипа0
    Иконка глаза412
    Иконка комментариев1
    Иконка чипа0