Автоматический запуск тестов при Pull Request: CI-пайплайн и защита кода

Автоматический запуск тестов при Pull Request

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Услуги, которые мы предлагаем
Показано 1 из 1Все 2062 услуг
Автоматический запуск тестов при Pull Request: CI-пайплайн и защита кода
Простой
от 1 дня до 3 дней

Наши компетенции:

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1414
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1285
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    980
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1240
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    982
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    994

Автоматический запуск тестов при Pull Request

Представьте: вы только что смержили PR в main, а через минуту прод упал с ошибкой. Оказалось, новый модуль затер старый endpoint, и ни один тест этого не заметил. Такая ситуация знакома многим командам. Мы через это прошли и с тех пор внедрили железное правило: каждый PR проходит через автоматический пайплайн тестов. Без зелёного света — мёрж запрещён. Автозапуск тестов при PR — базовая защита от регрессий. Разработчик не может смержить код, который ломает существующую функциональность. Это не замена code review, а его дополнение: ревьюер фокусируется на логике, а не на ловле очевидных багов.

Согласно документации GitHub Actions, кэширование зависимостей сокращает время установки с 90 секунд до 5 секунд — в 18 раз быстрее. А матричный запуск тестов позволяет проверить разные версии окружения параллельно, ускоряя общий прогон в 3–4 раза. Благодаря этому экономится до 40 часов в месяц на отладке, что при средних ставках даёт значительную экономию. Наш опыт — более 5 лет в CI/CD и 100+ настроенных пайплайнов — подтверждает: автозапуск тестов окупается за первый же спринт.

Почему автозапуск тестов при PR критичен?

Без этой защиты вы рискуете:

  • Сломанным CI на main — если влили баг, весь следующий спринт уйдёт на фикс.
  • Потерей времени на code review — ревьюеры отвлекаются на ошибки, которые могли бы отловить тесты.
  • Ручным тестированием — чем меньше рутины, тем выше скорость поставки.

Какие тесты стоит запускать, а какие — нет?

Тип теста Обязательный? Когда запускать Цель
Линтинг Да На каждый коммит Единый стиль, найти потенциальные баги
Юнит-тесты Да На каждый PR Проверить изолированную логику
Интеграционные Да (для БД/API) На каждый PR Взаимодействие компонентов
E2E Нет (по требованию) Только при изменениях в критических сценариях Проверка полного пользовательского пути
Тесты безопасности Рекомендуется Раз в день или на релиз Найти уязвимости

Структура пайплайна

Грамотный пайплайн разбит на параллельные джобы с fail-fast стратегией:

# .github/workflows/pr.yml name: PR Tests on: pull_request: branches: [main, develop] concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true # Отменяем старые запуски при новом push 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 && npm run type-check unit: 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 test -- --coverage - uses: codecov/codecov-action@v4 with: token: ${{ secrets.CODECOV_TOKEN }} integration: runs-on: ubuntu-latest services: postgres: image: postgres:16 env: POSTGRES_DB: testdb POSTGRES_PASSWORD: test options: >- --health-cmd pg_isready --health-interval 5s --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 run test:integration env: DATABASE_URL: postgresql://postgres:test@localhost:5432/testdb 

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

Без кэша npm ci на холодном раннере — 60–90 секунд. С кэшем — 5–10 секунд. Используйте встроенный кэш actions/setup-node или явный через actions/cache:

# Кэш node_modules по package-lock.json - uses: actions/setup-node@v4 with: node-version: 20 cache: npm # Встроенный кэш в actions/setup-node # Или явно через actions/cache - uses: actions/cache@v4 with: path: ~/.npm key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} 

Влияние кэширования на скорость:

Метод Время установки зависимостей Общее время пайплайна
Без кэша 60–90 с 3–5 мин
С кэшем (actions/setup-node) 5–10 с 1–2 мин
Встроенный кэш + matrix 5–10 с на джобу 1–2 мин (параллельно)

Матричное тестирование и поддержка разных стеков

Если приложение должно работать на нескольких версиях Node.js или PHP, используйте матрицу:

strategy: matrix: node-version: [18, 20, 22] fail-fast: false # Запускаем все версии даже если одна упала 

Для Laravel-проектов используйте параллельный запуск PHPUnit:

- name: Run PHPUnit run: php artisan test --parallel --coverage-clover=coverage.xml env: DB_CONNECTION: pgsql DB_DATABASE: testing - name: Upload coverage uses: codecov/codecov-action@v4 with: files: coverage.xml 

--parallel запускает тесты параллельно через brianium/paratest. На 200+ тестах ускоряет в 3–4 раза.

Статус-чеки и branch protection

В GitHub Settings → Branches → Branch protection rules добавляем required status checks: lint, unit, integration. Мерж в main без прохождения этих проверок невозможен.

Оптимизация скорости: path filtering и test splitting

  • Path filtering — запускать тесты только при изменении релевантных файлов (например, через paths в GitHub Actions).
  • Test splitting — распределить тесты по нескольким раннерам (GitHub Actions matrix).
  • Только изменённые модули — Jest --changedSince, pytest --testpaths.

Цель: пайплайн укладывается в 5 минут. Медленнее — разработчики начинают игнорировать.

Процесс настройки и что входит в работу

  1. Анализируем текущие тесты и инфраструктуру проекта.
  2. Проектируем пайплайн: определяем джобы, матрицы, кэш.
  3. Реализуем конфигурацию GitHub Actions с учётом вашего стека.
  4. Настраиваем branch protection и обязательные статус-чеки.
  5. Тестируем на реальном PR, отлаживаем.
  6. Документируем процесс и передаём команде.

В результате вы получаете:

  • Конфигурацию GitHub Actions с кэшированием и матрицей
  • Статус-чеки и правила branch protection
  • Coverage-репорты (Codecov, Coveralls)
  • Документацию по запуску тестов локально
  • Доступ к нашему шаблону быстрого старта для новых проектов
  • Пост-релизную поддержку в течение двух недель

Сроки и стоимость

Базовая настройка с unit и integration тестами для Node.js или PHP занимает 1–2 дня. Настройка coverage и badge — ещё полдня. Итоговые сроки зависят от сложности проекта (количество сервисов, типы тестов). Стоимость обсуждается индивидуально.

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