Настройка автоматического тестирования в CI/CD для 1С-Битрикс
Тесты написаны, но разработчики запускают их вручную — и забывают. Код уходит в продакшн без проверки, тесты устаревают, покрытие деградирует. Автоматическое тестирование в CI/CD решает организационную проблему: код не может попасть в основную ветку без прохождения тестов. Для Битрикс это реализуется сложнее, чем для Symfony или Laravel, из-за зависимости от ядра и БД, но вполне решаемо.
Архитектура пайплайна
Минимальный CI-пайплайн для Битрикс-проекта:
- Checkout — получение кода из репозитория
- Composer install — установка зависимостей (PHPUnit, phpstan, php-cs-fixer)
-
Lint —
php -lдля всех PHP-файлов, проверка синтаксиса - Static analysis — PHPStan / Psalm
- Unit tests — быстрые тесты без ядра Битрикс
- Integration tests — тесты с подключением ядра и БД
- Deploy (только для main-ветки)
Docker-образ для CI
Главная сложность — ядро Битрикс. Оно не устанавливается через Composer. Варианты:
Вариант A: ядро в Docker-образе. Создайте базовый образ с установленным Битрикс, PHP и расширениями. Обновляйте образ при обновлении ядра на проекте. Это самый надёжный подход.
FROM php:8.1-cli
RUN apt-get update && apt-get install -y libpq-dev libzip-dev \
&& docker-php-ext-install pdo pdo_mysql opcache zip
COPY bitrix/ /var/www/bitrix/
COPY composer.json composer.lock /var/www/
WORKDIR /var/www
RUN composer install --no-dev
Вариант B: ядро через артефакт. CI скачивает ядро из приватного хранилища (S3, GitLab Package Registry) на этапе подготовки. Более гибко, но медленнее.
Настройка GitLab CI
stages:
- lint
- test
- deploy
variables:
MYSQL_DATABASE: bitrix_test
MYSQL_ROOT_PASSWORD: test
lint:
stage: lint
image: php:8.1-cli
script:
- find local/ -name "*.php" -exec php -l {} \;
- vendor/bin/phpstan analyse local/php_interface/classes/ --level 5
integration-tests:
stage: test
image: registry.example.com/bitrix-ci:latest
services:
- mysql:8.0
script:
- cp .env.ci .env
- php local/tests/setup_db.php
- vendor/bin/phpunit --configuration local/tests/phpunit.xml
artifacts:
when: always
reports:
junit: local/tests/report.xml
Ключевые моменты:
-
services: mysql — поднимает контейнер MySQL, доступный по хосту
mysqlвнутри CI - setup_db.php — скрипт, создающий схему тестовой БД (минимальный набор таблиц Битрикс)
- artifacts: junit — GitLab/GitHub отображает результаты тестов в интерфейсе merge request
Для GitHub Actions
name: Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
services:
mysql:
image: mysql:8.0
env:
MYSQL_DATABASE: bitrix_test
MYSQL_ROOT_PASSWORD: test
ports:
- 3306:3306
steps:
- uses: actions/checkout@v4
- uses: shivammathur/setup-php@v2
with:
php-version: '8.1'
extensions: pdo_mysql, mbstring, zip, gd
- run: composer install
- run: vendor/bin/phpunit --configuration local/tests/phpunit.xml
Схема тестовой БД
Полная БД Битрикс содержит 500+ таблиц. Для интеграционных тестов нужен минимальный набор:
-
b_option,b_module,b_module_to_module— конфигурация модулей -
b_iblock,b_iblock_type,b_iblock_element,b_iblock_section,b_iblock_property,b_iblock_element_property— инфоблоки -
b_catalog_price,b_catalog_currency— каталог и валюты -
b_sale_order,b_sale_basket,b_sale_order_props_value— заказы (если тестируете e-commerce)
Создайте дамп схемы с продакшена: mysqldump --no-data bitrix > schema.sql. Добавьте в репозиторий и обновляйте при изменении структуры.
Что проверять в CI обязательно
PHP Lint. Тривиально, но ловит синтаксические ошибки в файлах, которые не вызываются при ручном тестировании. Битрикс-проекты часто содержат файлы, подключаемые условно (по агенту, по cron) — ошибку в них обнаруживают уже на продакшене.
PHPStan level 5+. На уровне 5 PHPStan находит обращения к несуществующим методам, некорректные типы аргументов, неопределённые переменные. Для Битрикс-кода потребуется файл phpstan-baseline.neon с игнорированием ошибок ядра — ядро не типизировано и генерирует сотни предупреждений.
Smoke-тесты HTTP. Если CI поднимает полное окружение (PHP-FPM + Nginx + MySQL), добавьте curl-проверки критичных URL:
curl -f http://localhost/
curl -f http://localhost/catalog/
curl -f http://localhost/personal/cart/
Статус 200 — тест пройден. Любой другой — fail пайплайна.
Время выполнения
| Этап | Время |
|---|---|
| Lint + static analysis | 30-60 секунд |
| Unit-тесты (без ядра) | 10-30 секунд |
| Integration-тесты (с ядром и БД) | 2-10 минут |
| Полный пайплайн | 5-15 минут |
Если интеграционные тесты занимают больше 15 минут — разделяйте их на параллельные job'ы по модулям. GitLab CI и GitHub Actions поддерживают параллельные matrix-стратегии.
Настройка CI/CD для Битрикс-проекта — это инвестиция в один рабочий день, которая окупается при первом же предотвращённом баге на продакшене.







