mirror of
https://github.com/nixel2007/gitlab-ci-for-1c.git
synced 2024-11-21 16:46:28 +02:00
Подгружена структура репозитория
This commit is contained in:
parent
ca234ae1bc
commit
de4699410e
10
.gitignore
vendored
Normal file
10
.gitignore
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
# Вывод ошибок oscript
|
||||
log.txt
|
||||
|
||||
# Временная база oscript
|
||||
v8r_TempDB/
|
||||
|
||||
# Исключение файлов дополнительных отчетов и обработок из git
|
||||
processings/**
|
||||
!processings/.gitkeep
|
||||
!processings/README.md
|
23
.gitlab-ci.yml
Normal file
23
.gitlab-ci.yml
Normal file
@ -0,0 +1,23 @@
|
||||
stages:
|
||||
- test
|
||||
- deploy
|
||||
|
||||
before_script:
|
||||
- chcp 65001
|
||||
- git config --local core.quotepath false
|
||||
- git submodule update --init --recursive
|
||||
- oscript -encoding=utf-8 scripts\ci_before_script.os
|
||||
|
||||
deploy:
|
||||
stage: deploy
|
||||
script:
|
||||
- oscript -encoding=utf-8 scripts\ci_deploy.os
|
||||
only:
|
||||
- master
|
||||
|
||||
test:
|
||||
stage: test
|
||||
script:
|
||||
- oscript -encoding=utf-8 scripts\test_CanCompile.os
|
||||
only:
|
||||
- develop
|
6
.gitmodules
vendored
Normal file
6
.gitmodules
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
[submodule "vendor/oscript-library"]
|
||||
path = vendor/oscript-library
|
||||
url = https://github.com/EvilBeaver/oscript-library.git
|
||||
[submodule "vendor/precommit1c"]
|
||||
path = vendor/precommit1c
|
||||
url = https://github.com/xDrivenDevelopment/precommit1c.git
|
42
LICENSE
42
LICENSE
@ -1,21 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2016 Nikita Gryzlov
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2016 Nikita Gryzlov <nixel2007@gmail.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
39
README.md
39
README.md
@ -1 +1,38 @@
|
||||
# gitlab-ci-for-1c
|
||||
# gitlab-ci-for-1c
|
||||
|
||||
Готовый шаблон для начального разворачивания обновления конфигурации и дополнительных отчетов и обработок для 1С:Предприятие 8 на Gitlab CI.
|
||||
|
||||
## Принципы работы (разработка)
|
||||
|
||||
**Пуш в master запрещен**
|
||||
|
||||
---
|
||||
|
||||
### Работа с конфигурацией
|
||||
|
||||
В develop или в feature-ветках работа идет "как обычно" - редактируем код, выгружаем конфигурацию в файлы
|
||||
|
||||
При коммите и отправке на gitlab в develop или при merge-request из фиче-ветки в девелоп запускается скрипт test_CanCompile.os, проверяющий корректность исходников конфигурации. На эту же задачу CI можно навесить различные TDD и BDD проверки.
|
||||
|
||||
### Работа с обработками
|
||||
|
||||
Для сборки обработок в бинарники предназначен скрипт build_processings.cmd. Так же можно настроить post-recieve хук в git, чтобы обработки собирались автоматически при получении исходинков через git pull.
|
||||
Сборка обработок осуществляется иерархически от каталога src/processings.
|
||||
|
||||
Разбор обработок происходит скриптом decompose_processings.cmd
|
||||
Для этого обработки должны быть помещены в индекс git.
|
||||
> Важно!
|
||||
Так как сам каталог processings целиком находится под gitignore, то помещение обработок в индекс выполняется из консоли с флагом -f, например: `git add -f processings/МояОбработка.epf`
|
||||
|
||||
В итоге под git оказываются только исходники конфигурации и исходники обработок.
|
||||
|
||||
## Деплой
|
||||
|
||||
При мерже в master-ветку запускается скрипт ci_deploy.os.
|
||||
|
||||
Скрипт на основании лога git получает список измененных файлов, обновляет конфигурацию БД (при необходимости), собирает измененные отчеты и обработки и помещает их в справочник "Дополнительные отчеты и обработки". Поиск обработок осуществляется по имени файла.
|
||||
|
||||
## Список проблем
|
||||
|
||||
* Инкрементальная выгрузка - в какой-то момент работала, потом пришлось отключить и загружать целиком. В скрипте заложена возможность получения конкретного списка измененных файлов и формирования корректной строки запуска конфигуратора в пакетном режиме.
|
||||
* Конфигурация обновляется динамически. До сих пор не оттестировал работу обновления, требующего выгона пользователей. Вполне вероятно, что в конфигураторе просто повиснет модальное окно, так как каких-либо дополнительных флагов подавления сообщений скрипт на данный момент не пробрасывает.
|
||||
|
0
doc/.gitkeep
Normal file
0
doc/.gitkeep
Normal file
3
doc/README.md
Normal file
3
doc/README.md
Normal file
@ -0,0 +1,3 @@
|
||||
## doc
|
||||
|
||||
Каталог предназначен для хранения различной документации по проекту: описание отличий от типовой, инструкции и т.д.
|
0
processings/.gitkeep
Normal file
0
processings/.gitkeep
Normal file
3
processings/README.md
Normal file
3
processings/README.md
Normal file
@ -0,0 +1,3 @@
|
||||
## processings
|
||||
|
||||
Каталог предназначен для хранения собранных бинарных файлов внешних отчетов и обработок
|
10
scripts/README.md
Normal file
10
scripts/README.md
Normal file
@ -0,0 +1,10 @@
|
||||
## scripts
|
||||
|
||||
Каталог предназначен для хранения различных скриптов, необходимых для работы с репозиторием.
|
||||
|
||||
* build_processings.cmd - позволяет по щелчку мыши собрать внешние обработки из исходников в бинарники и положить их в каталог processings
|
||||
* decompose_processings.cmd - позволяет по щелчку мыши разложить добавленные в индекс git внешние обработки в исходники внутрь папки src/processings
|
||||
|
||||
* ci_before_script.os - скрипт на OneScript, выполняемый перед началом сборки на Gitlab CI
|
||||
* test_CanCompile.os - скрипт на OneScript, проверяющий, что текущие исходники конфигурации могут собраться в валидную конфигурацию
|
||||
* ci_deploy.os - скрипт на OneScript, выполняющий обновление конфигурации на боевой базе и обновление внешних отчетов и обработок в справочнике "Дополнительные отчеты и обработки"
|
2
scripts/build_processings.cmd
Normal file
2
scripts/build_processings.cmd
Normal file
@ -0,0 +1,2 @@
|
||||
chcp 65001
|
||||
oscript -encoding=utf-8 ../vendor/precommit1c/v8files-extractor.os --compile "../src/processings" "../processings" --recursive
|
24
scripts/ci_before_script.os
Normal file
24
scripts/ci_before_script.os
Normal file
@ -0,0 +1,24 @@
|
||||
// Неактуально.
|
||||
// Передалать под механизм переопределения каталога библиотек,
|
||||
// добавившийся в oscript 1.0.12
|
||||
|
||||
//Каталог = ОбъединитьПути(ТекущийКаталог(), "vendor\oscript-library\src");
|
||||
//Загрузчик_Оригинал_ИмяФайла = ОбъединитьПути(Каталог, "package-loader.os");
|
||||
//
|
||||
//Файлы = НайтиФайлы(Каталог, , Ложь);
|
||||
//Для Каждого ВыбФайл Из Файлы Цикл
|
||||
//
|
||||
// Если ВыбФайл.ЭтоФайл() Тогда
|
||||
// Продолжить;
|
||||
// КонецЕсли;
|
||||
//
|
||||
// Загрузчик_ИмяФайла = ОбъединитьПути(ВыбФайл.ПолноеИмя, "package-loader.os");
|
||||
// Загрузчик_Файл = Новый Файл(Загрузчик_ИмяФайла);
|
||||
//
|
||||
// Если Загрузчик_Файл.Существует() Тогда
|
||||
// Продолжить;
|
||||
// КонецЕсли;
|
||||
//
|
||||
// КопироватьФайл(Загрузчик_Оригинал_ИмяФайла, Загрузчик_ИмяФайла);
|
||||
//
|
||||
//КонецЦикла;
|
429
scripts/ci_deploy.os
Normal file
429
scripts/ci_deploy.os
Normal file
@ -0,0 +1,429 @@
|
||||
#Использовать "../vendor/oscript-library/src/v8runner"
|
||||
#Использовать "../vendor/oscript-library/src/tempfiles"
|
||||
// logos объявлен в одном из модулей. Ждем фикса от разработчиков библиотеки
|
||||
// #Использовать "../vendor/oscript-library/src/logos"
|
||||
|
||||
Перем Лог;
|
||||
Перем Соединение;
|
||||
Перем КодВозврата;
|
||||
|
||||
Перем СписокОбработокДляОбновления;
|
||||
|
||||
Процедура Инициализация()
|
||||
|
||||
Лог = Логирование.ПолучитьЛог("oscript.app.gitlab-deploy");
|
||||
Лог.УстановитьРаскладку(ЭтотОбъект);
|
||||
|
||||
КодВозврата = 0;
|
||||
СписокОбработокДляОбновления = Новый Массив;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Функция Форматировать(Знач Уровень, Знач Сообщение) Экспорт
|
||||
|
||||
Возврат СтрШаблон("%1: %2 - %3", ТекущаяДата(), УровниЛога.НаименованиеУровня(Уровень), Сообщение);
|
||||
|
||||
КонецФункции
|
||||
|
||||
Процедура ВывестиГоризонтальнуюЧерту()
|
||||
|
||||
Лог.Информация("------------------------------------------");
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ВыполнитьОбновлениеБазы()
|
||||
|
||||
Если КодВозврата > 0 Тогда
|
||||
Возврат;
|
||||
КонецЕсли;
|
||||
|
||||
ВывестиГоризонтальнуюЧерту();
|
||||
Лог.Информация("Выполняем обновление базы...");
|
||||
ВывестиГоризонтальнуюЧерту();
|
||||
|
||||
СтрокаИзмененныхФайлов = ПолучитьСтрокуИзмененныхФайлов("src/cf/");
|
||||
|
||||
Если НЕ ЗначениеЗаполнено(СтрокаИзмененныхФайлов) Тогда
|
||||
Лог.Информация("Обновление базы не требуется.");
|
||||
Возврат;
|
||||
КонецЕсли;
|
||||
|
||||
Лог.Информация("Строка измененных файлов: " + СтрокаИзмененныхФайлов);
|
||||
|
||||
Конфигуратор = Новый УправлениеКонфигуратором();
|
||||
УстановитьКонтекстКонфигуратора(Конфигуратор);
|
||||
|
||||
ПараметрыЗапуска = Конфигуратор.ПолучитьПараметрыЗапуска();
|
||||
// Временно отключаем инкрементальную загрузку. см #109
|
||||
//КомандаЗапуска = "/LoadConfigFromFiles ""%1"" -Files ""%2""";
|
||||
//КомандаЗапуска = СтрШаблон(КомандаЗапуска, ОбъединитьПути(ТекущийКаталог(), "source", "cf"), СтрокаИзмененныхФайлов);
|
||||
КомандаЗапуска = "/LoadConfigFromFiles ""%1""";
|
||||
КомандаЗапуска = СтрШаблон(КомандаЗапуска, ОбъединитьПути(ТекущийКаталог(), "source", "cf"));
|
||||
|
||||
Лог.Информация("Команда обновления конфигурации: " + КомандаЗапуска);
|
||||
|
||||
ПараметрыЗапуска.Добавить(КомандаЗапуска);
|
||||
|
||||
Попытка
|
||||
Конфигуратор.ВыполнитьКоманду(ПараметрыЗапуска);
|
||||
ВыводКоманды = Конфигуратор.ВыводКоманды();
|
||||
Если ЗначениеЗаполнено(ВыводКоманды) Тогда
|
||||
Лог.Информация(ВыводКоманды);
|
||||
КонецЕсли;
|
||||
Исключение
|
||||
|
||||
Лог.Ошибка(Конфигуратор.ВыводКоманды());
|
||||
КодВозврата = 1;
|
||||
Возврат;
|
||||
|
||||
КонецПопытки;
|
||||
|
||||
ВывестиГоризонтальнуюЧерту();
|
||||
Лог.Информация("Конфигурация обновлена.");
|
||||
|
||||
ВывестиГоризонтальнуюЧерту();
|
||||
Лог.Информация("Выполняем обновление конфигурации БД");
|
||||
|
||||
Попытка
|
||||
Конфигуратор.ОбновитьКонфигурациюБазыДанных();
|
||||
ВыводКоманды = Конфигуратор.ВыводКоманды();
|
||||
Если ЗначениеЗаполнено(ВыводКоманды) Тогда
|
||||
Лог.Информация(ВыводКоманды);
|
||||
КонецЕсли;
|
||||
Исключение
|
||||
|
||||
Лог.Ошибка(Конфигуратор.ВыводКоманды());
|
||||
КодВозврата = 2;
|
||||
Возврат;
|
||||
|
||||
КонецПопытки;
|
||||
|
||||
ВывестиГоризонтальнуюЧерту();
|
||||
Лог.Информация("Обновление конфигурации завершено.");
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ЗагрузитьВнешниеОтчетыИОбработки()
|
||||
|
||||
Если КодВозврата > 0 Тогда
|
||||
Возврат;
|
||||
КонецЕсли;
|
||||
|
||||
ПутьКИсходникам = "src/processings";
|
||||
|
||||
ВывестиГоризонтальнуюЧерту();
|
||||
Лог.Информация("Выполняем обновление обрабток...");
|
||||
ВывестиГоризонтальнуюЧерту();
|
||||
|
||||
СтрокаИзмененныхФайлов = ПолучитьСтрокуИзмененныхФайлов(ПутьКИсходникам);
|
||||
|
||||
Если НЕ ЗначениеЗаполнено(СтрокаИзмененныхФайлов) Тогда
|
||||
Лог.Информация("Обновление обработок не требуется.");
|
||||
Возврат;
|
||||
КонецЕсли;
|
||||
|
||||
Лог.Информация("Строка измененных файлов: " + СтрокаИзмененныхФайлов);
|
||||
|
||||
ВывестиГоризонтальнуюЧерту();
|
||||
Лог.Информация("Собираем дополнительные отчеты и обработки");
|
||||
ВывестиГоризонтальнуюЧерту();
|
||||
|
||||
СобратьКаталог(ПутьКИсходникам, "processings", СтрокаИзмененныхФайлов);
|
||||
|
||||
ВывестиГоризонтальнуюЧерту();
|
||||
Лог.Информация("Обновляем обработки в базе");
|
||||
ВывестиГоризонтальнуюЧерту();
|
||||
|
||||
СтрокаСоединения = ПолучитьСтрокуСоединенияКБазе();
|
||||
V83COMConnector = Новый COMОбъект("V83.COMConnector");
|
||||
Попытка
|
||||
Соединение = V83COMConnector.Connect(СтрокаСоединения);
|
||||
Исключение
|
||||
Лог.Ошибка("Не удалось подключиться к базе-приемнику для обновления обработок");
|
||||
Лог.Ошибка(ОписаниеОшибки());
|
||||
КодВозврата = 4;
|
||||
Возврат;
|
||||
КонецПопытки;
|
||||
|
||||
Соединение.НачатьТранзакцию();
|
||||
|
||||
КаталогОбработок = ОбъединитьПути(ТекущийКаталог(), "processings");
|
||||
ЗагрузитьКаталогОбработокВБазу(КаталогОбработок);
|
||||
|
||||
Соединение.ЗафиксироватьТранзакцию();
|
||||
|
||||
ВывестиГоризонтальнуюЧерту();
|
||||
Лог.Информация("Обновление обработок в базе завершено.");
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура СобратьКаталог(Знач ПутьКИсходникам, Знач КаталогВыгрузки, Знач СтрокаИзмененныхФайлов)
|
||||
|
||||
ТекущийКаталог = ТекущийКаталог();
|
||||
|
||||
ПолныйПутьКИсходникам = ОбъединитьПути(ТекущийКаталог, ПутьКИсходникам);
|
||||
СписокФайловВКаталоге = НайтиФайлы(ПолныйПутьКИсходникам);
|
||||
|
||||
ПолныйПутьКаталогВыгрузки = ОбъединитьПути(ТекущийКаталог, КаталогВыгрузки);
|
||||
Если НЕ Новый Файл(ПолныйПутьКаталогВыгрузки).Существует() Тогда
|
||||
СоздатьКаталог(ПолныйПутьКаталогВыгрузки);
|
||||
КонецЕсли;
|
||||
|
||||
Для Каждого Файл Из СписокФайловВКаталоге Цикл
|
||||
|
||||
Если НЕ Файл.ЭтоКаталог() Тогда
|
||||
Продолжить;
|
||||
КонецЕсли;
|
||||
|
||||
Если ЭтоПутьКИсходнымКодамОбработок(Файл.ПолноеИмя) И СтрНайти(СтрокаИзмененныхФайлов, Файл.ПолноеИмя) Тогда
|
||||
|
||||
КомандаЗапуска = "oscript -encoding=utf-8 vendor/precommit1c/v8files-extractor.os --compile ""%1"" ""%2""";
|
||||
КомандаЗапуска = СтрШаблон(КомандаЗапуска, ОбъединитьПути(ПутьКИсходникам, Файл.Имя), КаталогВыгрузки);
|
||||
Процесс = СоздатьПроцесс(КомандаЗапуска, ТекущийКаталог, Истина, , КодировкаТекста.UTF8);
|
||||
Процесс.Запустить();
|
||||
|
||||
Пока НЕ Процесс.Завершен Цикл
|
||||
Пока Процесс.ПотокВывода.ЕстьДанные Цикл
|
||||
СтрокаВывода = Процесс.ПотокВывода.ПрочитатьСтроку();
|
||||
Сообщить(СтрокаВывода);
|
||||
КонецЦикла;
|
||||
КонецЦикла;
|
||||
|
||||
Если Процесс.КодВозврата <> 0 Тогда
|
||||
ВызватьИсключение "Ошибка сбора обработки из исходников";
|
||||
КонецЕсли;
|
||||
|
||||
ИмяСобранногоФайла = ОбъединитьПути(ТекущийКаталог, КаталогВыгрузки, Файл.Имя);
|
||||
СписокОбработокДляОбновления.Добавить(ИмяСобранногоФайла + ".erf");
|
||||
СписокОбработокДляОбновления.Добавить(ИмяСобранногоФайла + ".epf");
|
||||
|
||||
Иначе
|
||||
НовыйПутьКИсходникам = ОбъединитьПути(ПутьКИсходникам, Файл.Имя);
|
||||
НовыйПутьВыгрузки = ОбъединитьПути(КаталогВыгрузки, Файл.Имя);
|
||||
СобратьКаталог(НовыйПутьКИсходникам, НовыйПутьВыгрузки, СтрокаИзмененныхФайлов);
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ЗагрузитьКаталогОбработокВБазу(Знач КаталогОбработок)
|
||||
|
||||
Файлы = НайтиФайлы(КаталогОбработок, ПолучитьМаскуВсеФайлы());
|
||||
|
||||
Для Каждого Файл Из Файлы Цикл
|
||||
|
||||
Если Файл.ЭтоКаталог() Тогда
|
||||
ЗагрузитьКаталогОбработокВБазу(Файл.ПолноеИмя);
|
||||
ИначеЕсли ЭтоФайлОтчетаИлиОбработки(Файл) И СписокОбработокДляОбновления.Найти(Файл.ПолноеИмя) <> Неопределено Тогда
|
||||
Попытка
|
||||
ЗагрузитьОбработкуВБазу(Файл.ПолноеИмя);
|
||||
Исключение
|
||||
ВывестиГоризонтальнуюЧерту();
|
||||
Лог.Ошибка("Ошибка загрузки обработок, откат изменений");
|
||||
ВызватьИсключение ОписаниеОшибки();
|
||||
КонецПопытки;
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ЗагрузитьОбработкуВБазу(ИмяФайла)
|
||||
|
||||
Лог.Информация("Загрузка обработки <" + ИмяФайла + ">");
|
||||
|
||||
ПараметрыРегистрации = Соединение.NewObject("Структура");
|
||||
ПараметрыРегистрации.Вставить("ИмяФайла", "");
|
||||
ПараметрыРегистрации.Вставить("ЭтоОтчет", Неопределено);
|
||||
ПараметрыРегистрации.Вставить("ОтключатьКонфликтующие", Ложь);
|
||||
ПараметрыРегистрации.Вставить("Конфликтующие", Соединение.NewObject("СписокЗначений"));
|
||||
ПараметрыРегистрации.Вставить("АдресДанныхОбработки", "");
|
||||
|
||||
ДД = Соединение.NewObject("ДвоичныеДанные", ИмяФайла);
|
||||
АдресДанныхОбработки = Соединение.ПоместитьВоВременноеХранилище(ДД, Соединение.NewObject("УникальныйИдентификатор"));
|
||||
ПараметрыРегистрации.АдресДанныхОбработки = АдресДанныхОбработки;
|
||||
|
||||
ФайлОбработки = Новый Файл(ИмяФайла);
|
||||
ПараметрыРегистрации.ИмяФайла = ФайлОбработки.Имя;
|
||||
|
||||
РасширениеФайла = ВРег(ФайлОбработки.Расширение);
|
||||
Если РасширениеФайла = ".ERF" Тогда
|
||||
ПараметрыРегистрации.ЭтоОтчет = Истина;
|
||||
ИначеЕсли РасширениеФайла = ".EPF" Тогда
|
||||
ПараметрыРегистрации.ЭтоОтчет = Ложь;
|
||||
Иначе
|
||||
ВызватьИсключение("Расширение файла не соответствует расширению внешнего отчета (ERF) или обработки (EPF): " + РасширениеФайла);
|
||||
Возврат;
|
||||
КонецЕсли;
|
||||
|
||||
// Вызов сервера
|
||||
РезультатРегистрации = ЗарегистрироватьОбработку(ПараметрыРегистрации);
|
||||
|
||||
// Обработка результата работы сервера
|
||||
Если РезультатРегистрации.Успешно = Истина Тогда
|
||||
|
||||
РезультатРегистрации.ОбъектСправочника.ХранилищеОбработки = Соединение.NewObject("ХранилищеЗначения" , ДД, Соединение.NewObject("СжатиеДанных", 9));
|
||||
|
||||
РезультатРегистрации.ОбъектСправочника.Записать();
|
||||
Лог.Информация("Обработка <" + ПараметрыРегистрации.ИмяФайла + "> успешно загружена");
|
||||
Возврат;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
// Разбор причины отказа загрузки обработки и отображение информации пользователю
|
||||
Если РезультатРегистрации.ИмяОбъектаЗанято = Ложь Тогда
|
||||
|
||||
// Причина отказа в КраткоеПредставлениеОшибки
|
||||
ВызватьИсключение(РезультатРегистрации.КраткоеПредставлениеОшибки);
|
||||
|
||||
Иначе
|
||||
|
||||
// Представление занявших объектов
|
||||
КоличествоКонфликтующих = РезультатРегистрации.Конфликтующие.Количество();
|
||||
ПредставлениеЗанявших = "";
|
||||
Для Каждого ЭлементСписка Из РезультатРегистрации.Конфликтующие Цикл
|
||||
ПредставлениеЗанявших = ПредставлениеЗанявших
|
||||
+ ?(ПредставлениеЗанявших = "", "", ", ")
|
||||
+ СокрЛП(ЭлементСписка.Представление);
|
||||
Если СтрДлина(ПредставлениеЗанявших) > 80 Тогда
|
||||
ПредставлениеЗанявших = Лев(ПредставлениеЗанявших, 70)
|
||||
+ "... ("
|
||||
+ Формат(КоличествоКонфликтующих, "ЧН=0; ЧГ=")
|
||||
+ " "
|
||||
+ Соединение.НСтр("ru = 'шт'")
|
||||
+ ")";
|
||||
Прервать;
|
||||
КонецЕсли;
|
||||
КонецЦикла;
|
||||
|
||||
ТекстВопроса = СтрШаблон(
|
||||
Соединение.НСтр("ru = 'Имя ""%1"" уже занято другими дополнительными отчетами (обработками):
|
||||
|%2.'"),
|
||||
РезультатРегистрации.ИмяОбъекта,
|
||||
ПредставлениеЗанявших
|
||||
);
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
// Отменить загрузку
|
||||
ВызватьИсключение("Не удалось записать обработку <" + ИмяФайла + ">");
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Функция ЗарегистрироватьОбработку(ПараметрыРегистрации)
|
||||
|
||||
СсылкаСправочника = Соединение.Справочники.ДополнительныеОтчетыИОбработки.НайтиПоРеквизиту("ИмяФайла", ПараметрыРегистрации.ИмяФайла);
|
||||
Если СсылкаСправочника.Пустая() Тогда
|
||||
Лог.Информация("Обработка <" + ПараметрыРегистрации.ИмяФайла + "> не найдена, создаем элемент");
|
||||
ОбъектСправочника = Соединение.Справочники.ДополнительныеОтчетыИОбработки.СоздатьЭлемент();
|
||||
ОбъектСправочника.Заполнить(Неопределено);
|
||||
ОбъектСправочника.ИспользоватьДляФормыОбъекта = Истина;
|
||||
ОбъектСправочника.ИспользоватьДляФормыСписка = Истина;
|
||||
Иначе
|
||||
Лог.Информация("Обработка <" + ПараметрыРегистрации.ИмяФайла + "> найдена в базе. Используем существующий элемент");
|
||||
ОбъектСправочника = СсылкаСправочника.ПолучитьОбъект();
|
||||
КонецЕсли;
|
||||
|
||||
Результат = Соединение.ДополнительныеОтчетыИОбработки.ЗарегистрироватьОбработку(ОбъектСправочника, ПараметрыРегистрации);
|
||||
АдресРазрешений = Соединение.ПоместитьВоВременноеХранилище(ОбъектСправочника.Разрешения.Выгрузить());
|
||||
|
||||
Результат.Вставить("ОбъектСправочника", ОбъектСправочника);
|
||||
|
||||
Возврат Результат;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ЭтоФайлОтчетаИлиОбработки(Знач Файл)
|
||||
|
||||
РасширениеФайла = ВРег(Файл.Расширение);
|
||||
Возврат РасширениеФайла = ".EPF" ИЛИ РасширениеФайла = ".ERF";
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ЭтоПутьКИсходнымКодамОбработок(ПутьКПапке)
|
||||
|
||||
ФайлПереименования = Новый Файл(ОбъединитьПути(ПутьКПапке, "renames.txt"));
|
||||
Возврат ФайлПереименования.Существует();
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ПолучитьСтрокуИзмененныхФайлов(Знач ОтборПоНачалуСтроки = "")
|
||||
|
||||
ТекущийКаталог = ТекущийКаталог();
|
||||
|
||||
КоманднаяСтрока = "git diff --name-only HEAD^ HEAD";
|
||||
|
||||
Процесс = СоздатьПроцесс(КоманднаяСтрока, ТекущийКаталог, Истина, , КодировкаТекста.UTF8);
|
||||
Процесс.Запустить();
|
||||
|
||||
Процесс.ОжидатьЗавершения();
|
||||
|
||||
СтрокаИзмененныхФайлов = "";
|
||||
Пока Процесс.ПотокВывода.ЕстьДанные Цикл
|
||||
|
||||
СтрокаВывода = Процесс.ПотокВывода.ПрочитатьСтроку();
|
||||
Если НЕ ЗначениеЗаполнено(ОтборПоНачалуСтроки) ИЛИ СтрНачинаетсяС(СтрокаВывода, ОтборПоНачалуСтроки) Тогда
|
||||
ТекущаяСтрока = ОбъединитьПути(ТекущийКаталог, СтрокаВывода);
|
||||
ТекущаяСтрока = СтрЗаменить(ТекущаяСтрока, "/", ПолучитьРазделительПути());
|
||||
СтрокаИзмененныхФайлов = СтрокаИзмененныхФайлов + ТекущаяСтрока + ",";
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Если ЗначениеЗаполнено(СтрокаИзмененныхФайлов) Тогда
|
||||
СтрокаИзмененныхФайлов = Лев(СтрокаИзмененныхФайлов, СтрДлина(СтрокаИзмененныхФайлов) - 1);
|
||||
КонецЕсли;
|
||||
|
||||
Возврат СтрокаИзмененныхФайлов;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ПолучитьПараметрыПодключенияКБазе()
|
||||
|
||||
СтруктураПодключения = Новый Структура;
|
||||
|
||||
СистемнаяИнформация = Новый СистемнаяИнформация;
|
||||
|
||||
Сервер = СистемнаяИнформация.ПолучитьПеременнуюСреды("SERVER_1C");
|
||||
База = СистемнаяИнформация.ПолучитьПеременнуюСреды("SERVER_REF");
|
||||
Пользователь = СистемнаяИнформация.ПолучитьПеременнуюСреды("1C_USERNAME");
|
||||
Пароль = СистемнаяИнформация.ПолучитьПеременнуюСреды("1C_PASSWORD");
|
||||
|
||||
СтруктураПодключения.Вставить("Сервер", Сервер);
|
||||
СтруктураПодключения.Вставить("База", База);
|
||||
СтруктураПодключения.Вставить("Пользователь", Пользователь);
|
||||
СтруктураПодключения.Вставить("Пароль", Пароль);
|
||||
|
||||
Возврат СтруктураПодключения;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Процедура УстановитьКонтекстКонфигуратора(УправлениеКонфигуратором)
|
||||
|
||||
Параметры = ПолучитьПараметрыПодключенияКБазе();
|
||||
|
||||
СтрокаСоединения = "/IBConnectionString""Srvr=%1;Ref=%2;""";
|
||||
СтрокаСоединения = СтрШаблон(СтрокаСоединения, Параметры.Сервер, Параметры.База);
|
||||
|
||||
УправлениеКонфигуратором.УстановитьКонтекст(СтрокаСоединения, Параметры.Пользователь, Параметры.Пароль);
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Функция ПолучитьСтрокуСоединенияКБазе()
|
||||
|
||||
Параметры = ПолучитьПараметрыПодключенияКБазе();
|
||||
|
||||
СтрокаСоединения = "Srvr=%1;Ref=%2;Usr=%3;Pwd=%4;";
|
||||
СтрокаСоединения = СтрШаблон(СтрокаСоединения, Параметры.Сервер, Параметры.База, Параметры.Пользователь, Параметры.Пароль);
|
||||
|
||||
Возврат СтрокаСоединения;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Инициализация();
|
||||
ВыполнитьОбновлениеБазы();
|
||||
ЗагрузитьВнешниеОтчетыИОбработки();
|
||||
ВременныеФайлы.Удалить();
|
||||
|
||||
ЗавершитьРаботу(КодВозврата);
|
4
scripts/decompose_processings.cmd
Normal file
4
scripts/decompose_processings.cmd
Normal file
@ -0,0 +1,4 @@
|
||||
chcp 65001
|
||||
cd ..
|
||||
oscript -encoding=utf-8 vendor/precommit1c/v8files-extractor.os --git-precommit "src" --remove-orig-bin-files
|
||||
cd scripts
|
50
scripts/test_canCompile.os
Normal file
50
scripts/test_canCompile.os
Normal file
@ -0,0 +1,50 @@
|
||||
#Использовать "../vendor/oscript-library/src/v8runner"
|
||||
#Использовать "../vendor/oscript-library/src/tempfiles"
|
||||
|
||||
Перем Лог;
|
||||
Перем КодВозврата;
|
||||
|
||||
Процедура Инициализация()
|
||||
|
||||
Лог = Логирование.ПолучитьЛог("oscript.app.gitlab-test_CanCompile");
|
||||
Лог.УстановитьРаскладку(ЭтотОбъект);
|
||||
|
||||
КодВозврата = 0;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Функция Форматировать(Знач Уровень, Знач Сообщение) Экспорт
|
||||
|
||||
Возврат СтрШаблон("%1: %2 - %3", ТекущаяДата(), УровниЛога.НаименованиеУровня(Уровень), Сообщение);
|
||||
|
||||
КонецФункции
|
||||
|
||||
Процедура ВыполнитьТест()
|
||||
|
||||
Конфигуратор = Новый УправлениеКонфигуратором();
|
||||
|
||||
ПараметрыЗапуска = Конфигуратор.ПолучитьПараметрыЗапуска();
|
||||
КомандаЗапуска = "/LoadConfigFromFiles ""%1""";
|
||||
КомандаЗапуска = СтрШаблон(КомандаЗапуска, ТекущийКаталог() + "\src\cf");
|
||||
|
||||
Лог.Информация("Команда обновления конфигурации: " + КомандаЗапуска);
|
||||
|
||||
ПараметрыЗапуска.Добавить(КомандаЗапуска);
|
||||
|
||||
Попытка
|
||||
Конфигуратор.ВыполнитьКоманду(ПараметрыЗапуска);
|
||||
Исключение
|
||||
|
||||
Лог.Ошибка(Конфигуратор.ВыводКоманды());
|
||||
КодВозврата = 1;
|
||||
|
||||
КонецПопытки;
|
||||
|
||||
УдалитьФайлы(Конфигуратор.ПутьКВременнойБазе());
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Инициализация();
|
||||
ВыполнитьТест();
|
||||
|
||||
ЗавершитьРаботу(КодВозврата);
|
3
src/README.md
Normal file
3
src/README.md
Normal file
@ -0,0 +1,3 @@
|
||||
## src
|
||||
|
||||
Каталог предназначен для хранения исходных кодов конфигурации `cf` и внешних отчетов и обработок `processings`.
|
0
src/cf/.gitkeep
Normal file
0
src/cf/.gitkeep
Normal file
0
src/processings/.gitkeep
Normal file
0
src/processings/.gitkeep
Normal file
3
vendor/README.md
vendored
Normal file
3
vendor/README.md
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
## vendor
|
||||
|
||||
Каталог предназначен для хранения стороннего (внешнего) исходного кода, используемого для работы с репозиторием и/или конфигурацией.
|
1
vendor/oscript-library
vendored
Submodule
1
vendor/oscript-library
vendored
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 39ea7f1cdf04a95150ca9fc1e72df77acdad858e
|
1
vendor/precommit1c
vendored
Submodule
1
vendor/precommit1c
vendored
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit b255a5977710c2811e4eb094a9aeadf474ebdb75
|
Loading…
Reference in New Issue
Block a user