Налаштування CI/CD для проекту на 1С-Бітрікс
Більшість Бітрікс-проектів деплояться за однією схемою: FTP/SCP вручну або через файловий менеджер хостингу. Коли в команді три і більше осіб, це стає джерелом регулярних інцидентів — затерті правки, неперевірені міграції, конфлікти в bitrix/php_interface/init.php. CI/CD на Бітрікс реалізуємо, але потребує врахування архітектурних особливостей платформи.
Особливості Бітрікс, що впливають на пайплайн
Бітрікс — не Laravel і не Symfony. У нього немає вбудованого механізму міграцій, немає чіткої межі між кодом і даними. Основні складнощі:
-
Ядро в
/bitrix/— 500+ МБ файлів, які оновлюються через updater Бітрікса, а не через git. Зберігати їх у репозиторії — погана ідея, але деплоїти без них неможливо. -
Кастомізації через
/local/— все, що розробляє команда, має знаходитися лише тут. - Відсутність міграцій БД — структурні зміни БД виконуються або скриптами, або через інтерфейс.
-
bitrix_sessidта кеш — після деплою кеш потрібно скидати, інакше можливі 500-ті помилки.
Структура репозиторію
Правильна стратегія: у git зберігати лише /local/ та кореневі конфіги (nginx.conf, патчі php.ini, .env.example). Ядро Бітрікс — поза репозиторієм, синхронізується окремим процесом.
.git/
local/
components/
modules/
php_interface/
templates/
upload/ # виключити з git (.gitignore)
bitrix/ # виключити з git (.gitignore)
Мінімум .gitignore:
/bitrix/
/upload/
/.env
/bitrix/php_interface/dbconn.php
GitLab CI: базовий пайплайн
# .gitlab-ci.yml
stages:
- lint
- test
- deploy
variables:
DEPLOY_PATH: /var/www/myshop
php-lint:
stage: lint
image: php:8.1-cli
script:
- find local/ -name "*.php" -exec php -l {} \; | grep -v "No syntax errors"
only:
- merge_requests
- main
deploy-production:
stage: deploy
image: alpine:latest
before_script:
- apk add --no-cache openssh-client rsync
- eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | ssh-add -
script:
- rsync -avz --delete
--exclude='.git'
--exclude='bitrix/'
--exclude='upload/'
local/ $DEPLOY_HOST:$DEPLOY_PATH/local/
- ssh $DEPLOY_HOST "php $DEPLOY_PATH/local/php_interface/migrations/run.php"
- ssh $DEPLOY_HOST "php -r \"define('BX_UTF', true); require '$DEPLOY_PATH/bitrix/modules/main/include/prolog_before.php'; BXClearCache(true, '/'); echo 'Cache cleared';\""
environment:
name: production
only:
- main
when: manual
Міграції бази даних
Бітрікс не має вбудованого механізму міграцій, але це вирішується. Робочий підхід — власний простий migrator:
<?php
// local/php_interface/migrations/run.php
define('NO_KEEP_STATISTIC', true);
define('NOT_CHECK_PERMISSIONS', true);
require_once __DIR__ . '/../../../bitrix/modules/main/include/prolog_before.php';
$migrationsDir = __DIR__ . '/sql/';
$appliedFile = __DIR__ . '/.applied_migrations';
$applied = file_exists($appliedFile)
? array_filter(explode("\n", file_get_contents($appliedFile)))
: [];
$files = glob($migrationsDir . '*.sql');
sort($files);
$db = \Bitrix\Main\Application::getConnection();
foreach ($files as $file) {
$name = basename($file);
if (in_array($name, $applied)) {
continue;
}
$sql = file_get_contents($file);
$db->query($sql);
$applied[] = $name;
echo "Applied: $name\n";
}
file_put_contents($appliedFile, implode("\n", $applied));
Міграції іменуються 20250301_120000_add_property_article.sql — хронологічно, щоб порядок був детермінованим.
Скидання кешу після деплою
Критично важливий крок, який часто забувають:
# Скидання всього кешу через CLI
php -r "
define('BX_UTF', true);
define('NO_KEEP_STATISTIC', true);
\$_SERVER['DOCUMENT_ROOT'] = '/var/www/myshop';
require '/var/www/myshop/bitrix/modules/main/include/prolog_before.php';
BXClearCache(true, '/');
echo 'OK';
"
# Або через компонент кешу напряму
rm -rf /var/www/myshop/bitrix/cache/*
rm -rf /var/www/myshop/bitrix/managed_cache/*
Терміни
| Завдання | Термін |
|---|---|
| Налаштування репозиторію та .gitignore | 0.5 дня |
| Базовий пайплайн GitLab/GitHub Actions | 1 день |
| Скрипт міграцій БД | 0.5 дня |
| Тестування та обкатка на staging | 1 день |







