1
0
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:
Nikita Gryzlov 2016-03-31 15:56:50 +03:00
parent ca234ae1bc
commit de4699410e
22 changed files with 632 additions and 22 deletions

10
.gitignore vendored Normal file
View File

@ -0,0 +1,10 @@
# Вывод ошибок oscript
log.txt
# Временная база oscript
v8r_TempDB/
# Исключение файлов дополнительных отчетов и обработок из git
processings/**
!processings/.gitkeep
!processings/README.md

23
.gitlab-ci.yml Normal file
View 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
View 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
View File

@ -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.

View File

@ -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 получает список измененных файлов, обновляет конфигурацию БД (при необходимости), собирает измененные отчеты и обработки и помещает их в справочник "Дополнительные отчеты и обработки". Поиск обработок осуществляется по имени файла.
## Список проблем
* Инкрементальная выгрузка - в какой-то момент работала, потом пришлось отключить и загружать целиком. В скрипте заложена возможность получения конкретного списка измененных файлов и формирования корректной строки запуска конфигуратора в пакетном режиме.
* Конфигурация обновляется динамически. До сих пор не оттестировал работу обновления, требующего выгона пользователей. Вполне вероятно, что в конфигураторе просто повиснет модальное окно, так как каких-либо дополнительных флагов подавления сообщений скрипт на данный момент не пробрасывает.

1
VERSION Normal file
View File

@ -0,0 +1 @@
2.0.5.805

0
doc/.gitkeep Normal file
View File

3
doc/README.md Normal file
View File

@ -0,0 +1,3 @@
## doc
Каталог предназначен для хранения различной документации по проекту: описание отличий от типовой, инструкции и т.д.

0
processings/.gitkeep Normal file
View File

3
processings/README.md Normal file
View File

@ -0,0 +1,3 @@
## processings
Каталог предназначен для хранения собранных бинарных файлов внешних отчетов и обработок

10
scripts/README.md Normal file
View 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, выполняющий обновление конфигурации на боевой базе и обновление внешних отчетов и обработок в справочнике "Дополнительные отчеты и обработки"

View File

@ -0,0 +1,2 @@
chcp 65001
oscript -encoding=utf-8 ../vendor/precommit1c/v8files-extractor.os --compile "../src/processings" "../processings" --recursive

View 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
View 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;";
СтрокаСоединения = СтрШаблон(СтрокаСоединения, Параметры.Сервер, Параметры.База, Параметры.Пользователь, Параметры.Пароль);
Возврат СтрокаСоединения;
КонецФункции
Инициализация();
ВыполнитьОбновлениеБазы();
ЗагрузитьВнешниеОтчетыИОбработки();
ВременныеФайлы.Удалить();
ЗавершитьРаботу(КодВозврата);

View 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

View 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
View File

@ -0,0 +1,3 @@
## src
Каталог предназначен для хранения исходных кодов конфигурации `cf` и внешних отчетов и обработок `processings`.

0
src/cf/.gitkeep Normal file
View File

0
src/processings/.gitkeep Normal file
View File

3
vendor/README.md vendored Normal file
View File

@ -0,0 +1,3 @@
## vendor
Каталог предназначен для хранения стороннего (внешнего) исходного кода, используемого для работы с репозиторием и/или конфигурацией.

1
vendor/oscript-library vendored Submodule

@ -0,0 +1 @@
Subproject commit 39ea7f1cdf04a95150ca9fc1e72df77acdad858e

1
vendor/precommit1c vendored Submodule

@ -0,0 +1 @@
Subproject commit b255a5977710c2811e4eb094a9aeadf474ebdb75