From 3eff4782c79ab6e309459bd2de1d60f369865af0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=B0=D0=BF=D1=80=D0=B0=D0=BB=D0=BE=D0=B2=20=D0=90?= =?UTF-8?q?=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80?= Date: Thu, 2 Sep 2021 11:43:16 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=BD=D1=82=D0=B5=D0=B3=D1=80=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20/=20=D0=A0=D0=B0=D0=B7=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D1=82=D1=8B=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GitLab-CI/.gitlab-ci-mergeRequest.yml | 82 -- ...{.gitlab-ci-release.yml => .gitlab-ci.yml} | 67 +- Скрипты/1cicd.sbsl | 805 ++++++++++++++---- 3 files changed, 694 insertions(+), 260 deletions(-) delete mode 100644 GitLab-CI/.gitlab-ci-mergeRequest.yml rename GitLab-CI/{.gitlab-ci-release.yml => .gitlab-ci.yml} (54%) diff --git a/GitLab-CI/.gitlab-ci-mergeRequest.yml b/GitLab-CI/.gitlab-ci-mergeRequest.yml deleted file mode 100644 index 22cbf33..0000000 --- a/GitLab-CI/.gitlab-ci-mergeRequest.yml +++ /dev/null @@ -1,82 +0,0 @@ -before_script: - - CHCP 65001 - -stages: -- build -- test -- report - -variables: - WP: '${CI_PROJECT_DIR}/temp/wp' - -buildMR: - stage: build - tags: - - 1c-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: - - 1c-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: - - 1c-ui - 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/ - -pages: - stage: report - tags: - - 1c-edt - only: - - merge_requests - dependencies: - - testUI - script: - - executor_j11 -s $env:CI_SCRIPTS/1cicd.sbsl pages - artifacts: - paths: - - ci/ - - public/ - environment: - name: allure - url: https://${CI_SERVER_HOST}/${CI_PROJECT_PATH}/-/jobs/${CI_JOB_ID}/artifacts/file/public/index.html \ No newline at end of file diff --git a/GitLab-CI/.gitlab-ci-release.yml b/GitLab-CI/.gitlab-ci.yml similarity index 54% rename from GitLab-CI/.gitlab-ci-release.yml rename to GitLab-CI/.gitlab-ci.yml index 25cdf37..a61ae18 100644 --- a/GitLab-CI/.gitlab-ci-release.yml +++ b/GitLab-CI/.gitlab-ci.yml @@ -10,14 +10,46 @@ stages: variables: WP: '${CI_PROJECT_DIR}/temp/wp' -build: +buildMaster: + stage: build + tags: + - 1c-edt + only: + - master + script: + - executor_j11 -s $env:CI_SCRIPTS/1cicd.sbsl buildMaster + artifacts: + name: build + paths: + - build/ + - ci/ + cache: + key: ${CI_COMMIT_REF_SLUG} + paths: + - $env:WP + +buildMergeRequest: + stage: build + tags: + - 1c-edt + only: + - merge_requests + script: + - executor_j11 -s $env:CI_SCRIPTS/1cicd.sbsl buildMergeRequest + artifacts: + name: build + paths: + - build/ + - ci/ + +buildRelease: stage: build tags: - 1c-edt only: - schedules script: - - executor_j11 -s $env:CI_SCRIPTS/1cicd.sbsl build + - executor_j11 -s $env:CI_SCRIPTS/1cicd.sbsl buildRelease artifacts: name: build paths: @@ -33,9 +65,13 @@ testCore: tags: - 1c-edt only: + - master - schedules + - merge_requests dependencies: - - build + - buildMaster + - buildMergeRequest + - buildRelease script: - executor_j11 -s $env:CI_SCRIPTS/1cicd.sbsl testCore artifacts: @@ -52,8 +88,10 @@ testUI: - 1c-ui only: - schedules + - merge_requests dependencies: - - build + - buildRelease + - buildMergeRequest script: - executor_j11 -s $env:CI_SCRIPTS/1cicd.sbsl testUI artifacts: @@ -64,12 +102,31 @@ testUI: - test/ - ci/ +code_quality: + stage: report + tags: + - 1c-edt + only: + - master + - merge_requests + dependencies: + - testCore + script: + - executor_j11 -s $env:CI_SCRIPTS/1cicd.sbsl qualityCode + artifacts: + reports: + codequality: test/codequality/*.json + paths: + - test/ + - ci/ + pages: stage: report tags: - 1c-edt only: - schedules + - merge_requests dependencies: - testUI script: @@ -93,4 +150,4 @@ release: - testUI - pages script: - - executor_j11 -s $env:CI_SCRIPTS/1cicd.sbsl release \ No newline at end of file + - executor_j11 -s $env:CI_SCRIPTS/1cicd.sbsl release diff --git a/Скрипты/1cicd.sbsl b/Скрипты/1cicd.sbsl index 6515622..e8f0b6c 100644 --- a/Скрипты/1cicd.sbsl +++ b/Скрипты/1cicd.sbsl @@ -13,7 +13,7 @@ * ******************************************************************************/ -конст ВЕРСИЯ_EDT = "2021.2.3" +конст ВЕРСИЯ_EDT = "2021.2.4" конст ИМЯ_КАТАЛОГА_ПРИКЛАДНОЙ_СБОРКИ = "build/bin" конст ИМЯ_КАТАЛОГА_ТЕСТОВОЙ_СБОРКИ = "build/util" @@ -25,29 +25,42 @@ метод Скрипт(режим: Строка) выбор режим - когда "build" + когда "buildMaster" + СобратьРелизДляАнализа() + + когда "buildMergeRequest" + СобратьРелизДляСлияния() + + когда "buildRelease" знч CUSTOM_RELEASE_DATE = СредаИсполнения.ПолучитьПеременную("CUSTOM_RELEASE_DATE") если CUSTOM_RELEASE_DATE.Пусто() - СобратьПоследнийРелиз() + СобратьРелизДляВыпуска() иначе - СобратьПоследнийРелиз() // Доработать на СобратьРелизНаДату() - ; - когда "buildMR" - СобратьРелизДляСлияния() + СобратьРелизДляВыпуска() // Доработать на СобратьРелизНаДату() + ; + когда "testCore" ПротестироватьКод() + + когда "qualityCode" + ПровестиАнализКода() + когда "testUI" ПротестироватьИнтерфейс() + когда "pages" ОпубликоватьОтчет() + когда "release" ОпубликоватьРелиз() + иначе - Консоль.Записать("Неизвестный режим %режим") + выбросить новый ИсключениеНедопустимыйАргумент("Неизвестный режим %режим") + ; ; -метод СобратьПоследнийРелиз() +метод СобратьРелизДляВыпуска() знч WP = СредаИсполнения.ПолучитьПеременную("WP") знч CI_JOB_ID = СредаИсполнения.ПолучитьПеременную("CI_JOB_ID") @@ -278,38 +291,36 @@ ; ; -метод СобратьРелизДляСлияния() +метод СобратьРелизДляАнализа() знч WP = СредаИсполнения.ПолучитьПеременную("WP") + знч CI_COMMIT_BRANCH = СредаИсполнения.ПолучитьПеременную("CI_COMMIT_BRANCH") + знч CI_COMMIT_TIMESTAMP = СредаИсполнения.ПолучитьПеременную("CI_COMMIT_TIMESTAMP") знч 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_NAME = СредаИсполнения.ПолучитьПеременную("CI_PROJECT_NAME") знч 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") + знч настройкиСборки = ПрочитатьНастройкиСборки("%CI_PROJECT_DIR") - если СредаИсполнения.ПолучитьПеременную(настройки.Конфигурация.ПеременнаяТокена).Пусто() - ошибкиТокенов += "В переменную %{настройки.Конфигурация - .ПеременнаяТокена} необходимо поместить read api token репозитория %{настройки.Конфигурация.Имя}." + Символы.НоваяСтрока + если СредаИсполнения.ПолучитьПеременную(настройкиСборки.Конфигурация.ПеременнаяТокена).Пусто() + ошибкиТокенов += "В переменную %{настройкиСборки.Конфигурация + .ПеременнаяТокена} необходимо поместить read api token репозитория %{настройкиСборки.Конфигурация.Имя}." + Символы.НоваяСтрока ; - для репозиторийРасширения из настройки.ПрикладныеРасширения + для репозиторийРасширения из настройкиСборки.ПрикладныеРасширения если СредаИсполнения.ПолучитьПеременную(репозиторийРасширения.ПеременнаяТокена).Пусто() ошибкиТокенов += "В переменную %{репозиторийРасширения .ПеременнаяТокена} необходимо поместить read api token репозитория %{репозиторийРасширения.Имя}." + Символы.НоваяСтрока ; ; - для репозиторийРасширения из настройки.ТестовыеРасширения + для репозиторийРасширения из настройкиСборки.ТестовыеРасширения если СредаИсполнения.ПолучитьПеременную(репозиторийРасширения.ПеременнаяТокена).Пусто() ошибкиТокенов += "В переменную %{репозиторийРасширения .ПеременнаяТокена} необходимо поместить read api token репозитория %{репозиторийРасширения.Имя}." @@ -321,6 +332,26 @@ выбросить новый ИсключениеНедопустимоеСостояние(ошибкиТокенов) ; + знч имяТекущегоПроекта = CI_PROJECT_PATH.Заменить("%CI_PROJECT_NAMESPACE/", "") + пер токен = "" + если настройкиСборки.Конфигурация.Имя == имяТекущегоПроекта + токен = СредаИсполнения.ПолучитьПеременную(настройкиСборки.Конфигурация.ПеременнаяТокена) + + иначе + для репозиторийРасширения из настройкиСборки.ПрикладныеРасширения + если репозиторийРасширения.Имя == имяТекущегоПроекта + токен = СредаИсполнения.ПолучитьПеременную(репозиторийРасширения.ПеременнаяТокена) + ; + ; + + ; + + если токен.Пусто() + Консоль.Записать("Jobs_Cancel: %CI_JOB_ID %CI_PROJECT_ID %CI_SERVER_HOST") + Jobs_Cancel(CI_JOB_ID, CI_PROJECT_ID, CI_JOB_TOKEN, CI_SERVER_HOST) + возврат + ; + знч полныйПутьПрикладнойСборки = "%CI_PROJECT_DIR/%ИМЯ_КАТАЛОГА_ПРИКЛАДНОЙ_СБОРКИ" знч полныйПутьТестовойСборки = "%CI_PROJECT_DIR/%ИМЯ_КАТАЛОГА_ТЕСТОВОЙ_СБОРКИ" @@ -334,13 +365,19 @@ Консоль.Записать("Создать каталог: %полныйПутьСлужебнойСборки") Файлы.СоздатьКаталог(полныйПутьСлужебнойСборки) - знч адресРепозиторияКонфигурации = "https://gitlab-ci-token:%CI_JOB_TOKEN@%CI_SERVER_HOST/%CI_PROJECT_NAMESPACE/%{настройки - .Конфигурация - .Имя}.git" - Консоль.Записать("Git_Clone: %адресРепозиторияКонфигурации %{настройки.Конфигурация.Ветка}") - Git_Clone(адресРепозиторияКонфигурации, настройки.Конфигурация.Ветка) + знч путьКонфигурацииЕДТ = "%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/%{настройки.Конфигурация.Имя}/%{настройки.Конфигурация.Проект}" Консоль.Записать("ИсполняемыйФайлПлатформы: %путьКонфигурацииЕДТ") знч исполняемыйФайлПлатформы = ИсполняемыйФайлПлатформы(путьКонфигурацииЕДТ) @@ -348,38 +385,36 @@ Консоль.Записать("CreateInfobase: %строкаСоединения %исполняемыйФайлПлатформы") CreateInfobase(строкаСоединения, исполняемыйФайлПлатформы) - знч имяРепозиторияРелизов = "%CI_PROJECT_NAMESPACE\%2Freleases" - Консоль.Записать("Releases_LastDate: %имяРепозиторияРелизов %CI_SERVER_HOST") - знч датаПоследнегоРелиза = Releases_LastDate(имяРепозиторияРелизов, RELEASES_TOKEN, CI_SERVER_HOST) - Консоль.Записать("Дата последнего релиза = %датаПоследнегоРелиза") - - знч запросНаСлияние = ПараметрыЗапросаНаСлияние() + знч датаТекущегоКоммита = новый ДатаВремя(CI_COMMIT_TIMESTAMP.ПодстрокаСНачала(19)) + знч имяПроекта = "%CI_PROJECT_NAMESPACE/%CI_PROJECT_NAME".Заменить("/", "\%2F") + знч датаПредыдущегоКоммита = Commits_LastDate_Until(CI_COMMIT_BRANCH, имяПроекта, токен, CI_SERVER_HOST, датаТекущегоКоммита) + Консоль.Записать("Дата предыдущего коммита = %датаПредыдущегоКоммита") пер пересобиратьОсновнуюКонфигурацию = Ложь пер репозиторииДляПересборки = новый Массив() пер путиСборки = новый Соответствие() - если настройки.Конфигурация.Имя == запросНаСлияние.имяПроекта + если настройкиСборки.Конфигурация.Имя == имяТекущегоПроекта пересобиратьОсновнуюКонфигурацию = Истина иначе - знч результатПроверки = ПроверитьКоммитыРепозиторияДляПоследнегоРелиза(настройки.Конфигурация, датаПоследнегоРелиза) + знч результатПроверки = ПроверитьКоммитыРепозиторияДляПоследнегоРелиза(настройкиСборки.Конфигурация, датаПредыдущегоКоммита) если результатПроверки != Неопределено пересобиратьОсновнуюКонфигурацию = Истина иначе - если не СкачатьАртефактРепозитория(настройки.Конфигурация, ИМЯ_КАТАЛОГА_ПРИКЛАДНОЙ_СБОРКИ, Ложь) + если не СкачатьАртефактРепозитория(настройкиСборки.Конфигурация, ИМЯ_КАТАЛОГА_ПРИКЛАДНОЙ_СБОРКИ, Ложь) пересобиратьОсновнуюКонфигурацию = Истина ; ; ; - для репозиторийРасширения из настройки.ПрикладныеРасширения + для репозиторийРасширения из настройкиСборки.ПрикладныеРасширения путиСборки.Вставить(репозиторийРасширения.Имя, полныйПутьПрикладнойСборки) - если репозиторийРасширения.Имя == запросНаСлияние.имяПроекта + если репозиторийРасширения.Имя == имяТекущегоПроекта репозиторииДляПересборки.Добавить(репозиторийРасширения) иначе - знч результатПроверкиРасширения = ПроверитьКоммитыРепозиторияДляПоследнегоРелиза(репозиторийРасширения, датаПоследнегоРелиза) + знч результатПроверкиРасширения = ПроверитьКоммитыРепозиторияДляПоследнегоРелиза(репозиторийРасширения, датаПредыдущегоКоммита) если результатПроверкиРасширения != Неопределено репозиторииДляПересборки.Добавить(репозиторийРасширения) @@ -389,19 +424,19 @@ ; ; - если настройки.Конфигурация.Имя == запросНаСлияние.имяПроекта + если настройкиСборки.Конфигурация.Имя == имяТекущегоПроекта пересобиратьОсновнуюКонфигурацию = Истина ; ; ; - для репозиторийРасширения из настройки.ТестовыеРасширения + для репозиторийРасширения из настройкиСборки.ТестовыеРасширения путиСборки.Вставить(репозиторийРасширения.Имя, полныйПутьТестовойСборки) - если репозиторийРасширения.Имя == запросНаСлияние.имяПроекта + если репозиторийРасширения.Имя == имяТекущегоПроекта репозиторииДляПересборки.Добавить(репозиторийРасширения) иначе - знч результатПроверкиРасширения = ПроверитьКоммитыРепозиторияДляПоследнегоРелиза(репозиторийРасширения, датаПоследнегоРелиза) + знч результатПроверкиРасширения = ПроверитьКоммитыРепозиторияДляПоследнегоРелиза(репозиторийРасширения, датаПредыдущегоКоммита) если результатПроверкиРасширения != Неопределено репозиторииДляПересборки.Добавить(репозиторийРасширения) @@ -413,15 +448,9 @@ ; ; - если не пересобиратьОсновнуюКонфигурацию и репозиторииДляПересборки.Пусто() - Консоль.Записать("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_%{настройки.Конфигурация.Имя}" + знч путьКонфигурацииПлатформы = "%CI_PROJECT_DIR/temp/src_%{настройкиСборки.Конфигурация.Имя}" Консоль.Записать("WorkspaceExport: %путьКонфигурацииЕДТ %путьКонфигурацииПлатформы %WP") WorkspaceExport(путьКонфигурацииЕДТ, путьКонфигурацииПлатформы, WP, Истина, ВЕРСИЯ_EDT) @@ -464,7 +493,228 @@ пер путьРасширенияЕДТ = "%CI_PROJECT_DIR/%{репозиторий.Имя}/%{репозиторий.Проект}" если не (новый Файл(путьРасширенияЕДТ)).Существует() - путьРасширенияЕДТ = "%CI_PROJECT_DIR/%{репозиторий.Имя}/%{настройки.Конфигурация.Проект}.%{репозиторий + путьРасширенияЕДТ = "%CI_PROJECT_DIR/%{репозиторий.Имя}/%{настройкиСборки.Конфигурация.Проект}.%{репозиторий + .Проект}" + ; + знч путьРасширенияПлатформы = "%CI_PROJECT_DIR/temp/src_%{репозиторий.Имя}" + Консоль.Записать("WorkspaceExport: %путьРасширенияЕДТ %путьРасширенияПлатформы %WP") + WorkspaceExport(путьРасширенияЕДТ, путьРасширенияПлатформы, WP, Истина, ВЕРСИЯ_EDT) + + Консоль.Записать("LoadExtFromFiles: %путьРасширенияПлатформы %{репозиторий.Проект} %строкаСоединения %исполняемыйФайлПлатформы") + LoadExtFromFiles(путьРасширенияПлатформы, репозиторий.Проект, строкаСоединения, исполняемыйФайлПлатформы) + + Консоль.Записать("UpdateDBExt: %строкаСоединения %исполняемыйФайлПлатформы") + UpdateDBExt(репозиторий.Проект, строкаСоединения, исполняемыйФайлПлатформы) + + знч путьСборкиРасширения = путиСборки.Получить(репозиторий.Имя) + знч файлРасширения = "%путьСборкиРасширения/%{репозиторий.Проект}.cfe" + Консоль.Записать("DumpDBExt: %файлРасширения %{репозиторий.Проект} %строкаСоединения %исполняемыйФайлПлатформы") + DumpExt(файлРасширения, репозиторий.Проект, строкаСоединения, исполняемыйФайлПлатформы) + ; + + знч логФайлыРабочейОбласти = "%WP/.metadata/" + пер настройкиПоиска = новый НастройкиПоискаФайлов() + настройкиПоиска.ИмяСодержит(".log") + для файл из Файлы.Найти(логФайлыРабочейОбласти, настройкиПоиска) + Консоль.Записать("Удалить файл: %{файл.Путь}") + Файлы.Удалить(файл) + ; +; + +метод СобратьРелизДляСлияния() + знч 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/%ИМЯ_КАТАЛОГА_СЛУЖЕБНОЙ_СБОРКИ" + Консоль.Записать("Создать каталог: %полныйПутьСлужебнойСборки") + Файлы.СоздатьКаталог(полныйПутьСлужебнойСборки) + + знч путьКонфигурацииЕДТ = "%CI_PROJECT_DIR/%{настройкиСборки.Конфигурация.Имя}/%{настройкиСборки.Конфигурация.Проект}" + + знч имяТекущегоПроекта = CI_PROJECT_PATH.Заменить("%CI_PROJECT_NAMESPACE/", "") + если настройкиСборки.Конфигурация.Имя == имяТекущегоПроекта + Файлы.СоздатьКаталог(путьКонфигурацииЕДТ) + Файлы.Переместить("%CI_PROJECT_DIR/%{настройкиСборки.Конфигурация.Проект}", путьКонфигурацииЕДТ) + иначе + знч адресРепозиторияКонфигурации = "https://gitlab-ci-token:%CI_JOB_TOKEN@%CI_SERVER_HOST/%CI_PROJECT_NAMESPACE/%{настройкиСборки + .Конфигурация + .Имя}.git" + Консоль.Записать("Git_Clone: %адресРепозиторияКонфигурации %{настройкиСборки.Конфигурация.Ветка}") + Git_Clone(адресРепозиторияКонфигурации, настройкиСборки.Конфигурация.Ветка) + ; + + Консоль.Записать("ИсполняемыйФайлПлатформы: %путьКонфигурацииЕДТ") + знч исполняемыйФайлПлатформы = ИсполняемыйФайлПлатформы(путьКонфигурацииЕДТ) + + знч строкаСоединения = СтрокаСоединенияДляФайловойИБ("%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_%{репозиторий.Имя}" @@ -502,6 +752,34 @@ ; ; +метод ПровестиАнализКода() + знч WP = СредаИсполнения.ПолучитьПеременную("WP") + + знч CI_COMMIT_SHORT_SHA = СредаИсполнения.ПолучитьПеременную("CI_COMMIT_SHORT_SHA") + знч CI_JOB_ID = СредаИсполнения.ПолучитьПеременную("CI_JOB_ID") + знч CI_JOB_TOKEN = СредаИсполнения.ПолучитьПеременную("CI_JOB_TOKEN") + знч CI_PROJECT_DIR = СредаИсполнения.ПолучитьПеременную("CI_PROJECT_DIR") + знч CI_PROJECT_NAMESPACE = СредаИсполнения.ПолучитьПеременную("CI_PROJECT_NAMESPACE") + знч CI_PROJECT_PATH = СредаИсполнения.ПолучитьПеременную("CI_PROJECT_PATH") + знч CI_SERVER_HOST = СредаИсполнения.ПолучитьПеременную("CI_SERVER_HOST") + + знч настройкиСкрипта = ПрочитатьНастройкиСкрипта() + знч настройкиСборки = ПрочитатьНастройкиСборки("%CI_PROJECT_DIR") + + знч полныйПутьРезультатовТестов = "%CI_PROJECT_DIR/%ИМЯ_КАТАЛОГА_РЕЗУЛЬТАТОВ_ТЕСТОВ" + + Консоль.Записать("Создать каталог: %полныйПутьРезультатовТестов/codequality") + Файлы.СоздатьКаталог("%полныйПутьРезультатовТестов/codequality") + + знч файлРезультатовВалидации = "%полныйПутьРезультатовТестов/%{настройкиСборки.Конфигурация.Имя}.tsv" + + знч ошибкиEDT = ОшибкиEDT(файлРезультатовВалидации) + + знч файлCodeQuality = "%полныйПутьРезультатовТестов/codequality/%{настройкиСборки.Конфигурация.Имя}.json" + Консоль.Записать("ЗаписатьОшибкиВФорматCodeQuality: %файлCodeQuality %файлРезультатовВалидации") + ЗаписатьОшибкиВФорматCodeQuality(файлCodeQuality, ошибкиEDT) +; + метод ПротестироватьКод() знч WP = СредаИсполнения.ПолучитьПеременную("WP") @@ -538,30 +816,35 @@ Консоль.Записать("Создать каталог: %полныйПутьРезультатовТестов/junit") Файлы.СоздатьКаталог("%полныйПутьРезультатовТестов/junit") - знч адресРепозиторияКонфигурации = "https://gitlab-ci-token:%CI_JOB_TOKEN@%CI_SERVER_HOST/%CI_PROJECT_NAMESPACE/%{настройкиСборки - .Конфигурация - .Имя}.git" - Консоль.Записать("Git_Clone: %адресРепозиторияКонфигурации %{настройкиСборки.Конфигурация.Ветка}") - Git_Clone(адресРепозиторияКонфигурации, настройкиСборки.Конфигурация.Ветка) + знч путьКонфигурацииЕДТ = "%CI_PROJECT_DIR/%{настройкиСборки.Конфигурация.Имя}/%{настройкиСборки.Конфигурация.Проект}" + + знч имяТекущегоПроекта = CI_PROJECT_PATH.Заменить("%CI_PROJECT_NAMESPACE/", "") + если настройкиСборки.Конфигурация.Имя == имяТекущегоПроекта + Файлы.СоздатьКаталог(путьКонфигурацииЕДТ) + Файлы.Переместить("%CI_PROJECT_DIR/%{настройкиСборки.Конфигурация.Проект}", путьКонфигурацииЕДТ) + иначе + знч адресРепозиторияКонфигурации = "https://gitlab-ci-token:%CI_JOB_TOKEN@%CI_SERVER_HOST/%CI_PROJECT_NAMESPACE/%{настройкиСборки + .Конфигурация + .Имя}.git" + Консоль.Записать("Git_Clone: %адресРепозиторияКонфигурации %{настройкиСборки.Конфигурация.Ветка}") + Git_Clone(адресРепозиторияКонфигурации, настройкиСборки.Конфигурация.Ветка) + ; знч файлРезультатовВалидации = "%полныйПутьРезультатовТестов/%{настройкиСборки.Конфигурация.Имя}.tsv" - знч путьКонфигурацииЕДТ = "%CI_PROJECT_DIR/%{настройкиСборки.Конфигурация.Имя}/%{настройкиСборки.Конфигурация.Проект}" Консоль.Записать("WorkspaceValidate: %файлРезультатовВалидации %путьКонфигурацииЕДТ %WP") WorkspaceValidate(файлРезультатовВалидации, путьКонфигурацииЕДТ, WP, Истина, ВЕРСИЯ_EDT) - знч данныеОшибок = ОшибкиВФорматеSonarCube(файлРезультатовВалидации) - - знч файлSonarQube = "%полныйПутьРезультатовТестов/%{настройкиСборки.Конфигурация.Имя}.json" - Консоль.Записать("ЗаписатьОшибкиВФорматSonarCube: %файлSonarQube %файлРезультатовВалидации") - ЗаписатьОшибкиВФорматSonarCube(файлSonarQube, данныеОшибок) - - знч файлJunit = "%полныйПутьРезультатовТестов/junit/%{настройкиСборки.Конфигурация.Имя}.xml" - Консоль.Записать("ЗаписатьОшибкиВФорматJUnit: %файлJunit %файлРезультатовВалидации") - ЗаписатьОшибкиВФорматJUnit(файлJunit, данныеОшибок) + знч ошибкиEDT = ОшибкиEDT(файлРезультатовВалидации) пер списокФайловСсылок = новый Массив() - если не настройкиСборки.СерверSonarQube.Пусто() + знч запросНаСлияние = ПараметрыЗапросаНаСлияние() + если запросНаСлияние == Неопределено и не настройкиСборки.СерверSonarQube.Пусто() + знч ошибкиSonarQube = ОшибкиВФорматеSonarQube(ошибкиEDT) + знч файлSonarQube = "%полныйПутьРезультатовТестов/%{настройкиСборки.Конфигурация.Имя}.json" + Консоль.Записать("ЗаписатьОшибкиВФорматSonarQube: %файлSonarQube %файлРезультатовВалидации") + ЗаписатьОшибкиВФорматSonarQube(файлSonarQube, ошибкиSonarQube) + знч файлПараметровСканера = "%CI_PROJECT_DIR/sonar-project-%{настройкиСборки.Конфигурация.Имя}.properties" знч ключПроекта = "%CI_PROJECT_NAMESPACE-%{настройкиСборки.Конфигурация.Имя}" @@ -594,6 +877,7 @@ знч CI_JOB_TOKEN = СредаИсполнения.ПолучитьПеременную("CI_JOB_TOKEN") знч CI_PROJECT_DIR = СредаИсполнения.ПолучитьПеременную("CI_PROJECT_DIR") знч CI_PROJECT_NAMESPACE = СредаИсполнения.ПолучитьПеременную("CI_PROJECT_NAMESPACE") + знч CI_PROJECT_PATH = СредаИсполнения.ПолучитьПеременную("CI_PROJECT_PATH") знч CI_SERVER_HOST = СредаИсполнения.ПолучитьПеременную("CI_SERVER_HOST") знч настройкиСкрипта = ПрочитатьНастройкиСкрипта() @@ -621,13 +905,20 @@ знч настройкиСборки = ПрочитатьНастройкиСборки("%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_PATH.Заменить("%CI_PROJECT_NAMESPACE/", "") + если настройкиСборки.Конфигурация.Имя == имяТекущегоПроекта + Файлы.СоздатьКаталог(путьКонфигурацииЕДТ) + Файлы.Переместить("%CI_PROJECT_DIR/%{настройкиСборки.Конфигурация.Проект}", путьКонфигурацииЕДТ) + иначе + знч адресРепозиторияКонфигурации = "https://gitlab-ci-token:%CI_JOB_TOKEN@%CI_SERVER_HOST/%CI_PROJECT_NAMESPACE/%{настройкиСборки + .Конфигурация + .Имя}.git" + Консоль.Записать("Git_Clone: %адресРепозиторияКонфигурации %{настройкиСборки.Конфигурация.Ветка}") + Git_Clone(адресРепозиторияКонфигурации, настройкиСборки.Конфигурация.Ветка) + ; + Консоль.Записать("ИсполняемыйФайлПлатформы: %путьКонфигурацииЕДТ") знч исполняемыйФайлПлатформы = ИсполняемыйФайлПлатформы(путьКонфигурацииЕДТ) @@ -835,10 +1126,10 @@ CreateInfobaseFromTemplate(файлDT, строкаСоединения, исполняемыйФайлПлатформы) ; - Консоль.Записать("DeleteCfgAllExtensions: %строкаСоединения %исполняемыйФайлПлатформы %{настройкиАвтофич.ТестоваяБаза - .ИмяПользователя}") - DeleteCfgAllExtensions(строкаСоединения, исполняемыйФайлПлатформы, настройкиАвтофич.ТестоваяБаза - .ИмяПользователя) +// Консоль.Записать("DeleteCfgAllExtensions: %строкаСоединения %исполняемыйФайлПлатформы %{настройкиАвтофич.ТестоваяБаза +// .ИмяПользователя}") +// DeleteCfgAllExtensions(строкаСоединения, исполняемыйФайлПлатформы, настройкиАвтофич.ТестоваяБаза +// .ИмяПользователя) знч файлКонфигурации = "%полныйПутьПрикладнойСборки/1cv8.cf" Консоль.Записать("LoadCfg: %файлКонфигурации %строкаСоединения %исполняемыйФайлПлатформы %{настройкиАвтофич.ТестоваяБаза @@ -883,13 +1174,13 @@ Консоль.Записать("ExecuteDataProcessor: %имяОбработкиЗапретитьРаботуСВнешнимиРесурсами %строкаСоединения %исполняемыйФайлПлатформы %{настройкиАвтофич.ТестоваяБаза .ИмяПользователя}") ExecuteDataProcessor(имяОбработкиЗапретитьРаботуСВнешнимиРесурсами, "", строкаСоединения, исполняемыйФайлПлатформы, настройкиАвтофич.ТестоваяБаза - .ИмяПользователя, "", 120с) + .ИмяПользователя, "", 300с) знч имяОбработкиОтключитьБезопасныйРежимРасширений = "%{настройкиСкрипта.CI_EPFS}/ОтключитьБезопасныйРежимРасширений.epf" Консоль.Записать("ExecuteDataProcessor: %имяОбработкиОтключитьБезопасныйРежимРасширений %строкаСоединения %исполняемыйФайлПлатформы %{настройкиАвтофич.ТестоваяБаза .ИмяПользователя}") ExecuteDataProcessor(имяОбработкиОтключитьБезопасныйРежимРасширений, "", строкаСоединения, исполняемыйФайлПлатформы, настройкиАвтофич.ТестоваяБаза - .ИмяПользователя, "", 120с) + .ИмяПользователя, "", 300с) Консоль.Записать("ExecuteCommand: %КОМАНДЫ_ОБНОВЛЕНИЯ_БД %строкаСоединения %исполняемыйФайлПлатформы %{настройкиАвтофич.ТестоваяБаза .ИмяПользователя}") @@ -901,7 +1192,7 @@ Консоль.Записать("ExecuteDataProcessor: %имяФайлаVA %параметрыVA %строкаСоединения %исполняемыйФайлПлатформы %{настройкиАвтофич.ТестоваяБаза .ИмяПользователя}") ExecuteDataProcessor(имяФайлаVA, параметрыVA, строкаСоединения, исполняемыйФайлПлатформы, настройкиАвтофич.ТестоваяБаза - .ИмяПользователя, "", 120с) + .ИмяПользователя, "", 300с) Консоль.Записать("СоздатьФичи: %{репозиторийСценарныхТестов.Имя}") СоздатьФичи(настройкиСкрипта, настройкиАвтофич, репозиторийСценарныхТестов.Имя) @@ -952,7 +1243,7 @@ пер чтениеФайлаАвтофичи = новый ЧтениеДанных(потокФайлаАвтофичи) // TODO: Отладка пока не чтениеФайлаАвтофичи.ЧтениеЗавершено() - знч строкаФайла = чтениеФайлаАвтофичи.ПрочитатьСтроку("cp1251") + знч строкаФайла = чтениеФайлаАвтофичи.ПрочитатьСтроку("utf-8") если строкаФайла.Пусто() продолжить ; @@ -1032,7 +1323,7 @@ знч имяОбработкиЗапретитьРаботуСВнешнимиРесурсами = "%{настройкиСкрипта.CI_EPFS}/ЗапретитьРаботуСВнешнимиРесурсами.epf" Консоль.Записать("ExecuteDataProcessor: %имяОбработкиЗапретитьРаботуСВнешнимиРесурсами %{временнаяИБ.строкаСоединения} %исполняемыйФайлПлатформы %{настройкиАвтофич.ТестоваяБаза.ИмяПользователя}") ExecuteDataProcessor(имяОбработкиЗапретитьРаботуСВнешнимиРесурсами, "", временнаяИБ.строкаСоединения, исполняемыйФайлПлатформы, настройкиАвтофич.ТестоваяБаза.ИмяПользователя, настройкиАвтофич.ТестоваяБаза - .ПарольПользователя, 120с) + .ПарольПользователя, 300с) знч каталогФич = "%каталогПроекта/features/%{пользователь.Представление}" @@ -1108,12 +1399,8 @@ пер временнаяИБ = временныеИБПользователей.Получить(пользователь.Представление) пер файлКодВозвратаVA = новый Файл("%{временнаяИБ.путьСлужебныхФайлов}/КодВозвратаVA.txt") - исп потокКодВозвратаVA = файлКодВозвратаVA.ОткрытьПотокЧтения() - пер кодВозвратаVA = потокКодВозвратаVA.ПрочитатьКакСтроку() - если не кодВозвратаVA.ТолькоЦифры() - кодВозвратаVA = кодВозвратаVA.Подстрока(1) - ; - если кодВозвратаVA != "0" и кодВозвратаVA != "1" + знч кодВозвратаVA = ПолучитьКодВозвратаИзФайла(файлКодВозвратаVA) + если кодВозвратаVA != 0 и кодВозвратаVA != 1 выбросить новый ИсключениеНедопустимоеСостояние( "Для тест-клиента пользователя %{пользователь.Представление} получен код возврата Vanessa Automation %кодВозвратаVA") ; @@ -1223,6 +1510,7 @@ метод ВыполнитьКомандуПлатформыВФоне(имяКоманды: Строка, параметры: Массив, выводитьОшибки: Булево = Истина): ОписаниеКомандыПлатформы знч временныйФайлЛогов = Файлы.СоздатьВременныйФайл() + знч временныйФайлКодВозврата = Файлы.СоздатьВременныйФайл() параметры.Добавить("/Out") параметры.Добавить(временныйФайлЛогов.Путь) @@ -1236,16 +1524,22 @@ ; метод ОбработатьЗавершениеКомандыПлатформы(командаПлатформы: ОписаниеКомандыПлатформы): Булево - если не командаПлатформы.процесс.ОжидатьЗавершения(60с) + пер кодВозврата = командаПлатформы.процесс.ПолучитьКодВозврата() + + если кодВозврата == Неопределено и (не командаПлатформы.процесс.ОжидатьЗавершения(60с) или командаПлатформы.процесс.Живой()) возврат Ложь ; + если командаПлатформы.процесс.Живой() + командаПлатформы.процесс.Остановить() + ; + Консоль.Записать("Команда платформы выполнена.") - знч кодВозврата = командаПлатформы.процесс.ПолучитьКодВозврата() + кодВозврата = командаПлатформы.процесс.ПолучитьКодВозврата() если кодВозврата == 0 - возврат Истина + возврат Истина ; пер текстОшибки = "Код возврата: %кодВозврата" @@ -1257,7 +1551,7 @@ .параметры, " ")]) исп ошибкиВыполненияСкрипта = командаПлатформы.временныйФайлЛогов.ОткрытьПотокЧтения() - текстОшибки += "\в\нСодержимое лога:\в\н" + ошибкиВыполненияСкрипта.ПрочитатьКакСтроку(КодировкаПотокаВыводаПлатформы()) + текстОшибки += "\в\нСодержимое лога:\в\н" + ошибкиВыполненияСкрипта.ПрочитатьКакСтроку() выбросить новый ИсключениеНедопустимоеСостояние(текстОшибки) ; @@ -1424,6 +1718,10 @@ метод ДатаНовогоРелиза(): ДатаВремя пер файлДатаНовогоРелиза = новый Файл("%ИМЯ_КАТАЛОГА_СЛУЖЕБНОЙ_СБОРКИ/new_release_date.txt") + если не файлДатаНовогоРелиза.Существует() + возврат ДатаВремя.Сейчас() + ; + исп потокЧтенияДатаНовогоРелиза = файлДатаНовогоРелиза.ОткрытьПотокЧтения() возврат новый ДатаВремя(потокЧтенияДатаНовогоРелиза.ПрочитатьКакСтроку()) ; @@ -1776,7 +2074,7 @@ параметрыПроцесса.Добавить("CREATEINFOBASE") параметрыПроцесса.Добавить(строкаСоединения) - ВыполнитьКомандуПлатформыСОжиданием(имяФайлаПлатформы, параметрыПроцесса) + ВыполнитьКомандуПлатформыСОжиданием(имяФайлаПлатформы, параметрыПроцесса, Истина) Консоль.Записать("ИБ успешно создана.") ; @@ -1792,7 +2090,7 @@ параметрыПроцесса.Добавить("/UseTemplate") параметрыПроцесса.Добавить(путьКДТ) - ВыполнитьКомандуПлатформыСОжиданием(имяФайлаПлатформы, параметрыПроцесса) + ВыполнитьКомандуПлатформыСОжиданием(имяФайлаПлатформы, параметрыПроцесса, Истина) Консоль.Записать("ИБ успешно создана.") ; @@ -1805,6 +2103,8 @@ параметрыПроцесса.Добавить("/IBConnectionString") параметрыПроцесса.Добавить(строкаСоединения) параметрыПроцесса.Добавить("/DisableStartupDialogs") + параметрыПроцесса.Добавить("/DisableStartupMessages") + параметрыПроцесса.Добавить("/DisableUnrecoverableErrorMessage") параметрыПроцесса.Добавить("/WA-") если не имяПользователя.Пусто() параметрыПроцесса.Добавить("/N") @@ -1815,7 +2115,7 @@ параметрыПроцесса.Добавить(пароль) ; - ВыполнитьКомандуПлатформыСОжиданием(имяФайлаПлатформы, параметрыПроцесса) + ВыполнитьКомандуПлатформыСОжиданием(имяФайлаПлатформы, параметрыПроцесса, Истина) Консоль.Записать("XML файлы конфигурации успешно загружены в ИБ.") ; @@ -1834,6 +2134,8 @@ параметрыПроцесса.Добавить("/IBConnectionString") параметрыПроцесса.Добавить(строкаСоединения) параметрыПроцесса.Добавить("/DisableStartupDialogs") + параметрыПроцесса.Добавить("/DisableStartupMessages") + параметрыПроцесса.Добавить("/DisableUnrecoverableErrorMessage") параметрыПроцесса.Добавить("/WA-") если не имяПользователя.Пусто() параметрыПроцесса.Добавить("/N") @@ -1844,7 +2146,7 @@ параметрыПроцесса.Добавить(пароль) ; - ВыполнитьКомандуПлатформыСОжиданием(имяФайлаПлатформы, параметрыПроцесса) + ВыполнитьКомандуПлатформыСОжиданием(имяФайлаПлатформы, параметрыПроцесса, Истина) Консоль.Записать("CF файл конфигурации успешно загружен в ИБ.") ; @@ -1865,7 +2167,7 @@ параметрыПроцесса.Добавить(пароль) ; - ВыполнитьКомандуПлатформыСОжиданием(имяФайлаПлатформы, параметрыПроцесса) + ВыполнитьКомандуПлатформыСОжиданием(имяФайлаПлатформы, параметрыПроцесса, Истина) Консоль.Записать("Конфигурация БД успешно обновлена для конфигурации в ИБ.") ; @@ -1889,7 +2191,7 @@ параметрыПроцесса.Добавить(пароль) ; - ВыполнитьКомандуПлатформыСОжиданием(имяФайлаПлатформы, параметрыПроцесса) + ВыполнитьКомандуПлатформыСОжиданием(имяФайлаПлатформы, параметрыПроцесса, Истина) Консоль.Записать("CF Файл поставки успешно создан.") ; @@ -1914,7 +2216,7 @@ параметрыПроцесса.Добавить(пароль) ; - ВыполнитьКомандуПлатформыСОжиданием(имяФайлаПлатформы, параметрыПроцесса) + ВыполнитьКомандуПлатформыСОжиданием(имяФайлаПлатформы, параметрыПроцесса, Истина) Консоль.Записать("XML файлы расширения успешно загружены в ИБ.") ; @@ -1946,7 +2248,7 @@ параметрыПроцесса.Добавить(пароль) ; - ВыполнитьКомандуПлатформыСОжиданием(имяФайлаПлатформы, параметрыПроцесса) + ВыполнитьКомандуПлатформыСОжиданием(имяФайлаПлатформы, параметрыПроцесса, Истина) Консоль.Записать("CFE файл расширения успешно загружен в ИБ.") ; @@ -1970,7 +2272,7 @@ параметрыПроцесса.Добавить(пароль) ; - ВыполнитьКомандуПлатформыСОжиданием(имяФайлаПлатформы, параметрыПроцесса) + ВыполнитьКомандуПлатформыСОжиданием(имяФайлаПлатформы, параметрыПроцесса, Истина) Консоль.Записать("Конфигурация БД успешно обновлена для расширения в ИБ.") ; @@ -1995,7 +2297,7 @@ параметрыПроцесса.Добавить(пароль) ; - ВыполнитьКомандуПлатформыСОжиданием(имяФайлаПлатформы, параметрыПроцесса) + ВыполнитьКомандуПлатформыСОжиданием(имяФайлаПлатформы, параметрыПроцесса, Истина) Консоль.Записать("CFE Файл расширения успешно создан.") ; @@ -2018,7 +2320,7 @@ параметрыПроцесса.Добавить(пароль) ; - ВыполнитьКомандуПлатформыСОжиданием(имяФайлаПлатформы, параметрыПроцесса) + ВыполнитьКомандуПлатформыСОжиданием(имяФайлаПлатформы, параметрыПроцесса, Истина) Консоль.Записать("Конфигурация и все расширения удалены из ИБ.") ; @@ -2042,7 +2344,7 @@ параметрыПроцесса.Добавить(пароль) ; - ВыполнитьКомандуПлатформыСОжиданием(имяФайлаПлатформы + "c", параметрыПроцесса) + ВыполнитьКомандуПлатформыСОжиданием(имяФайлаПлатформы + "c", параметрыПроцесса, Ложь) Консоль.Записать("Команда выполнена.") ; @@ -2068,7 +2370,7 @@ параметрыПроцесса.Добавить(пароль) ; - ВыполнитьКомандуПлатформыСОжиданием(имяФайлаПлатформы + "c", параметрыПроцесса, таймаут) + ВыполнитьКомандуПлатформыСОжиданием(имяФайлаПлатформы + "c", параметрыПроцесса, Ложь, таймаут) Консоль.Записать("Обработка выполнена.") ; @@ -2080,41 +2382,109 @@ возврат "UTF-8" ; -метод ВыполнитьКомандуПлатформыСОжиданием(имяКоманды: Строка, параметры: Массив, таймаут: Длительность = 0с) +метод вывестиФайлЛога(файлЛога: Файл, кодировкаЛога: Строка, количествоВыведенныхСтрок: Число, удалитьЛог: Булево = Ложь): Число + если не файлЛога.Существует() + возврат 0 + ; + + исп потокЛога = файлЛога.ОткрытьПотокЧтения() + знч текстЛога = потокЛога.ПрочитатьКакСтроку(кодировкаЛога) + пер строкиЛога = текстЛога.Разделить(Символы.НоваяСтрока) + если строкиЛога.Размер() > количествоВыведенныхСтрок + если количествоВыведенныхСтрок == 0 + Консоль.Записать(текстЛога) + иначе + строкиЛога.УдалитьДиапазон(0, количествоВыведенныхСтрок - 1) + пер текстСообщения = Строки.Соединить(строкиЛога, Символы.НоваяСтрока) + Консоль.Записать(текстСообщения) + ; + количествоВыведенныхСтрок = строкиЛога.Размер() + ; + потокЛога.Закрыть() + + если удалитьЛог + Файлы.Удалить(файлЛога) + ; + + возврат количествоВыведенныхСтрок +; + +метод ПолучитьКодВозвратаИзФайла(файлКодаВозврата: Файл): Число|Строка? + если не файлКодаВозврата.Существует() + возврат Неопределено + ; + + исп потокКодаВозврата = файлКодаВозврата.ОткрытьПотокЧтения() + пер кодВозврата = потокКодаВозврата.ПрочитатьКакСтроку() + если кодВозврата.Пусто() + возврат Неопределено + ; + + если кодВозврата.ТолькоЦифры() + возврат Число(кодВозврата) + ; + + возврат кодВозврата.Подстрока(1) +; + +метод ВыполнитьКомандуПлатформыСОжиданием(имяКоманды: Строка, параметры: Массив, записыватьКодВозвратаВФайл: Булево, таймаут: Длительность = 0с) знч временныйФайлЛогов = Файлы.СоздатьВременныйФайл() + знч временныйФайлКодВозврата = Файлы.СоздатьВременныйФайл() параметры.Добавить("/Out") параметры.Добавить(временныйФайлЛогов.Путь) - + если записыватьКодВозвратаВФайл + параметры.Добавить("/DumpResult") + параметры.Добавить(временныйФайлКодВозврата.Путь) + ; + знч параметрыСтрокой = Строки.Соединить(параметры, " ") Консоль.Записать("\"%имяКоманды\" %параметрыСтрокой") пер процесс = новый ПроцессОс(имяКоманды, параметры) процесс.Запустить() пер времяОжидания = 0с - пока не процесс.ОжидатьЗавершения(60с) + пер количествоВыведенныхСтрок = 0 + пер кодВозврата = Неопределено + пока не процесс.ОжидатьЗавершения(60с) и процесс.Живой() + количествоВыведенныхСтрок = вывестиФайлЛога(временныйФайлЛогов, "utf-8", количествоВыведенныхСтрок) + + если записыватьКодВозвратаВФайл + кодВозврата = ПолучитьКодВозвратаИзФайла(временныйФайлКодВозврата) + иначе + кодВозврата = процесс.ПолучитьКодВозврата() + ; + если кодВозврата != Неопределено + процесс.ОжидатьЗавершения(10с) + прервать + ; + если таймаут != 0с и таймаут <= времяОжидания - исп ошибкиВыполненияСкрипта = временныйФайлЛогов.ОткрытьПотокЧтения() пер текстОшибки = "При выполнении команды платформы превышено время ожидания выполнения %таймаут" - текстОшибки += "\в\нСодержимое лога:\в\н" + ошибкиВыполненияСкрипта.ПрочитатьКакСтроку(КодировкаПотокаВыводаПлатформы()) + процесс.Остановить() выбросить новый ИсключениеНедопустимоеСостояние(текстОшибки) ; - времяОжидания += 60с ; + вывестиФайлЛога(временныйФайлЛогов, "utf-8", количествоВыведенныхСтрок, Истина) - знч кодВозврата = процесс.ПолучитьКодВозврата() + если процесс.Живой() + процесс.Остановить() + ; + + если записыватьКодВозвратаВФайл + кодВозврата = ПолучитьКодВозвратаИзФайла(временныйФайлКодВозврата) + иначе + кодВозврата = процесс.ПолучитьКодВозврата() + ; если кодВозврата == 0 - возврат + возврат ; пер текстОшибки = "Код возврата: %кодВозврата" текстОшибки += Строки.Шаблон("\в\нКоманда: $0\в\нПараметры: $1", [имяКоманды, Строки.Соединить(параметры, " ")]) - - исп ошибкиВыполненияСкрипта = временныйФайлЛогов.ОткрытьПотокЧтения() - текстОшибки += "\в\нСодержимое лога:\в\н" + ошибкиВыполненияСкрипта.ПрочитатьКакСтроку(КодировкаПотокаВыводаПлатформы()) выбросить новый ИсключениеНедопустимоеСостояние(текстОшибки) ; @@ -2212,22 +2582,82 @@ возврат Ложь ; -метод ЗаписатьОшибкиВФорматSonarCube(файлSonarQube: Строка, данныеОшибок: SonarqubeGenericFormat) +метод ЗаписатьОшибкиВФорматSonarQube(файлSonarQube: Строка, данныеОшибок: SonarqubeGenericFormat) знч файлПараметров = новый Файл(файлSonarQube) исп поток = файлПараметров.ОткрытьПотокЗаписи() СериализацияJson.ЗаписатьОбъект(поток, данныеОшибок) ; -метод ЗаписатьОшибкиВФорматJUnit(файлJUnit: Строка, данныеОшибок: SonarqubeGenericFormat) +структура ОписаниеСтрокиCodeQuality + знч begin: Число +; + +структура ОписаниеРасположенияCodeQuality + знч path: Строка + знч lines: ОписаниеСтрокиCodeQuality +; + +перечисление ОшибкаCodeQualityКритичность + blocker, + critical, + major, + minor, + info +; + +структура ОписаниеОшибкиCodeQuality + знч description: Строка + знч fingerprint: Строка + знч severity: ОшибкаCodeQualityКритичность + знч location: ОписаниеРасположенияCodeQuality +; + +метод ЗаписатьОшибкиВФорматCodeQuality(файлCodeQuality: Строка, ошибкиEDT: Массив) + пер ошибкиCodeQuality = новый Массив() + + для ошибка из ошибкиEDT + знч отпечатокОшибки = "%{ошибка.объект}#L%{ошибка.положение}" + + пер критичность = ОшибкаCodeQualityКритичность.info + выбор ошибка.критичность + когда ОшибкаEDTКритичность.Блокирующая + критичность = ОшибкаCodeQualityКритичность.blocker + + когда ОшибкаEDTКритичность.Критическая + критичность = ОшибкаCodeQualityКритичность.critical + + когда ОшибкаEDTКритичность.Значительная + критичность = ОшибкаCodeQualityКритичность.major + + когда ОшибкаEDTКритичность.Незначительная + критичность = ОшибкаCodeQualityКритичность.minor + + ; + + знч номерСтроки = новый ОписаниеСтрокиCodeQuality(ошибка.положение) + знч путьКОбъекту = ПутьКФайлуПоОбъекту(ошибка).Заменить("\\", "/") + знч положение = новый ОписаниеРасположенияCodeQuality("%{ошибка.проект}/%путьКОбъекту", номерСтроки) + знч описаниеОшибки = новый ОписаниеОшибкиCodeQuality( + ошибка.описание, отпечатокОшибки, критичность, положение) + + ошибкиCodeQuality.Добавить(описаниеОшибки) + ; + + знч файлПараметров = новый Файл(файлCodeQuality) + исп поток = файлПараметров.ОткрытьПотокЗаписи() + СериализацияJson.ЗаписатьОбъект(поток, ошибкиCodeQuality) +; + +метод ЗаписатьОшибкиВФорматJUnit(файлJUnit: Строка, ошибкиEDT: Массив) знч файлПараметров = новый Файл(файлJUnit) исп поток = файлПараметров.ОткрытьПотокЗаписи() пер записьXML = новый ЗаписьXml(поток) пер количествоОшибок = 0 - для ошибка из данныеОшибок.issues - если ошибка.type == SonarqubeType.BUG + для ошибка из ошибкиEDT // ОписаниеОшибкиEDT + если ошибка.тип == SonarqubeType.BUG количествоОшибок += 1 ; ; @@ -2244,8 +2674,8 @@ .ЗаписатьАтрибут("failures", "0") .ЗаписатьАтрибут("time", "0") - для ошибка из данныеОшибок.issues - если ошибка.type != SonarqubeType.BUG + для ошибка из ошибкиEDT + если ошибка.тип != SonarqubeType.BUG продолжить ; записьXML @@ -2266,7 +2696,6 @@ записьXML.ЗаписатьКонецЭлемента() записьXML.ЗаписатьКонецДокумента() - ; структура ОписаниеJunitTestSuites @@ -2309,27 +2738,37 @@ возврат ошибкиJunit ; -метод ОшибкиВФорматеSonarCube(файлРезультатовВалидации: Строка): SonarqubeGenericFormat +метод ОшибкиEDT(файлРезультатовВалидации: Строка): Массив + пер ошибки = новый Массив() + знч файл = новый Файл(файлРезультатовВалидации) исп поток = файл.ОткрытьПотокЧтения() - пер issues = новый Массив() - пер rules = новый Массив() - пер соответствиеПравил = новый Соответствие() - знч чтение = новый ЧтениеДанных(поток) пока не чтение.ЧтениеЗавершено() знч строкаДанных = чтение.ПрочитатьСтроку() если строкаДанных.Пусто() - продолжить + продолжить ; знч описаниеОшибки = ОшибкаEDT(строкаДанных) если описаниеОшибки == Неопределено - продолжить + продолжить ; - знч issue = IssueИзСтрокиTSV(описаниеОшибки) + ошибки.Добавить(описаниеОшибки) + ; + + возврат ошибки +; + +метод ОшибкиВФорматеSonarQube(ошибкиEDT: Массив): SonarqubeGenericFormat + пер issues = новый Массив() + пер rules = новый Массив() + пер соответствиеПравил = новый Соответствие() + + для описаниеОшибки из ошибкиEDT + знч issue = IssueИзОшибкиEDT(описаниеОшибки) issues.Добавить(issue) соответствиеПравил.Вставить(issue.ruleId, RuleИзIssue(issue)) @@ -2351,10 +2790,22 @@ Тривиальная ; +перечисление ОшибкаEDTТип + Предупреждение, + Производительность, + РазработкаИИспользованиеБиблиотек, + СтандартыРазработкиИнтерфейсов, + Безопасность, + Переносимость, + СтандартыКодирования, + Орфография +; + структура ОписаниеОшибкиEDT знч создано: ДатаВремя знч критичность: ОшибкаEDTКритичность + знч тип: ОшибкаEDTТип знч проект: Строка знч объект: Строка знч положение: Число @@ -2363,7 +2814,7 @@ пер ид: Строка пер контекст: Массив - конструктор(создано, критичность, проект, ид, объект, положение, описание) + конструктор(создано, критичность, тип, проект, ид, объект, положение, описание) ; @@ -2400,7 +2851,9 @@ ; - пер описаниеОшибки = новый ОписаниеОшибкиEDT(создано, критичность, массивДанных[2], массивДанных[3], массивДанных[4], + пер тип = ОшибкаEDTТип.СтандартыКодирования + + пер описаниеОшибки = новый ОписаниеОшибкиEDT(создано, критичность, тип, массивДанных[2], массивДанных[3], массивДанных[4], положение, массивДанных[6]) описаниеОшибки.источник = "EDT" @@ -2520,31 +2973,39 @@ возврат "src\\%объектМетаданных\\%наименованиеОбъекта\\%имяМодуля.bsl" ; -метод IssueИзСтрокиTSV(описаниеОшибки: ОписаниеОшибкиEDT): SonarqubeIssue +метод IssueИзОшибкиEDT(описаниеОшибки: ОписаниеОшибкиEDT): SonarqubeIssue знч engineId = описаниеОшибки.источник знч ruleId = описаниеОшибки.ид пер primaryLocation = новый SonarqubeLocation(описаниеОшибки.описание, ПутьКФайлуПоОбъекту(описаниеОшибки)) primaryLocation.textRange = новый SonarqubeTextRange(описаниеОшибки.положение) - пер type = SonarqubeType.CODE_SMELL пер severity = SonarqubeSeverity.INFO выбор описаниеОшибки.критичность когда ОшибкаEDTКритичность.Блокирующая severity = SonarqubeSeverity.BLOCKER - type = SonarqubeType.BUG когда ОшибкаEDTКритичность.Критическая severity = SonarqubeSeverity.CRITICAL - type = SonarqubeType.BUG когда ОшибкаEDTКритичность.Значительная severity = SonarqubeSeverity.MAJOR - type = SonarqubeType.BUG когда ОшибкаEDTКритичность.Незначительная severity = SonarqubeSeverity.MINOR - type = SonarqubeType.BUG + + ; + + пер type = SonarqubeType.BUG + выбор описаниеОшибки.тип + когда ОшибкаEDTТип.Безопасность + type = SonarqubeType.VULNERABILITY + + когда ОшибкаEDTТип.Орфография + type = SonarqubeType.CODE_SMELL + + когда ОшибкаEDTТип.СтандартыКодирования + type = SonarqubeType.CODE_SMELL ; @@ -2665,7 +3126,7 @@ возврат новый ДатаВремя(1, 1, 1) ; - возврат коммиты.Первый().created_at + возврат новый ДатаВремя(коммиты.Первый().Получить("created_at").ПодстрокаСНачала(19)) ; метод Commits_LastDate_Until(имяВетки: Строка, имяПроекта: Строка, токен: Строка, адресСервера: Строка, @@ -2676,7 +3137,7 @@ возврат новый ДатаВремя(1, 1, 1) ; - возврат коммиты.Первый().created_at + возврат новый ДатаВремя(коммиты.Первый().Получить("created_at").ПодстрокаСНачала(19)) ; метод Jobs_Cancel(идЗадания: Строка, идПроекта: Строка, токен: Строка, адресСервера: Строка) @@ -3002,49 +3463,47 @@ пер параметры = новый Массив() параметры.Добавить("-Dproject.settings=\"%имяФайлаПараметров\"") параметры.Добавить("-D\"sonar.login=%токен\"") - параметры.Добавить(">%{временныйФайлЛогов.Путь}") +// параметры.Добавить(">%{временныйФайлЛогов.Путь}") - пер процесс = новый ПроцессОс(имяКоманды, параметры, Ложь) + знч представление = Строки.Шаблон("\в\нКоманда: $0\в\нПараметры: $1", [имяКоманды, Строки.Соединить(параметры, " ")]) + Консоль.Записать(представление) + + пер процесс = новый ПроцессОс(имяКоманды, параметры) процесс.Запустить() пер количествоВыведенныхСтрок = 0 + пер кодВозврата = Неопределено пока не процесс.ОжидатьЗавершения(60с) и процесс.Живой() - если временныйФайлЛогов.Существует() - исп логВыполненияСкрипта = временныйФайлЛогов.ОткрытьПотокЧтения() - знч текстЛога = логВыполненияСкрипта.ПрочитатьКакСтроку(КодировкаПотокаВыводаПлатформы()) - знч строкиЛога = текстЛога.Разделить(Символы.НоваяСтрока) - если строкиЛога.Размер() > количествоВыведенныхСтрок - знч текстСообщения = Строки.Соединить(строкиЛога.ПодМассив(количествоВыведенныхСтрок), Символы.НоваяСтрока) - количествоВыведенныхСтрок = строкиЛога.Размер() - Консоль.Записать(текстСообщения) - ; - логВыполненияСкрипта.Закрыть() + знч текстПотока = процесс.ПолучитьПотокВывода().ПрочитатьКакТекст() + если не текстПотока.Пусто() + Консоль.Записать(текстПотока) + ; + +// количествоВыведенныхСтрок = вывестиФайлЛога(временныйФайлЛогов, КодировкаПотокаВыводаПлатформы(), количествоВыведенныхСтрок) + + кодВозврата = процесс.ПолучитьКодВозврата() + если кодВозврата != Неопределено + процесс.ОжидатьЗавершения(10с) + прервать ; ; - если временныйФайлЛогов.Существует() - исп логВыполненияСкрипта = временныйФайлЛогов.ОткрытьПотокЧтения() - знч текстЛога = логВыполненияСкрипта.ПрочитатьКакСтроку(КодировкаПотокаВыводаПлатформы()) - знч строкиЛога = текстЛога.Разделить(Символы.НоваяСтрока) - если строкиЛога.Размер() > количествоВыведенныхСтрок - знч текстСообщения = Строки.Соединить(строкиЛога.ПодМассив(количествоВыведенныхСтрок), Символы.НоваяСтрока) - количествоВыведенныхСтрок = строкиЛога.Размер() - Консоль.Записать(текстСообщения) - ; - логВыполненияСкрипта.Закрыть() - Файлы.Удалить(временныйФайлЛогов) +// вывестиФайлЛога(временныйФайлЛогов, КодировкаПотокаВыводаПлатформы(), количествоВыведенныхСтрок, Истина) + + если процесс.Живой() + процесс.Остановить() ; - знч кодВозврата = процесс.ПолучитьКодВозврата() + знч текстПотока = процесс.ПолучитьПотокВывода().ПрочитатьКакТекст() + если не текстПотока.Пусто() + Консоль.Записать(текстПотока) + ; + + кодВозврата = процесс.ПолучитьКодВозврата() если кодВозврата == 0 Консоль.Записать("SonarQube Scanner успешно запущен.") - возврат + возврат ; - пер текстОшибки = "Код возврата: %кодВозврата" - - текстОшибки += Строки.Шаблон("\в\нКоманда: $0\в\нПараметры: $1", [имяКоманды, Строки.Соединить(параметры, " ")]) - - исп ошибкиВыполненияСкрипта = процесс.ПолучитьПотокОшибок() - текстОшибки += "\в\н" + ошибкиВыполненияСкрипта.ПрочитатьКакСтроку(КодировкаПотокаВыводаПлатформы()) + знч текстОшибки = "Код возврата: %кодВозврата" выбросить новый ИсключениеНедопустимоеСостояние(текстОшибки) -; \ No newline at end of file +;