Возникла у нас потребность в обновлении тестовой среды из определенной ветки в удаленном GIT репозитории. Выбор пал на OneScript, так как богатая библиотека и много уже сделано сообществом. Основная проблема заключалась в том что проект ведется в EDT и соответственно в GIT все файлы лежат в формате EDT.
В этой публикации я не буду рассказывать, как установить OneScript и подключать библиотеки, об этом есть отдельные публикации (OneScript).
Первым делом определяем json файл c настройками, чтобы не указывать их в коде. Подробно останавливаться не буду, в файле в комментариях к ключам есть вся информация. Если не нужно отправлять информацию в telegram, то в блоке telegram.toSend ставим false, также с блоком youtrack.use
{"repositoryName": имя удаленного репозитория, на компьютере,с которого запускается скрипт должен быть установлен git bash, при первом запуске будет предложена аутентификация
"reositoryLocalName": путь к локальному репозиторию ,
"base": { // структура базы 1с, в которую будут загружены файлы
"v8Version": "8.3.17", // версия платформы, под которой будет выполнен запуск 1с
"Srvr": сервер на котором лежит база 1с, если база файловая то пустая строка
"name": Имя базы на сервере, если база файловая то полный путь к базе
"isFileBase": true или false, определяет файловая база или нет
"potr": порт для подклчения к базе, если не стандартный используется на сервере 1с
"login": "", логин к базе
"pass": "", пароль к базе
"keyPermissions": "123" ключ разрешения доступа
"echengeDir": "каталог, куда будет выгружен cf, если не указан, то cf выгружен не будет",
"cfName": "имя cf файла"
},
"edt":{ // структура для подключения к EDT,
"edtVersion": "edt@2023.2.0:x86_64", Версия EDT которая будет запущена для выгрузки файлов, доступные версии можно узнать выполнив команду ring help
"project": "", полный путь к проекту EDT
"brancheName": "", имя ветки, которая будет получена в удаленном репозитории
"configurationFiles": "", путь к папке, куда будут выгружены файлы конфигурации
"workspaceLocation": "", рабочее пространство EDT, указывается при создании проекта. Расположение рабочей области указано в параметре: Окно > Параметры > Общие > Рабочая область > Отображать полный путь к рабочей области. Этот путь можно выделить и скопировать в буфер обмена.
"edtLocation": "",
"fileCommitHistory": "", текстовый файл, куда будет записана история коммитов
"periodCommins": период коммитоа в часах, за сколько последних часов получить историю коммитор
},
"telegram":{
"toSend": false или true, определяет отправлять историю комитов в телегу или нет
"token": "", токен для телеги
"server": "", сервер где лежит webhook
"webhook": "", сам webhook
"port": 443,
"timeOut": 100,
"Recipients":[ получатели сообщения
{
"id": "",
"message_thread_id":
}
]
}
"youtrack":{
"use": true или false, определяет переносить задачи или нет
"server": "", Сервер youtrack
"token": "", Токен youtrack, создается в настройках youtrack
"projectNames":[ Массив Имен проектов, которые нужно анализировать
{"shortName":"ИД проекта","name":"Имя проекта"},
],
"stageBefore":Имя стадии до переноса
"stageAfter": Имя стадии после переноса
}
Далее работам с OneScript.
Импортируем библиотеку для работы с JSON и читаем настройки из файла
#Использовать "lib/json"
Перем СтруктураПараметровБазы; // Структура параметров подключения к конфигурации 1с, заполняется из файла настроек base
Перем СтруктураПараметровЕДТ; // Структура параметров подключения к EDT, заполняется из файла настроек edt;
Перем СтруктураПараметровТелеграм; // Структура параметров телеграм, заполняется из файла настроек telegram
Перем НастройкиИзJson; // Все настройки из файла config.json
Процедура ОпределитьНастройки()
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать("config.json", "UTF-8");
Строка = ТекстовыйДокумент.ПолучитьТекст();
json = Новый ПарсерJson;
НастройкиИзJson = json.ПрочитатьJSON(Строка, , , Истина);
СтруктураПараметровБазы = НастройкиИзJson.base;
СтруктураПараметровЕДТ = НастройкиИзJson.edt;
СтруктураПараметровТелеграм = НастройкиИзJson.telegram;
КонецПроцедуры
Импортируем библиотеку gitrunner и загружаем нужную ветку в удаленном репозитории в локальный
Функция ПолучитьИзУдаленногоРепозитория(СтруктураПараметровЕДТ, НастройкиИзJson) Экспорт
НоваяВетка = СтруктураПараметровЕДТ.brancheName + "_" + Формат(ТекущаяДата(), "ДФ=гггг_ММ_дд_ЧЧ_мм");
ГитРепозиторий = Новый ГитРепозиторий();
ЛокальныйКаталогРепозитория = НастройкиИзJson.reositoryLocalName;
ЛокальныйКаталогРепозитория = СтрЗаменить(ЛокальныйКаталогРепозитория, "/", "\");
ИмяРепозитория = НастройкиИзJson.repositoryName;
ГитРепозиторий.УстановитьРабочийКаталог(ЛокальныйКаталогРепозитория);
ГитРепозиторий.Получить(ИмяРепозитория, СтруктураПараметровЕДТ.brancheName);
Сообщить("Получили ветку " + СтруктураПараметровЕДТ.brancheName + " из удаленного репозитория");
ГитРепозиторий.СоздатьВетку(НоваяВетка);
Сообщить("Создали ветку " + НоваяВетка + " в локальном репозитории");
ГитРепозиторий.ПерейтиВВетку(НоваяВетка);
Успешно = Истина;
ВыгрузитьВФайлыИзЕДТ(СтруктураПараметровЕДТ, Успешно);
СтруктураГитРепозитория = Новый Структура();
СтруктураГитРепозитория.Вставить("ГитРепозиторий", ГитРепозиторий);
СтруктураГитРепозитория.Вставить("Ветка", СтруктураПараметровЕДТ.brancheName);
СтруктураГитРепозитория.Вставить("НоваяВетка", НоваяВетка);
СтруктураГитРепозитория.Вставить("УспешноВыгрузилиФайлы", Успешно);
Возврат СтруктураГитРепозитория;
КонецФункции
Теперь нужная ветка с нужными коммитами лежит в локальном репозитории, проблема в том, что эти файлы в формате EDT, и напрямую загрузить их в конфигурацию 1С не получится, нужно сконвертировать. Для этого используем интерфейс командной строки EDT, подробнее можно почитать тут EDT. Предварительно импортируем библиотеку 1commands
Процедура ВыгрузитьВФайлыИзЕДТ(СтруктураПараметровЕДТ, Успешно)
Кавычка = 34;
КаталогВыгрузки = СтрЗаменить(СтруктураПараметровЕДТ.configurationFiles, "/", "\");
ОбщегоНазначения.УдалитьФайлыИзКаталога(КаталогВыгрузки);
КаталогВыгрузки = Символ(Кавычка) + КаталогВыгрузки + Символ(Кавычка);
РабочаяОбласть = Символ(Кавычка) + СтрЗаменить(СтруктураПараметровЕДТ.workspaceLocation, "/", "\") + Символ(Кавычка);
КаталогЕдт = Символ(Кавычка) + СтрЗаменить(СтруктураПараметровЕДТ.edtLocation, "/", "\") + Символ(Кавычка);
ПроектаЕдт = Символ(Кавычка) + СтрЗаменить(СтруктураПараметровЕДТ.project, "/", "\") + Символ(Кавычка);
ТекстКоманднойСтроки = "ring ВерсияЕдт ";
ТекстКоманднойСтроки = ТекстКоманднойСтроки + "workspace export --project ПроектаЕдт ";
ТекстКоманднойСтроки = ТекстКоманднойСтроки + "--configuration-files КаталогВыгрузки ";
ТекстКоманднойСтроки = ТекстКоманднойСтроки + "--workspace-location РабочаяОбласть";
ТекстКоманднойСтроки = СтрЗаменить(ТекстКоманднойСтроки, "ВерсияЕдт", СтруктураПараметровЕДТ.edtVersion);
ТекстКоманднойСтроки = СтрЗаменить(ТекстКоманднойСтроки, "ПроектаЕдт", ПроектаЕдт);
ТекстКоманднойСтроки = СтрЗаменить(ТекстКоманднойСтроки, "КаталогВыгрузки", КаталогВыгрузки);
ТекстКоманднойСтроки = СтрЗаменить(ТекстКоманднойСтроки, "РабочаяОбласть", РабочаяОбласть);
ТекстКоманднойСтроки = СтрЗаменить(ТекстКоманднойСтроки, "КаталогЕдт", КаталогЕдт);
Команда = Новый Команда;
Команда.УстановитьСтрокуЗапуска(ТекстКоманднойСтроки);
ответВыгрузки = Команда.Исполнить();
Если ответВыгрузки = 0 Тогда
Сообщить("Выгрузили файлы кофигурации");
Иначе
Успешно = Ложь;
КонецЕсли;
КонецПроцедуры
Теперь у нас все файлы в нужном формате. Осталось загрузить все в нужную конфигурацию. Импортируем библиотеку v8runner
Процедура ЗагрузитьКонфигурациюИзФайлов(СтруктураПараметровЕДТ, СтруктураПараметровБазы) Экспорт
КаталогВыгрузки = СтрЗаменить(СтруктураПараметровЕДТ.configurationFiles, "/", "\");
Конфигуратор = Новый УправлениеКонфигуратором();
УстановитьКонтекст(Конфигуратор, СтруктураПараметровБазы);
Конфигуратор.ЗагрузитьКонфигурациюИзФайлов(КаталогВыгрузки);
ОбщегоНазначения.УдалитьФайлыИзКаталога(КаталогВыгрузки);
Сообщить("Загрузили файлы кофигурации");
Конфигуратор.ОбновитьКонфигурациюБазыДанных(Ложь, Истина);
Сообщить("Обновили конфигурацию базы данных");
Сообщить("Выполняем проверки конфигурации");
ПроверитьКонфигурацию(Конфигуратор);
Сообщить("Выгружаем конфигурацию в файл");
ВыгрузитьКонфигурацию(Конфигуратор, СтруктураПараметровБазы);
КонецПроцедуры
Все готово, конфигурация загружена из удаленной ветки.