diff --git a/GitLab-CI/.gitlab-ci-mergeRequest.yml b/GitLab-CI/.gitlab-ci-mergeRequest.yml new file mode 100644 index 0000000..73980f4 --- /dev/null +++ b/GitLab-CI/.gitlab-ci-mergeRequest.yml @@ -0,0 +1,83 @@ +before_script: + - CHCP 65001 + +stages: +- build +- test +- report + +variables: + WP: '${CI_PROJECT_DIR}/temp/wp' + +buildMR: + stage: build + tags: + - edt + only: + - merge_requests + script: + - executor_j11 -s $env:CI_SCRIPTS/1cicd.sbsl buildMR + artifacts: + name: build + paths: + - build/ + - ci/ + cache: + key: ${CI_COMMIT_REF_SLUG} + paths: + - $env:WP + +testCore: + stage: test + tags: + - edt + only: + - merge_requests + dependencies: + - buildMR + script: + - executor_j11 -s $env:CI_SCRIPTS/1cicd.sbsl testCore + artifacts: + name: test + reports: + junit: test/junit/*.xml + paths: + - test/ + - ci/ + +testUI: + stage: test + tags: + - edt + only: + - merge_requests + dependencies: + - buildMR + script: + - executor_j11 -s $env:CI_SCRIPTS/1cicd.sbsl testUI + artifacts: + name: test + reports: + junit: test/junit/*.xml + paths: + - test/ + - ci/ + - public/ + environment: + name: allure + url: https://${CI_SERVER_HOST}/${CI_PROJECT_PATH}/-/jobs/${CI_JOB_ID}/artifacts/file/public/index.html + +pages: + stage: report + tags: + - edt + only: + - merge_requests + dependencies: + - testUI + script: + - executor_j11 -s $env:CI_SCRIPTS/1cicd.sbsl pages + artifacts: + paths: + - ci/ + - public/ diff --git a/GitLab-CI/.gitlab-ci.yml b/GitLab-CI/.gitlab-ci-release.yml similarity index 87% rename from GitLab-CI/.gitlab-ci.yml rename to GitLab-CI/.gitlab-ci-release.yml index c902d63..34ac808 100644 --- a/GitLab-CI/.gitlab-ci.yml +++ b/GitLab-CI/.gitlab-ci-release.yml @@ -41,7 +41,7 @@ testCore: artifacts: name: test reports: - junit: test/junit/junit.xml + junit: test/junit/*.xml paths: - test/ - ci/ @@ -59,11 +59,14 @@ testUI: artifacts: name: test reports: - junit: test/junit/junit.xml + junit: test/junit/*.xml paths: - test/ - ci/ - public/ + environment: + name: allure + url: https://${CI_SERVER_HOST}/${CI_PROJECT_PATH}/-/jobs/${CI_JOB_ID}/artifacts/file/public/index.html pages: stage: report diff --git a/VA-Тесты/steps/kapral.epf b/VA-Тесты/steps/kapral.epf index 08bbf33..82ef526 100644 Binary files a/VA-Тесты/steps/kapral.epf and b/VA-Тесты/steps/kapral.epf differ diff --git a/Скрипты/1cicd.sbsl b/Скрипты/1cicd.sbsl index 229e86b..6ff0929 100644 --- a/Скрипты/1cicd.sbsl +++ b/Скрипты/1cicd.sbsl @@ -32,6 +32,8 @@ иначе СобратьПоследнийРелиз() // Доработать на СобратьРелизНаДату() ; + когда "buildMR" + СобратьРелизДляСлияния() когда "testCore" ПротестироватьКод() когда "testUI" @@ -269,6 +271,230 @@ ; ; +метод СобратьРелизДляСлияния() + знч WP = СредаИсполнения.ПолучитьПеременную("WP") + + знч CI_JOB_ID = СредаИсполнения.ПолучитьПеременную("CI_JOB_ID") + знч CI_JOB_TOKEN = СредаИсполнения.ПолучитьПеременную("CI_JOB_TOKEN") + знч CI_PROJECT_DIR = СредаИсполнения.ПолучитьПеременную("CI_PROJECT_DIR") + знч CI_PROJECT_ID = СредаИсполнения.ПолучитьПеременную("CI_PROJECT_ID") + знч CI_PROJECT_PATH = СредаИсполнения.ПолучитьПеременную("CI_PROJECT_PATH") + знч CI_PROJECT_NAMESPACE = СредаИсполнения.ПолучитьПеременную("CI_PROJECT_NAMESPACE") + знч CI_SERVER_HOST = СредаИсполнения.ПолучитьПеременную("CI_SERVER_HOST") + + знч RELEASES_TOKEN = СредаИсполнения.ПолучитьПеременную("RELEASES_TOKEN") + + пер ошибкиТокенов = "" + если RELEASES_TOKEN.Пусто() + ошибкиТокенов += "В переменную RELEASES_TOKEN необходимо поместить api token репозитория Релизов." + Символы.НоваяСтрока + ; + + знч настройки = ПрочитатьНастройкиСборки("%CI_PROJECT_DIR") + + если СредаИсполнения.ПолучитьПеременную(настройки.Конфигурация.ПеременнаяТокена).Пусто() + ошибкиТокенов += "В переменную %{настройки.Конфигурация + .ПеременнаяТокена} необходимо поместить read api token репозитория %{настройки.Конфигурация.Имя}." + Символы.НоваяСтрока + ; + для репозиторийРасширения из настройки.ПрикладныеРасширения + если СредаИсполнения.ПолучитьПеременную(репозиторийРасширения.ПеременнаяТокена).Пусто() + ошибкиТокенов += "В переменную %{репозиторийРасширения + .ПеременнаяТокена} необходимо поместить read api token репозитория %{репозиторийРасширения.Имя}." + + Символы.НоваяСтрока + ; + ; + для репозиторийРасширения из настройки.ТестовыеРасширения + если СредаИсполнения.ПолучитьПеременную(репозиторийРасширения.ПеременнаяТокена).Пусто() + ошибкиТокенов += "В переменную %{репозиторийРасширения + .ПеременнаяТокена} необходимо поместить read api token репозитория %{репозиторийРасширения.Имя}." + + Символы.НоваяСтрока + ; + ; + + если не ошибкиТокенов.Пусто() + выбросить новый ИсключениеНедопустимоеСостояние(ошибкиТокенов) + ; + + знч полныйПутьПрикладнойСборки = "%CI_PROJECT_DIR/%ИМЯ_КАТАЛОГА_ПРИКЛАДНОЙ_СБОРКИ" + знч полныйПутьТестовойСборки = "%CI_PROJECT_DIR/%ИМЯ_КАТАЛОГА_ТЕСТОВОЙ_СБОРКИ" + + Консоль.Записать("Создать каталог: %полныйПутьПрикладнойСборки") + Файлы.СоздатьКаталог(полныйПутьПрикладнойСборки) + + Консоль.Записать("Создать каталог: %полныйПутьТестовойСборки") + Файлы.СоздатьКаталог(полныйПутьТестовойСборки) + + знч полныйПутьСлужебнойСборки = "%CI_PROJECT_DIR/%ИМЯ_КАТАЛОГА_СЛУЖЕБНОЙ_СБОРКИ" + Консоль.Записать("Создать каталог: %полныйПутьСлужебнойСборки") + Файлы.СоздатьКаталог(полныйПутьСлужебнойСборки) + + знч адресРепозиторияКонфигурации = "https://gitlab-ci-token:%CI_JOB_TOKEN@%CI_SERVER_HOST/%CI_PROJECT_NAMESPACE/%{настройки + .Конфигурация + .Имя}.git" + Консоль.Записать("Git_Clone: %адресРепозиторияКонфигурации %{настройки.Конфигурация.Ветка}") + Git_Clone(адресРепозиторияКонфигурации, настройки.Конфигурация.Ветка) + + знч путьКонфигурацииЕДТ = "%CI_PROJECT_DIR/%{настройки.Конфигурация.Имя}/%{настройки.Конфигурация.Проект}" + Консоль.Записать("ИсполняемыйФайлПлатформы: %путьКонфигурацииЕДТ") + знч исполняемыйФайлПлатформы = ИсполняемыйФайлПлатформы(путьКонфигурацииЕДТ) + + знч путьИБ = "%CI_PROJECT_DIR/temp/db" + Консоль.Записать("CreateInfobase: %путьИБ %исполняемыйФайлПлатформы") + CreateInfobase(путьИБ, исполняемыйФайлПлатформы) + + знч имяРепозиторияРелизов = "%CI_PROJECT_NAMESPACE\%2Freleases" + Консоль.Записать("Releases_LastDate: %имяРепозиторияРелизов %CI_SERVER_HOST") + знч датаПоследнегоРелиза = Releases_LastDate(имяРепозиторияРелизов, RELEASES_TOKEN, CI_SERVER_HOST) + Консоль.Записать("Дата последнего релиза = %датаПоследнегоРелиза") + + знч запросНаСлияние = ПараметрыЗапросаНаСлияние() + + пер пересобиратьОсновнуюКонфигурацию = Ложь + пер репозиторииДляПересборки = новый Массив() + пер путиСборки = новый Соответствие() + + если настройки.Конфигурация.Имя == запросНаСлияние.имяПроекта + пересобиратьОсновнуюКонфигурацию = Истина + иначе + знч результатПроверки = ПроверитьКоммитыРепозиторияДляПоследнегоРелиза(настройки.Конфигурация, датаПоследнегоРелиза) + если результатПроверки != Неопределено + пересобиратьОсновнуюКонфигурацию = Истина + + иначе + если не СкачатьАртефактРепозитория(настройки.Конфигурация, ИМЯ_КАТАЛОГА_ПРИКЛАДНОЙ_СБОРКИ, Ложь) + пересобиратьОсновнуюКонфигурацию = Истина + ; + ; + ; + + для репозиторийРасширения из настройки.ПрикладныеРасширения + путиСборки.Вставить(репозиторийРасширения.Имя, полныйПутьПрикладнойСборки) + + если репозиторийРасширения.Имя == запросНаСлияние.имяПроекта + репозиторииДляПересборки.Добавить(репозиторийРасширения) + иначе + знч результатПроверкиРасширения = ПроверитьКоммитыРепозиторияДляПоследнегоРелиза(репозиторийРасширения, датаПоследнегоРелиза) + если результатПроверкиРасширения != Неопределено + репозиторииДляПересборки.Добавить(репозиторийРасширения) + + иначе + если не СкачатьАртефактРепозитория(репозиторийРасширения, ИМЯ_КАТАЛОГА_ПРИКЛАДНОЙ_СБОРКИ, Истина) + репозиторииДляПересборки.Добавить(репозиторийРасширения) + ; + ; + + если настройки.Конфигурация.Имя == запросНаСлияние.имяПроекта + пересобиратьОсновнуюКонфигурацию = Истина + ; + ; + ; + + для репозиторийРасширения из настройки.ТестовыеРасширения + путиСборки.Вставить(репозиторийРасширения.Имя, полныйПутьТестовойСборки) + + если репозиторийРасширения.Имя == запросНаСлияние.имяПроекта + репозиторииДляПересборки.Добавить(репозиторийРасширения) + иначе + знч результатПроверкиРасширения = ПроверитьКоммитыРепозиторияДляПоследнегоРелиза(репозиторийРасширения, датаПоследнегоРелиза) + если результатПроверкиРасширения != Неопределено + репозиторииДляПересборки.Добавить(репозиторийРасширения) + + иначе + если не СкачатьАртефактРепозитория(репозиторийРасширения, ИМЯ_КАТАЛОГА_ТЕСТОВОЙ_СБОРКИ, Истина) + репозиторииДляПересборки.Добавить(репозиторийРасширения) + ; + ; + ; + ; + + если не пересобиратьОсновнуюКонфигурацию и репозиторииДляПересборки.Пусто() + Консоль.Записать("Jobs_Cancel: %CI_JOB_ID %CI_PROJECT_ID %CI_SERVER_HOST") + Jobs_Cancel(CI_JOB_ID, CI_PROJECT_ID, RELEASES_TOKEN, CI_SERVER_HOST) + возврат + ; + + знч файлКонфигурации = "%полныйПутьПрикладнойСборки/1cv8.cf" + если пересобиратьОсновнуюКонфигурацию + знч путьКонфигурацииПлатформы = "%CI_PROJECT_DIR/temp/src_%{настройки.Конфигурация.Имя}" + Консоль.Записать("WorkspaceExport: %путьКонфигурацииЕДТ %путьКонфигурацииПлатформы %WP") + WorkspaceExport(путьКонфигурацииЕДТ, путьКонфигурацииПлатформы, WP, ВЕРСИЯ_EDT) + + попытка + знч файлПоставки = "%путьКонфигурацииПлатформы/Ext/ParentConfigurations.bin" + Консоль.Записать("Удалить файл: %файлПоставки") + Файлы.Удалить(файлПоставки) + поймать исключение: любой + Консоль.Записать("Было исключение %исключение") + ; + попытка + знч каталогПоставки = "%путьКонфигурацииПлатформы/Ext/ParentConfigurations" + Консоль.Записать("Удалить каталог: %каталогПоставки") + Файлы.Удалить(каталогПоставки) + поймать исключение: любой + Консоль.Записать("Было исключение %исключение") + ; + + Консоль.Записать("LoadConfigFromFiles: %путьКонфигурацииПлатформы %путьИБ %исполняемыйФайлПлатформы") + LoadConfigFromFiles(путьКонфигурацииПлатформы, путьИБ, исполняемыйФайлПлатформы) + + Консоль.Записать("UpdateDBCfg: %путьИБ %исполняемыйФайлПлатформы") + UpdateDBCfg(путьИБ, исполняемыйФайлПлатформы) + + Консоль.Записать("CreateDistributionFiles: %файлКонфигурации %путьИБ %исполняемыйФайлПлатформы") + CreateDistributionFiles(файлКонфигурации, путьИБ, исполняемыйФайлПлатформы) + иначе + Консоль.Записать("LoadCfg: %файлКонфигурации %путьИБ %исполняемыйФайлПлатформы") + LoadCfg(файлКонфигурации, путьИБ, исполняемыйФайлПлатформы) + + Консоль.Записать("UpdateDBCfg: %путьИБ %исполняемыйФайлПлатформы") + UpdateDBCfg(путьИБ, исполняемыйФайлПлатформы) + ; + + для репозиторий из репозиторииДляПересборки + знч адресРепозитория = "https://gitlab-ci-token:%CI_JOB_TOKEN@%CI_SERVER_HOST/%CI_PROJECT_NAMESPACE/%{репозиторий + .Имя}.git" + Консоль.Записать("Git_Clone: %адресРепозитория %{репозиторий.Ветка}") + Git_Clone(адресРепозитория, репозиторий.Ветка) + + пер путьРасширенияЕДТ = "%CI_PROJECT_DIR/%{репозиторий.Имя}/%{репозиторий.Проект}" + если не (новый Файл(путьРасширенияЕДТ)).Существует() + путьРасширенияЕДТ = "%CI_PROJECT_DIR/%{репозиторий.Имя}/%{настройки.Конфигурация.Проект}.%{репозиторий + .Проект}" + ; + знч путьРасширенияПлатформы = "%CI_PROJECT_DIR/temp/src_%{репозиторий.Имя}" + Консоль.Записать("WorkspaceExport: %путьРасширенияЕДТ %путьРасширенияПлатформы %WP") + WorkspaceExport(путьРасширенияЕДТ, путьРасширенияПлатформы, WP, ВЕРСИЯ_EDT) + + Консоль.Записать("LoadExtFromFiles: %путьРасширенияПлатформы %{репозиторий.Проект} %{путьИБ} %исполняемыйФайлПлатформы") + LoadExtFromFiles(путьРасширенияПлатформы, репозиторий.Проект, путьИБ, исполняемыйФайлПлатформы) + + Консоль.Записать("UpdateDBExt: %путьИБ %исполняемыйФайлПлатформы") + UpdateDBExt(репозиторий.Проект, путьИБ, исполняемыйФайлПлатформы) + + знч путьСборкиРасширения = путиСборки.Получить(репозиторий.Имя) + знч файлРасширения = "%путьСборкиРасширения/%{репозиторий.Проект}.cfe" + Консоль.Записать("DumpDBExt: %файлРасширения %{репозиторий.Проект} %путьИБ %исполняемыйФайлПлатформы") + DumpExt(файлРасширения, репозиторий.Проект, путьИБ, исполняемыйФайлПлатформы) + ; + + пер списокДвоичныхФайлов = новый Массив() + знч каталогСборкиПроекта = новый Файл(CI_PROJECT_DIR) + для файл из Файлы.Найти(ИМЯ_КАТАЛОГА_ПРИКЛАДНОЙ_СБОРКИ) + знч путьВнутриСборки = файл.Путь.Удалить(каталогСборкиПроекта.Путь) + списокДвоичныхФайлов.Добавить(путьВнутриСборки) + ; + знч имяФайлаАссетов = "%ИМЯ_КАТАЛОГА_СЛУЖЕБНОЙ_СБОРКИ/assets_bin.json" + Консоль.Записать("ЗаписатьОписаниеАссетов: %имяФайлаАссетов %CI_PROJECT_PATH %CI_JOB_ID") + ЗаписатьОписаниеАссетов(имяФайлаАссетов, CI_PROJECT_PATH, CI_JOB_ID, списокДвоичныхФайлов) + + знч логФайлыРабочейОбласти = "%WP/.metadata/" + пер настройкиПоиска = новый НастройкиПоискаФайлов() + настройкиПоиска.ИмяСодержит(".log") + для файл из Файлы.Найти(логФайлыРабочейОбласти, настройкиПоиска) + Консоль.Записать("Удалить файл: %{файл.Путь}") + Файлы.Удалить(файл) + ; +; + метод ПротестироватьКод() знч WP = СредаИсполнения.ПолучитьПеременную("WP") @@ -295,6 +521,8 @@ Консоль.Записать("Создать каталог: %полныйПутьРезультатовТестов") Файлы.СоздатьКаталог(полныйПутьРезультатовТестов) + Консоль.Записать("Создать каталог: %полныйПутьРезультатовТестов/junit") + Файлы.СоздатьКаталог("%полныйПутьРезультатовТестов/junit") знч адресРепозиторияКонфигурации = "https://gitlab-ci-token:%CI_JOB_TOKEN@%CI_SERVER_HOST/%CI_PROJECT_NAMESPACE/%{настройки .Конфигурация @@ -307,9 +535,15 @@ Консоль.Записать("WorkspaceValidate: %файлРезультатовВалидации %путьКонфигурацииЕДТ %WP") WorkspaceValidate(файлРезультатовВалидации, путьКонфигурацииЕДТ, WP, ВЕРСИЯ_EDT) + знч данныеОшибок = ОшибкиВФорматеSonarCube(файлРезультатовВалидации) + знч файлSonarQube = "%полныйПутьРезультатовТестов/%{настройки.Конфигурация.Имя}.json" - Консоль.Записать("ПреобразоватьОшибкиВФорматSonarCube: %файлSonarQube %файлРезультатовВалидации") - ПреобразоватьОшибкиВФорматSonarCube(файлSonarQube, файлРезультатовВалидации) + Консоль.Записать("ЗаписатьОшибкиВФорматSonarCube: %файлSonarQube %файлРезультатовВалидации") + ЗаписатьОшибкиВФорматSonarCube(файлSonarQube, данныеОшибок) + + знч файлJunit = "%полныйПутьРезультатовТестов/junit/%{настройки.Конфигурация.Имя}.xml" + Консоль.Записать("ЗаписатьОшибкиВФорматJUnit: %файлJunit %файлРезультатовВалидации") + ЗаписатьОшибкиВФорматJUnit(файлJunit, данныеОшибок) если не настройки.СерверSonarQube.Пусто() знч файлПараметровСканера = "%CI_PROJECT_DIR/sonar-project-%{настройки.Конфигурация.Имя}.properties" @@ -404,6 +638,12 @@ пер Пользователи: Массив ; +перечисление VAParamsСпособыСнятияСкриншотовВнешнейКомпонентой + ВесьЭкран умолчание // 0 + ТекущееОкноКлиентаТестирования // 1 + ВсеОкнаКлиентаТестирования // 2 +; + структура VAParams пер КаталогПроекта: Строка пер КаталогФич: Строка @@ -426,6 +666,11 @@ пер ИспользоватьКомпонентуVanessaExt: Булево = Истина пер ТихаяУстановкаVanessaExt: Булево = Истина + пер ИспользоватьВнешнююКомпонентуДляСкриншотов: Булево = Истина + пер СпособСнятияСкриншотовВнешнейКомпонентой: Число = 2 // VAParamsСпособыСнятияСкриншотовВнешнейКомпонентой + пер ДелатьСкриншотПриВозникновенииОшибки: Булево = Истина + пер СниматьСкриншотКаждогоОкна1С: Булево = Ложь + пер КаталогВыгрузкиСкриншотов: Строка = "" пер ВыполнениеСценариев: VAParamsВыполнениеСценариев @@ -451,7 +696,10 @@ структура VAParamsКлиентТестирования пер ЗапускатьКлиентТестированияСМаксимизированнымОкном: Булево = Истина + пер ЗакрыватьКлиентТестированияПринудительно: Булево = Истина + пер ТаймаутПередПринудительнымЗакрытиемКлиентаТестирования: Число = 10 пер ДиапазонПортовTestclient: Строка = "" + пер ТаймаутЗапуска1С: Число = 25 конструктор() конструктор(ДиапазонПортовTestclient) @@ -690,11 +938,13 @@ пер настройкиVAParamsВыполнениеСценариев = новый VAParamsВыполнениеСценариев() пер настройкиVAParamsКлиентТестирования = новый VAParamsКлиентТестирования("%начальныйПорт-%конечныйПорт") + настройкиVAParamsКлиентТестирования.ТаймаутЗапуска1С = 60 пер настройкиVAParamsОтчетAllure = новый VAParamsОтчетAllure(каталогВыгрузкиAllure, каталогФич) - пер настройкиVAParamsОтчетJUnit = новый VAParamsОтчетJUnit("%полныйПутьРезультатовТестов/junit") + пер настройкиVAParamsОтчетJUnit = новый VAParamsОтчетJUnit(Файлы.СоздатьКаталог("%временныйКаталогИБ/junit").Путь) пер настройкиVAParams = новый VAParams(каталогПроекта, каталогФич, ["%CI_VA/steps"], настройкиVAParamsВыполнениеСценариев, настройкиVAParamsКлиентТестирования, настройкиVAParamsОтчетAllure, настройкиVAParamsОтчетJUnit) + настройкиVAParams.КаталогВыгрузкиСкриншотов = Файлы.СоздатьКаталог("%временныйКаталогИБ/screenShots").Путь знч временныйФайлНастроекVA = Файлы.Создать("%временныйКаталогИБ/VAParams.json") исп потокНастроекVA = временныйФайлНастроекVA.ОткрытьПотокЗаписи() @@ -717,6 +967,13 @@ ОбработатьЗавершениеКомандыПлатформы(командаПлатформы) ; + пер индекс = 1 + для пользователь из настройки.Шаблоны.Пользователи + пер временныйКаталогИБ = временныеИБПользователей.Получить(пользователь.Представление) + Файлы.Скопировать("%временныйКаталогИБ/junit/junit.xml", "%полныйПутьРезультатовТестов/junit/junit-%индекс.xml") + индекс += 1 + ; + AllureGenerate(настройки) ; @@ -937,7 +1194,7 @@ метод СкачатьАртефактРепозитория(репозиторий: ОписаниеРепозитория, путьСборки: Строка, расширение: Булево): Булево знч CI_COMMIT_REF_SLUG = СредаИсполнения.ПолучитьПеременную("CI_COMMIT_REF_SLUG") - знч CI_PROJECT_ID = СредаИсполнения.ПолучитьПеременную("CI_PROJECT_ID") + знч CI_PROJECT_NAMESPACE = СредаИсполнения.ПолучитьПеременную("CI_PROJECT_NAMESPACE") знч CI_SERVER_HOST = СредаИсполнения.ПолучитьПеременную("CI_SERVER_HOST") знч RELEASES_TOKEN = СредаИсполнения.ПолучитьПеременную("RELEASES_TOKEN") @@ -947,9 +1204,11 @@ имяФайла = "%путьСборки/%{репозиторий.Проект}.cfe" ; + знч имяРепозиторияРелизов = "%CI_PROJECT_NAMESPACE\%2Freleases" + Консоль.Записать( - "JobArtifacts_DownloadFile: %имяФайла build %CI_COMMIT_REF_SLUG %CI_PROJECT_ID %CI_SERVER_HOST") - возврат JobArtifacts_DownloadFile(имяФайла, "build", CI_COMMIT_REF_SLUG, CI_PROJECT_ID, RELEASES_TOKEN, + "JobArtifacts_DownloadFile: %имяФайла build %CI_COMMIT_REF_SLUG %имяРепозиторияРелизов %CI_SERVER_HOST") + возврат JobArtifacts_DownloadFile(имяФайла, "build", CI_COMMIT_REF_SLUG, имяРепозиторияРелизов, RELEASES_TOKEN, CI_SERVER_HOST) ; @@ -970,7 +1229,7 @@ структура ОписаниеРепозитория знч Имя: Строка - знч Ветка: Строка + пер Ветка: Строка знч Проект: Строка знч ПеременнаяТокена: Строка @@ -979,7 +1238,32 @@ ; +структура ОписаниеЗапросаНаСлияние + знч имяПроекта: Строка + знч веткаПроекта: Строка +; + +метод ПараметрыЗапросаНаСлияние(): ОписаниеЗапросаНаСлияние|Неопределено + знч CI_MERGE_REQUEST_PROJECT_PATH = СредаИсполнения.ПолучитьПеременную("CI_MERGE_REQUEST_PROJECT_PATH") + знч CI_MERGE_REQUEST_SOURCE_BRANCH_NAME = СредаИсполнения.ПолучитьПеременную("CI_MERGE_REQUEST_SOURCE_BRANCH_NAME") + знч CI_PROJECT_NAMESPACE = СредаИсполнения.ПолучитьПеременную("CI_PROJECT_NAMESPACE") + + если CI_MERGE_REQUEST_PROJECT_PATH.Пусто() + возврат Неопределено + ; + + знч имяПроектаСлияния = CI_MERGE_REQUEST_PROJECT_PATH.Заменить("%CI_PROJECT_NAMESPACE/", "") + + возврат новый ОписаниеЗапросаНаСлияние(имяПроектаСлияния, CI_MERGE_REQUEST_SOURCE_BRANCH_NAME) +; + метод ПрочитатьНастройкиСборки(путьОписанияНастроек: Строка): ОписаниеНастроекСборки + знч запросНаСлияние = ПараметрыЗапросаНаСлияние() + + если запросНаСлияние != Неопределено + Консоль.Записать("ЗапросНаСлияние: %{запросНаСлияние.имяПроекта} %{запросНаСлияние.веткаПроекта}") + ; + пер файлОписанияНастроек = ".1cicd.json" если не путьОписанияНастроек.Пусто() файлОписанияНастроек = "%путьОписанияНастроек/.1cicd.json" @@ -993,9 +1277,21 @@ пер настройки = СериализацияJson.ПрочитатьОбъект(поток, Тип(ОписаниеНастроекСборки), настройкиJson) как ОписаниеНастроекСборки + если запросНаСлияние != Неопределено + если настройки.Конфигурация.Имя == запросНаСлияние.имяПроекта + настройки.Конфигурация.Ветка = запросНаСлияние.веткаПроекта + ; + ; + пер прикладныеРасширения = новый Массив() для репозиторийРасширения из настройки.ПрикладныеРасширения - знч описание = новый ОписаниеРепозитория(репозиторийРасширения["Имя"], репозиторийРасширения["Ветка"], репозиторийРасширения["Проект"], + пер веткаРасширения = репозиторийРасширения["Ветка"] + если запросНаСлияние != Неопределено + если репозиторийРасширения["Имя"] == запросНаСлияние.имяПроекта + веткаРасширения = запросНаСлияние.веткаПроекта + ; + ; + знч описание = новый ОписаниеРепозитория(репозиторийРасширения["Имя"], веткаРасширения, репозиторийРасширения["Проект"], репозиторийРасширения["ПеременнаяТокена"]) прикладныеРасширения.Добавить(описание) ; @@ -1003,7 +1299,13 @@ пер тестовыеРасширения = новый Массив() для репозиторийРасширения из настройки.ТестовыеРасширения - знч описание = новый ОписаниеРепозитория(репозиторийРасширения["Имя"], репозиторийРасширения["Ветка"], репозиторийРасширения["Проект"], + пер веткаРасширения = репозиторийРасширения["Ветка"] + если запросНаСлияние != Неопределено + если репозиторийРасширения["Имя"] == запросНаСлияние.имяПроекта + веткаРасширения = запросНаСлияние.веткаПроекта + ; + ; + знч описание = новый ОписаниеРепозитория(репозиторийРасширения["Имя"], веткаРасширения, репозиторийРасширения["Проект"], репозиторийРасширения["ПеременнаяТокена"]) тестовыеРасширения.Добавить(описание) ; @@ -1011,8 +1313,13 @@ пер сценарныеТесты = новый Массив() для репозиторийТестов из настройки.СценарныеТесты - знч описание = новый ОписаниеРепозитория(репозиторийТестов["Имя"], репозиторийТестов["Ветка"], - репозиторийТестов["ПеременнаяТокена"]) + пер веткаТестов = репозиторийТестов["Ветка"] + если запросНаСлияние != Неопределено + если репозиторийТестов["Имя"] == запросНаСлияние.имяПроекта + веткаТестов = запросНаСлияние.веткаПроекта + ; + ; + знч описание = новый ОписаниеРепозитория(репозиторийТестов["Имя"], веткаТестов, репозиторийТестов["ПеременнаяТокена"]) сценарныеТесты.Добавить(описание) ; настройки.СценарныеТесты = сценарныеТесты @@ -1629,13 +1936,61 @@ выбросить новый ИсключениеНедопустимоеСостояние(текстОшибки) ; -метод ПреобразоватьОшибкиВФорматSonarCube(файлSonarQube: Строка, файлРезультатовВалидации: Строка) +метод ЗаписатьОшибкиВФорматSonarCube(файлSonarQube: Строка, данныеОшибок: SonarqubeGenericFormat) знч файлПараметров = новый Файл(файлSonarQube) исп поток = файлПараметров.ОткрытьПотокЗаписи() - знч данные = ОшибкиВФорматеSonarCube(файлРезультатовВалидации) + СериализацияJson.ЗаписатьОбъект(поток, данныеОшибок) +; + +метод ЗаписатьОшибкиВФорматJUnit(файлJUnit: Строка, данныеОшибок: SonarqubeGenericFormat) + знч файлПараметров = новый Файл(файлJUnit) + исп поток = файлПараметров.ОткрытьПотокЗаписи() + + пер записьXML = новый ЗаписьXml(поток) + + пер количествоОшибок = 0 + для ошибка из данныеОшибок.issues + если ошибка.type == SonarqubeType.BUG + количествоОшибок += 1 + ; + ; + + записьXML.ЗаписатьНачалоДокумента() + + записьXML.ЗаписатьНачалоЭлемента("testsuites") + записьXML + .ЗаписатьНачалоЭлемента("testsuite") + .ЗаписатьАтрибут("name", "EDT Workspace Validate") + .ЗаписатьАтрибут("errors", Строка(количествоОшибок)) + .ЗаписатьАтрибут("skipped", "0") + .ЗаписатьАтрибут("tests", Строка(количествоОшибок)) + .ЗаписатьАтрибут("failures", "0") + .ЗаписатьАтрибут("time", "0") + + для ошибка из данныеОшибок.issues + если ошибка.type != SonarqubeType.BUG + продолжить + ; + записьXML + .ЗаписатьНачалоЭлемента("testcase") + .ЗаписатьАтрибут("name", ошибка.ruleId) + .ЗаписатьАтрибут("classname", ошибка.primaryLocation.filePath) + .ЗаписатьАтрибут("time", "0") + + записьXML + .ЗаписатьНачалоЭлемента("error") + .ЗаписатьТекст("%{ошибка.primaryLocation.message}\в\нСтрока: %{ошибка.primaryLocation.textRange.startLine}") + .ЗаписатьКонецЭлемента() + + записьXML.ЗаписатьКонецЭлемента() + ; + + записьXML.ЗаписатьКонецЭлемента() + записьXML.ЗаписатьКонецЭлемента() + + записьXML.ЗаписатьКонецДокумента() - СериализацияJson.ЗаписатьОбъект(поток, данные) ; метод ОшибкиВФорматеSonarCube(файлРезультатовВалидации: Строка): SonarqubeGenericFormat