Привет, Хабр! Поговорим о том, как принципы GitOps можно применить к разработке конфигураций 1С:Предприятия.
Классическая разработка на 1С:Предприятии подразумевает использование встроенного хранилища конфигурации. Все подключаются к одному хранилищу, выкачивают изменения, закачивают своего рода централизованный VCS от 1С. Но у такого подхода есть масса недостатков. Во-первых, в хранилище версионируется сразу вся конфигурация целиком, а не отдельные файлы или модули. Если команда большая, конфигурация объёмная, слияния создают трудности код-ревью затруднён. Во-вторых, нет нормального ветвления, обычно на каждый контур поднимают своё раздельное хранилище, и изменения переносятся между ними вручную или скриптами. В-третьих, интеграция с современными CI-системами отсутствует, хранилище 1С живёт своей жизнью.
Современная альтернатива – это хранить исходники конфигурации в Git-репозитории. Причём последние версии 1С:Предприятие предлагают два пути к этому:
Использовать 1С:EDT, новую среду разработки на основе Eclipse. EDT работает напрямую с Git, в нём поддержка веток, коммитов и прочих радостей распределённой системы версий. Код конфигурации хранится в виде множества текстовых файлов (модули, формы в формате XML и т.д.), что подходит для Git.
Для тех, кто пока сидит на старом добром конфигураторе, есть промежуточный вариант, выгружать конфигурацию в файлы (через выгрузку в XML), а потом эти файлы коммитить в Git. Это можно делать вручную, а можно автоматизировать какими-нибудь утилитами, например, 1C:GitConverter.
Конечно, переход на EDT+Git наиболее адекватный путь. EDT сразу решает множество проблем, в нём есть и ветки, и параллельная работа, и возможность видеть разницу в коде. Но реальность такова, что некоторые проекты ещё требуют использования конфигуратора. Поэтому расскажу о GitOps-подходе применимо к обоим сценариям.
GitOps для 1С: общий конвейер
Набросаем общие шаги такого конвейера:
Разработка: программисты делают изменения либо в EDT-проекте, либо в конфигураторе. В случае EDT они сразу коммитят изменения в Git. В случае конфигуратора, они сохраняют изменения в центральном хранилище 1С.
Экспорт в Git: если работаем через EDT, этот шаг уже выполнен. Если через конфигуратор, то нужна промежуточная синхронизация, с определённой периодичностью или по триггеру выгружаем конфигурацию в файлы и делаем коммит в репозиторий. Тут поможет 1С:GitКонвертер, который умеет из хранилища конфигурации выгружать изменения в XML-файлы и коммитить их в Git. Можно настроить её запуск по расписанию.
CI-сервер замечает новые коммиты в репозитории и запускает pipeline сборки. Например, настроили Jenkins или GitLab CI, неважно, принцип похожий.
Сборка конфигурации: на выделенном агенте запускается процесс сборки. Если у нас EDT, то выполняется экспорт EDT-проекта в формат, понятный конфигуратору (утилита EDT CLI). Дело в том, что сам EDT не умеет собирать cf-файл или базу. EDT CLI экспортирует исходники в .cf или непосредственно в XML для конфигуратора. А затем в ход идёт пакетный режим конфигуратора, запускается
1cv8.exe DESIGNER /LoadConfigFromFiles ... /UpdateDBCfg ...на пустой базе. Получаем обновлённую конфигурацию в файловой базе на сервере. Если используем конфигуратор + GitConverter, то шаг с EDT скипается-
Статический анализ: после сборки можно запустить проверку качества кода. Здесь два варианта:
АПК (Автоматическая проверка конфигурации) – встроенный инструмент от 1С, который анализирует конфу на типовые ошибки, неинициализированные переменные, неиспользуемый код, потенциальные проблемы и т.д. АПК работает без запуска приложения, просто по структуре метаданных и модулей.
SonarQube. Можно конвейером выгрузить исходники и прогнать через sonar-scanner, используя плагины для BSL (языка 1С).
В идеале, использовать оба подхода в связке.
-
Автоматизированное тестирование: следующий этап, прогоним наши модификации через тесты. В экосистеме 1С сейчас доступны по крайней мере два варианта:
1С:Сценарное тестирование. Встроенный фреймворк, позволяющий писать тесты на самом 1С. Запускается через TestManager. Хорош для регрессионных модульных тестов.
BDD-тестирование (Behavior Driven). Скорее про интеграционные тесты, пользовательские сценарии. Здесь на помощь приходит опенсорс Vanessa Automation. С ее помощью пишут фичи на Gherkin и запускают их, проверяя поведение системы.
Используем оба вида, где-то хватает простых сценарных тестов, где-то пишем BDD чтобы проверить бизнес-логику целиком. В пайплайн это встраивается так: Jenkins разворачивает свежесобранную конфигурацию в специальную тестовую базу, затем запускает тесты.
Для запуска проще всего воспользоваться утилитой vanessa-runner, которая умеет разворачивать базу, запускать сценарные тесты или Vanessa Automation, а потом гасить базу. Фактически, vrunner обёртывает запуск клиента 1С с нужными параметрами. Команда может выглядеть так (псевдо-пример):
oscript vrunner.epf xunit \
--ibconnection "/F ./build/TestBase" \
--run-tests *.json \
--report-junit "./reports/xunit.xml" \
--v8version "8.3.20"
Уутилита запускает 1С:Предприятие в режиме TestClient, прогоняет все тесты и складывает отчет в JUnit-формате. Аналогично и для BDD, Vanessa Automation тоже можно запускать через vrunner или отдельным скриптом. Если без OneScript, то пришлось бы городить вызов 1cv8 ENTERPRISE /TestManager с указанием файла тестов и базы, но там уже много нюансов.
Если тесты провалились, то конвейер останавливается, ответственный разработчик получает письмо с отчётом, это тоже легко настроить, Jenkins умеет отправлять уведомления.
7. Деплой на контур: вот мы и добрались до финала. Предположим, код прошёл проверки качества и все тесты зелёные. Значит, изменения можно выкатить. В GitOps идеологии обычно делают merge в основную ветку, и автодеплой на прод. В случае 1С это обновление базы до новой конфигурации. Здесь уже обычно решается гибко, у кого-то деплой в прод автоматизирован, у кого-то полуавтомат. Часто финальное обновление делают вручную в регламентное время, особенно если система критичная. Но элементы автоматизации всё равно можно задействовать:
можно настроить ночной сборочный сервер, чтобы он сам формировал файлы обновления на основе свежей конфигурации.
для управляемых форм возможен автоматический запуск обновления базы через пакетный режим.
либо хотя бы подготовить скрипт, который ответственный человек запустит, и он обновит через тонкий клиент все базы.
В нашем пайплайне пока последним шагом будет формирование готового релизного пакета, мы сохраняем полученный .cf файл новой конфигурации и публикуем его как артефакт. Также генерируем инструкцию по обновлению. А уже непосредственно выкладку на продуктив делают специалисты по релизам вручную, потому что у нас довольно строгие требования к процедуре. Но технически ничто не мешает автоматизировать и сам деплой. GitOps подразумевает, что при коммите, скажем, тега production-release может сработать джоб, который возьмёт этот .cf и применит его к прод-базе.
Итак, получился конвейер: код -> Git -> CI/CD -> результат в виде обновлённой 1С-базы. Теперь обсудим некоторые нюансы, упомянутые выше.
Инструменты
Если вы не используете EDT, а хотите всё же подключить Git, рекомендую обратить внимание на официальную утилиту 1С:ГитКонвертер. Она предназначена для односторонней синхронизации хранилища конфигурации с Git-репозиторием. Т.е. разработчики продолжают работать через конфигуратор и централизованное хранилище, а GitConverter по расписанию выгружает свежие версии в файлы и делает коммит. Это хороший временный шаг, чтобы начать использовать плюсы Git.
Конечно, лучший путь, сразу разрабатывать в EDT с Git. Созаем новую ветку прямо в IDE, делаем изменения, коммитим и можно тут же отправить merge request. Конвейер CI подхватит эти изменения и соберёт. У EDT есть CLI, который мы используем. Например, команда экспорта EDT-проекта может выглядеть так:
"C:\Program Files\1C\EDT\edtlite.exe" export \
--project "C:\Work\My1CProject" \
--configuration-files "C:\CI\src" \
--format DistributionFiles
Команда выгрузит проект EDT в набор файлов конфигурации. Дальше по скрипту запускаем конфигуратор:
"C:\Program Files\1cv8\8.3.20.1710\bin\1cv8.exe" DESIGNER \
/F "C:\CI\Build\TmpBase" \
/LoadConfigFromFiles "C:\CI\src" \
/UpdateDBCfg \
/DisableStartupDialogs \
/Out "build.log" \
/Exit
За один вызов мы загрузили конфигурацию из файлов в пустую инфобазу и обновили ее. Запускать всё это дело желательно на отдельной базе.
Далее, тестирование, как мы обсудили, можно выполнить, например, так:
oscript vrunner.os test --reports "./reports" \
--ibconnection "/F ./CI/Build/TstBase" \
--additional "/C КонтролироватьЗавершениеРаботы=Истина"
С параметрами test vrunner сам найдёт тесты, запустит 1С в режиме TestClient и сформирует отчеты. Параметр КонтролироватьЗавершениеРаботы=Истина заставляет 1С закрыться по окончании тестирования, что удобно для CI.
Отчёты можно сохранить, и CI-сервер их подхватит и отобразит в удобном виде. В Jenkins, например, тестовый этап завершается загрузкой отчёта Allure и отправкой письма, если есть упавшие тесты.
Выводы
Напоследок, начинайте с малого. Можно сначала просто наладить выгрузку конфигурации в файлы под Git. Потом автоматизируйте сборку ночью, чтобы каждое утро была свежая тестовая база. Затем подтяните авто-тесты... Шаг за шагом вы придёте к полной CI/CD цепочке.
Спасибо за внимание!
Если вы хотите системно прокачать навыки автоматизации разработки и доставки решений на 1С, в OTUS есть профильный курс DevOps 1С. Программа глубже раскрывает практики CI/CD, мониторинга и интеграций на платформе, помогая собрать цельный инженерный стек вокруг процессов, описанных в статье. Такой подход заметно снижает операционные риски и повышает эффективность команд, работающих с 1С в реальных продакшн-средах. Пройдите входной тест, чтобы узнать, подойдет ли вам программа.
Чтобы узнать больше о формате обучения и познакомиться с преподавателями, приходите на бесплатные демо-уроки:
1 декабря: «1С и RabbitMQ». Записаться
8 декабря: «Поговорим про Kafka». Записаться
15 декабря: «Автоматизация процессов команды разработки. Интегрируем 1Сников». Записаться