1C:SRE-Suite: автоматизируем непрерывную интеграцию (CI) через GitHub Actions
Декларативный пайплайн в GitHub Actions, тонкости лицензирования в Docker (--net=host), изоляция RUN_ID и интеграция со сборочным конвейером 1C:SRE-Suite.
Часть 2 практического руководства: от первого коммита до детерминированного синтаксического гейта на headless-раннере Linux
В первой части нашей публикации мы рассмотрели общую архитектуру SRE-пакета для платформы «1С:Предприятие» в операционной системе Linux. Мы заложили теоретический и практический фундамент: описали пятислойный сборочный скрипт защиты от ложного успеха, утилиту автоматической трансляции проектов EDT и превентивные механизмы ротации процессов.
1c-ci-linux-build-v4.sh и методика мягкой ротации rphost опубликованы в вводном материале: 1C:SRE-Suite: переводим управление инфраструктурой 1С на Linux в декларативный формат (Часть 1).Однако декларативное описание инфраструктуры работает на полную мощность только тогда, когда оно встроено в автоматический цикл обратной связи. Любой коммит разработчика или аналитика должен автоматически проверяться на синтаксическую корректность до того, как изменения попадут в общую базу.
Во второй части нашего цикла мы подробно разберем построение конвейера непрерывной интеграции (CI) на базе GitHub Actions. Мы покажем внутреннюю структуру конфигурационного файла github-actions-ci.yml, разберем сетевые нюансы взаимодействия с серверами лицензирования и покажем, как изолировать параллельные сессии сборки в контейнерах. Исходный код проекта и пайплайнов открыт на GitHub: NickScherbakov/1c-sre-suite.
📂 Разбор пайплайна: шаг за шагом
Файл конфигурации github-actions-ci.yml описывает один рабочий процесс (Workflow), который автоматически активируется при отправке кода (push) или создании запросов на слияние (pull request) в ветки main и master. Это гарантирует контроль качества на самых ранних этапах жизненного цикла разработки.
| Этап конвейера | Выполняемое действие | Технический регламент |
|---|---|---|
| Шаг 1. Исходники Git | Полное извлечение репозитория с историей коммитов. | actions/checkout@v4 с обязательным параметром fetch-depth: 0 для Diff-контроля. |
| Шаг 2. Среда Node.js | Подготовка рантайма для CLI-транслятора EDT. | Развертывание Node.js v20 и условное выполнение npm ci при наличии манифеста. |
| Шаг 3. Сборка раннера | Динамическая компиляция Docker-образа. | Сборка 1c-sre-runner:latest из docker/Dockerfile (Xvfb + системные шрифты). |
| Шаг 4. Прогон синтаксиса | Запуск 5 рубежей защиты в изолированном контейнере. | Вызов 1c-ci-linux-build-v4.sh с сетевым режимом --net=host и изоляцией RUN_ID. |
Шаг 1. Получение актуальных исходников
Конвейер использует стандартный шаг actions/checkout@v4. Важнейшей деталью является параметр fetch-depth: 0. По умолчанию GitHub Actions скачивает только последний коммит, что ускоряет процесс, однако для полноценной работы упреждающего контроля и расчета разницы метаданных (diff-верификация на пятом слое нашего сборочного скрипта) критически необходима полная история изменений. Указание нулевой глубины извлечения исключает ложные срабатывания.
Шаг 2. Развертывание окружения Node.js
Для работы нашего транслятора из формата 1C:EDT в бинарный конфигурационный файл требуется выполнение скрипта scripts/edt-to-configurator.js. Пайплайн разворачивает виртуальное окружение Node.js 20 и выполняет команду детерминированной установки зависимостей npm ci, если в корне проекта присутствует файл package.json. Если манифест отсутствует, шаг безопасно пропускается, не прерывая конвейер.
Шаг 3. Динамическая сборка Docker-контейнера
Для компиляции кода 1С необходима установленная платформа. Наш конвейер не требует ручной предустановки платформы на сам GitHub-раннер. Вместо этого пайплайн собирает воспроизводимый образ сборочного агента 1c-sre-runner:latest из docker/Dockerfile. В этот образ уже упакованы все необходимые зависимости: виртуальный фреймбуфер Xvfb, системные шрифты MS Core Fonts и утилиты администрирования.
Шаг 4. Запуск тестирования внутри контейнера
Это технологически ключевой этап, где одновременно решаются три классические проблемы интеграции 1С в CI-процессы: сетевая доступность лицензий, изоляция параллельных сессий и безопасность конфиденциальной информации.
Команда запуска контейнера выглядит следующим образом:
(!!!) - Три инженерных решения в основе запуска контейнера
Разберем детально, какие критические инфраструктурные барьеры устраняет приведенная команда запуска раннера.
| Инженерный вызов | Уязвимость в типовом Docker | Решение контура 1C:SRE-Suite |
|---|---|---|
| 1. Сетевые лицензии HASP | Потеря широковещательных UDP-пакетов в виртуальном мосту (bridge). | Параметр --net=host: прямой доступ к физическому сетевому стеку. |
| 2. Коллизии параллелизма | Блокировка общих баз и каталогов несколькими параллельными сборами. | Проброс уникального RUN_ID (на базе github.run_id) для полной изоляции. |
| 3. Защита периметра | Утечка приватных IP-адресов серверов лицензий в открытый репозиторий. | Маскирование через GitHub Secrets с генерацией безопасного nethasp.ini. |
1. Сетевой режим host вместо моста (bridge)
По умолчанию Docker запускает контейнеры в изолированной виртуальной сети. Для работы платформы «1С:Предприятие» внутри контейнера критически важен доступ к ключам защиты. Если используются аппаратные HASP-ключи, платформа пытается обнаружить менеджер лицензий по протоколу UDP. В режиме виртуального моста (bridge) широковещательные UDP-запросы не проходят сквозь сетевой экран Docker.
Параметр --net=host заставляет контейнер использовать сетевой стек хост-системы. Это полностью снимает сетевые ограничения: контейнер видит локальную сеть точно так же, как сам GitHub-раннер, что гарантирует мгновенное получение программных или аппаратных лицензий без сложной маршрутизации.
2. Двухсторонняя изоляция через переменные окружения
При одновременном запуске нескольких сборочных конвейеров на одном физическом сервере процессы Конфигуратора неизбежно сталкиваются с конфликтами захвата файлов блокировок (*.1cLck, 1Cv8.lk) или мешают друг другу во временных базах данных.
Для решения этой проблемы мы передаем внутрь контейнера переменную RUN_ID, значением которой выступает уникальный идентификатор текущего запуска GitHub Actions (${{ github.run_id }}). Наш сборочный скрипт использует этот идентификатор для создания изолированных каталогов временных файлов и выделенных баз данных, гарантируя полное отсутствие коллизий при параллельной работе.
3. Безопасность инфраструктурных параметров через GitHub Secrets
Адрес сервера лицензирования или параметры подключения к базам данных ни при каких условиях не должны храниться в публичном репозитории в открытом виде. Это создает прямую угрозу компрометации защищенного контура предприятия.
Мы используем механизм шифрованных секретов GitHub Secrets. Переменная HASP_SERVER_IP наполняется динамически из секрета ${{ secrets.HASP_SERVER_IP }}. Значение автоматически маскируется в логах сборки и передается исключительно в переменные окружения контейнера на время выполнения шага. Наш сборочный скрипт считывает эту переменную и на лету подставляет её в файл конфигурации nethasp.ini, обеспечивая строгую точечную адресацию без сетевых таймаутов.
🤝 Подключайтесь к развитию проекта
Наш конфигурационный файл GitHub Actions представляет собой готовое промышленное решение, которое легко масштабировать под любые другие платформы автоматизации: GitLab CI, TeamCity или Jenkins.
Мы продолжаем активную разработку 1C:SRE-Suite на GitHub и приглашаем инженеров принять участие в формировании открытых отраслевых стандартов эксплуатации 1С.
- Оптимизация кэширования слоев Docker для многократного ускорения повторной сборки раннера.
- Публикация результатов синтаксического контроля в формате JUnit для наглядных отчетов в интерфейсе Git.
- Интеграция шага автоматического запуска автотестов Vanessa-Automation и YAxUnit в headless-режиме непосредственно после успешной синтаксической сборки.
Готовый файл github-actions-ci.yml доступен в репозитории проекта и готов к внедрению в ваши рабочие контуры. Ждем ваши отзывы, архитектурные идеи в разделе Issue и пул-реквесты в репозитории NickScherbakov/1c-sre-suite!
Проект распространяется под открытой коммерческой лицензией MIT: вы можете свободно использовать его, дорабатывать и внедрять в инфраструктуру своего предприятия.
Перейти в репозиторий NickScherbakov/1c-sre-suite на GitHub →
Присоединяйтесь к дискуссиям и разработке в сообществе: Телеграм-чат Инфостарт.
Материал подготовлен для сообщества infostart.ru с прицелом на матёрых DevOps-инженеров, системных администраторов и архитекторов «1С:Предприятия».
Нинель и Николай Щербаковы — декларативная инфраструктура, SRE и интеллектуальная автоматизация экосистемы 1С на Linux.
Вступайте в нашу телеграмм-группу Инфостарт