From f8646600a5d1928a5ff966d3c950aace05415870 Mon Sep 17 00:00:00 2001 From: ivanovEV Date: Fri, 19 Jan 2024 14:50:38 +0300 Subject: [PATCH 1/9] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D1=83=20=D1=80?= =?UTF-8?q?=D0=B0=D1=81=D1=88=D0=B8=D1=80=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=B2?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=BD=D1=84=D1=83.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/globalConfiguration.json | 5 +- resources/schema.json | 645 +++++++++--------- .../configuration/ConfigurationReader.groovy | 21 +- .../configuration/InitInfoBaseOptions.groovy | 25 + .../library/configuration/InitMethod.groovy | 12 + .../configuration/JobConfiguration.groovy | 9 + .../configuration/TimeoutOptions.groovy | 10 + .../EdtToDesignerFormatTransformation.groovy | 55 +- .../library/steps/GetExtensions.groovy | 96 +++ .../library/steps/LoadExtensions.groovy | 55 ++ vars/getExtensions.groovy | 10 + vars/loadExtensions.groovy | 10 + vars/pipeline1C.groovy | 26 +- 13 files changed, 665 insertions(+), 314 deletions(-) create mode 100644 src/ru/pulsar/jenkins/library/configuration/InitMethod.groovy create mode 100644 src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy create mode 100644 src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy create mode 100644 vars/getExtensions.groovy create mode 100644 vars/loadExtensions.groovy diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index 5fcd3eb7..45936811 100644 --- a/resources/globalConfiguration.json +++ b/resources/globalConfiguration.json @@ -24,11 +24,13 @@ "timeout": { "smoke": 240, "bdd": 120, + "getBinaries": 60, "createInfoBase": 60, "designerToEdtFormatTransformation": 60, "edtToDesignerFormatTransformation": 60, "edtValidate": 240, "initInfoBase": 60, + "loadExtensions": 60, "resultTransformation": 10, "sonarqube": 90, "syntaxCheck": 240, @@ -37,7 +39,8 @@ "initInfobase": { "initMethod": "fromStorage", "runMigration": true, - "additionalInitializationSteps": [] + "additionalInitializationSteps": [], + "extensions": [] }, "bdd": { "vrunnerSteps": [ diff --git a/resources/schema.json b/resources/schema.json index fbeb0dd8..5b89ff26 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -1,368 +1,405 @@ { - "type" : "object", - "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:JobConfiguration", - "properties" : { - "v8version" : { - "type" : "string", - "description" : "Версия платформы 1С:Предприятие в формате 8.3.хх.хххх." + "type": "object", + "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:JobConfiguration", + "properties": { + "v8version": { + "type": "string", + "description": "Версия платформы 1С:Предприятие в формате 8.3.хх.хххх." }, - "edtVersion" : { - "type" : "string", - "description" : "Версия модуля 1C:Enterprise Development Tools формате xxxx.x.x:x86_64" + "edtVersion": { + "type": "string", + "description": "Версия модуля 1C:Enterprise Development Tools формате xxxx.x.x:x86_64" }, - "srcDir" : { - "type" : "string", - "description" : "Путь к корневому каталогу с исходниками конфигурации, в случае хранения исходников в формате EDT, необходимо указать путь к проекту" + "srcDir": { + "type": "string", + "description": "Путь к корневому каталогу с исходниками конфигурации, в случае хранения исходников в формате EDT, необходимо указать путь к проекту" }, - "sourceFormat" : { - "type" : "string", - "description" : "Формат исходников конфигурации", - "enum" : [ "edt", "designer" ] + "sourceFormat": { + "type": "string", + "description": "Формат исходников конфигурации", + "enum": ["edt", "designer"] }, - "defaultBranch" : { - "type" : "string", - "description" : "Имя ветки по умолчанию. Значение по умолчанию - main." + "defaultBranch": { + "type": "string", + "description": "Имя ветки по умолчанию. Значение по умолчанию - main." }, - "secrets" : { - "type" : "object", - "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:Secrets", - "description" : "Идентификаторы сохраненных секретов", - "properties" : { - "storagePath" : { - "type" : "string", - "description" : "Путь к хранилищу конфигурации" - }, - "storage" : { - "type" : "string", - "description" : "Данные авторизации в хранилище конфигурации" - }, - "telegramChatId" : { - "type" : "string", - "description" : "Идентификатор telegram-чата для отправки уведомлений" - }, - "telegramBotToken" : { - "type" : "string", - "description" : "Токен авторизации telegram-бота для отправки уведомлений" + "secrets": { + "type": "object", + "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:Secrets", + "description": "Идентификаторы сохраненных секретов", + "properties": { + "storagePath": { + "type": "string", + "description": "Путь к хранилищу конфигурации" + }, + "storage": { + "type": "string", + "description": "Данные авторизации в хранилище конфигурации" + }, + "telegramChatId": { + "type": "string", + "description": "Идентификатор telegram-чата для отправки уведомлений" + }, + "telegramBotToken": { + "type": "string", + "description": "Токен авторизации telegram-бота для отправки уведомлений" } } }, - "stages" : { - "type" : "object", - "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:StageFlags", - "description" : "Включение этапов сборок", - "properties" : { - "sonarqube" : { - "type" : "boolean", - "description" : "Анализ SonarQube включен" - }, - "syntaxCheck" : { - "type" : "boolean", - "description" : "Синтаксический контроль включен" - }, - "edtValidate" : { - "type" : "boolean", - "description" : "Валидация EDT включена" - }, - "smoke" : { - "type" : "boolean", - "description" : "Дымовые тесты включены" - }, - "initSteps" : { - "type" : "boolean", - "description" : "Предварительные шаги инициализации включены" - }, - "bdd" : { - "type" : "boolean", - "description" : "Запуск BDD сценариев включен" - }, - "email" : { - "type" : "boolean", - "description" : "Выполнять рассылку результатов сборки на email" - }, - "telegram" : { - "type" : "boolean", - "description" : "Выполнять рассылку результатов сборки в telegram" + "stages": { + "type": "object", + "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:StageFlags", + "description": "Включение этапов сборок", + "properties": { + "sonarqube": { + "type": "boolean", + "description": "Анализ SonarQube включен" + }, + "syntaxCheck": { + "type": "boolean", + "description": "Синтаксический контроль включен" + }, + "edtValidate": { + "type": "boolean", + "description": "Валидация EDT включена" + }, + "smoke": { + "type": "boolean", + "description": "Дымовые тесты включены" + }, + "initSteps": { + "type": "boolean", + "description": "Предварительные шаги инициализации включены" + }, + "bdd": { + "type": "boolean", + "description": "Запуск BDD сценариев включен" + }, + "email": { + "type": "boolean", + "description": "Выполнять рассылку результатов сборки на email" + }, + "telegram": { + "type": "boolean", + "description": "Выполнять рассылку результатов сборки в telegram" } } }, - "timeout" : { - "type" : "object", - "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:TimeoutOptions", - "description" : "Настройка таймаутов для шагов", - "properties" : { - "edtToDesignerFormatTransformation" : { - "type" : "integer", - "description" : "Таймаут шага трансформации исходников из формата EDT в формат Конфигуратора, в минутах.\n По умолчанию содержит значение 60.\n " - }, - "createInfoBase" : { - "type" : "integer", - "description" : "Таймаут шага создания информационной базы, в минутах.\n По умолчанию содержит значение 60.\n " - }, - "initInfoBase" : { - "type" : "integer", - "description" : "Таймаут шага инициализации информационной базы, в минутах.\n По умолчанию содержит значение 60.\n " - }, - "zipInfoBase" : { - "type" : "integer", - "description" : "Таймаут шага архивирования информационной базы, в минутах.\n По умолчанию содержит значение 60.\n " - }, - "designerToEdtFormatTransformation" : { - "type" : "integer", - "description" : "Таймаут шага трансформации исходников из формата Конфигуратора в формат EDT, в минутах.\n По умолчанию содержит значение 60.\n " - }, - "edtValidate" : { - "type" : "integer", - "description" : "Таймаут шага валидации EDT, в минутах.\n По умолчанию содержит значение 240.\n " - }, - "resultTransformation" : { - "type" : "integer", - "description" : "Таймаут шага трансформации результатов EDT, в минутах.\n По умолчанию содержит значение 10.\n " - }, - "bdd" : { - "type" : "integer", - "description" : "Таймаут шага проверки сценариев поведения, в минутах.\n По умолчанию содержит значение 120.\n " - }, - "syntaxCheck" : { - "type" : "integer", - "description" : "Таймаут шага синтаксического контроля, в минутах.\n По умолчанию содержит значение 240.\n " - }, - "smoke" : { - "type" : "integer", - "description" : "Таймаут шага дымовых тестов, в минутах.\n По умолчанию содержит значение 240.\n " - }, - "sonarqube" : { - "type" : "integer", - "description" : "Таймаут шага статического анализа SonarQube, в минутах.\n По умолчанию содержит значение 90.\n " + "timeout": { + "type": "object", + "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:TimeoutOptions", + "description": "Настройка таймаутов для шагов", + "properties": { + "edtToDesignerFormatTransformation": { + "type": "integer", + "description": "Таймаут шага трансформации исходников из формата EDT в формат Конфигуратора, в минутах.\n По умолчанию содержит значение 60.\n " + }, + "getBinaries": { + "type": "integer", + "description": "Таймаут шага получения бинарников, в минутах.\n По умолчанию содержит значение 60.\n " + }, + "createInfoBase": { + "type": "integer", + "description": "Таймаут шага создания информационной базы, в минутах.\n По умолчанию содержит значение 60.\n " + }, + "initInfoBase": { + "type": "integer", + "description": "Таймаут шага инициализации информационной базы, в минутах.\n По умолчанию содержит значение 60.\n " + }, + "loadExtensions": { + "type": "integer", + "description": "Таймаут шага загрузки расширений в базу, в минутах.\n По умолчанию содержит значение 60.\n " + }, + "zipInfoBase": { + "type": "integer", + "description": "Таймаут шага архивирования информационной базы, в минутах.\n По умолчанию содержит значение 60.\n " + }, + "designerToEdtFormatTransformation": { + "type": "integer", + "description": "Таймаут шага трансформации исходников из формата Конфигуратора в формат EDT, в минутах.\n По умолчанию содержит значение 60.\n " + }, + "edtValidate": { + "type": "integer", + "description": "Таймаут шага валидации EDT, в минутах.\n По умолчанию содержит значение 240.\n " + }, + "resultTransformation": { + "type": "integer", + "description": "Таймаут шага трансформации результатов EDT, в минутах.\n По умолчанию содержит значение 10.\n " + }, + "bdd": { + "type": "integer", + "description": "Таймаут шага проверки сценариев поведения, в минутах.\n По умолчанию содержит значение 120.\n " + }, + "syntaxCheck": { + "type": "integer", + "description": "Таймаут шага синтаксического контроля, в минутах.\n По умолчанию содержит значение 240.\n " + }, + "smoke": { + "type": "integer", + "description": "Таймаут шага дымовых тестов, в минутах.\n По умолчанию содержит значение 240.\n " + }, + "sonarqube": { + "type": "integer", + "description": "Таймаут шага статического анализа SonarQube, в минутах.\n По умолчанию содержит значение 90.\n " } } }, - "initInfobase" : { - "type" : "object", - "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:InitInfoBaseOptions", - "description" : "Настройки шага инициализации ИБ", - "properties" : { - "initMethod" : { - "type" : "string", - "description" : "\n Способ инициализации информационной базы.\n Поддерживается три варианта:\n * fromStorage - инициализация информационной базы из хранилища конфигурации;\n * fromSource - инициализация информационной базы из исходников конфигурации;\n * defaultBranchFromStorage - инициализация основной ветки из хранилища конфигурации, остальных - из исходников конфигурации.\n По умолчанию содержит значение \"fromStorage\".", - "enum" : [ "fromStorage", "fromSource", "defaultBranchFromStorage" ] - }, - "runMigration" : { - "type" : "boolean", - "description" : "Запустить миграцию ИБ" - }, - "additionalInitializationSteps" : { - "type" : "array", - "description" : "Дополнительные шаги, запускаемые через vrunner.\n В каждой строке передается отдельная команда \n vrunner и ее аргументы (например, \"vanessa --settings ./tools/vrunner.first.json\")\n ", - "items" : { - "type" : "string" + "initInfobase": { + "type": "object", + "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:InitInfoBaseOptions", + "description": "Настройки шага инициализации ИБ", + "properties": { + "initMethod": { + "type": "string", + "description": "\n Способ инициализации информационной базы.\n Поддерживается три варианта:\n * fromStorage - инициализация информационной базы из хранилища конфигурации;\n * fromSource - инициализация информационной базы из исходников конфигурации;\n * defaultBranchFromStorage - инициализация основной ветки из хранилища конфигурации, остальных - из исходников конфигурации.\n По умолчанию содержит значение \"fromStorage\".", + "enum": ["fromStorage", "fromSource", "defaultBranchFromStorage"] + }, + "runMigration": { + "type": "boolean", + "description": "Запустить миграцию ИБ" + }, + "additionalInitializationSteps": { + "type": "array", + "description": "Дополнительные шаги, запускаемые через vrunner.\n В каждой строке передается отдельная команда \n vrunner и ее аргументы (например, \"vanessa --settings ./tools/vrunner.first.json\")\n ", + "items": { + "type": "string" + } + }, + "extensions": { + "type": "array", + "description": "Массив расширений для загрузки в конфигурацию.", + "items": { + "type": "object", + "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:InitInfoBaseOptions:extensions:exception", + "description": "Информация о расширении для загрузки", + "properties": { + "name": { + "type": "string", + "description": "Имя расширения с которым оно грузится в конфигурацию" + }, + "initMethod": { + "type": "string", + "description": "\n Способ инициализации расширения.\n Поддерживается два варианта:\n * fromSource - инициализация расширения из исходников;\n * fromInternet - скачивание скомпилированного cfe по ссылке.", + "enum": ["fromSource", "fromInternet"] + }, + "path": { + "type": "string", + "description": "Хранит в себе путь к расширению.\n * В случае если выбран initMethod - указывается путь к исходникам расширения.\n * В случае если выбран initMethod - указывается ссылка на cfe-файл" + } + } } } } }, - "bdd" : { - "type" : "object", - "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:BddOptions", - "description" : "Настройки шага запуска BDD сценариев", - "properties" : { - "vrunnerSteps" : { - "type" : "array", - "description" : "Шаги, запускаемые через vrunner.\n В каждой строке передается отдельная команда \n vrunner и ее аргументы (например, \"vanessa --settings ./tools/vrunner.json\").\n По умолчанию содержит одну команду \"vanessa --settings ./tools/vrunner.json\".\n ", - "items" : { - "type" : "string" + "bdd": { + "type": "object", + "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:BddOptions", + "description": "Настройки шага запуска BDD сценариев", + "properties": { + "vrunnerSteps": { + "type": "array", + "description": "Шаги, запускаемые через vrunner.\n В каждой строке передается отдельная команда \n vrunner и ее аргументы (например, \"vanessa --settings ./tools/vrunner.json\").\n По умолчанию содержит одну команду \"vanessa --settings ./tools/vrunner.json\".\n ", + "items": { + "type": "string" } } } }, - "sonarqube" : { - "type" : "object", - "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:SonarQubeOptions", - "description" : "Настройки анализа SonarQube", - "properties" : { - "sonarQubeInstallation" : { - "type" : "string", - "description" : "Имя настроенного SonarQube-сервера (SonarQube installations).\nЕсли настроен только один сервер, то может быть оставлено пустым." - }, - "useSonarScannerFromPath" : { - "type" : "boolean", - "description" : "Использовать sonar-scanner, доступный в PATH" - }, - "sonarScannerToolName" : { - "type" : "string", - "description" : "Имя настроенной утилиты sonar-scanner.\nПрименяется, если useSonarScannerFromPath установлено в false." - }, - "infoBaseUpdateModuleName" : { - "type" : "string", - "description" : "Имя общего модуля (например, ОбновлениеИнформационнойБазыXXX), в котором указана версия библиотеки.\n Версия должна задаваться в виде присвоения `Описание.Версия = \"ваш номер версии\";`\n " - }, - "branchAnalysisConfiguration" : { - "type" : "string", - "description" : "Вариант конфигурации branch plugin.\n Поддерживаемые варианты:\n * auto - применяется автоконфигурация sonar-scanner силами branchplugin. Так же может применяться для отключения конфигурирования, если branch plugin отсутствует;\n * fromEnv - применяется ручная конфигурация sonar-scanner на основе переменных среды.\n Значение по умолчанию: fromEnv.", - "enum" : [ "auto", "fromEnv" ] - }, - "waitForQualityGate" : { - "type" : "boolean", - "description" : "Ожидать состояние Quality Gate от SonarQube после загрузки анализа. По умолчанию `false`.\n Таймаут ожидания состояния равен таймауту шага.\n " + "sonarqube": { + "type": "object", + "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:SonarQubeOptions", + "description": "Настройки анализа SonarQube", + "properties": { + "sonarQubeInstallation": { + "type": "string", + "description": "Имя настроенного SonarQube-сервера (SonarQube installations).\nЕсли настроен только один сервер, то может быть оставлено пустым." + }, + "useSonarScannerFromPath": { + "type": "boolean", + "description": "Использовать sonar-scanner, доступный в PATH" + }, + "sonarScannerToolName": { + "type": "string", + "description": "Имя настроенной утилиты sonar-scanner.\nПрименяется, если useSonarScannerFromPath установлено в false." + }, + "infoBaseUpdateModuleName": { + "type": "string", + "description": "Имя общего модуля (например, ОбновлениеИнформационнойБазыXXX), в котором указана версия библиотеки.\n Версия должна задаваться в виде присвоения `Описание.Версия = \"ваш номер версии\";`\n " + }, + "branchAnalysisConfiguration": { + "type": "string", + "description": "Вариант конфигурации branch plugin.\n Поддерживаемые варианты:\n * auto - применяется автоконфигурация sonar-scanner силами branchplugin. Так же может применяться для отключения конфигурирования, если branch plugin отсутствует;\n * fromEnv - применяется ручная конфигурация sonar-scanner на основе переменных среды.\n Значение по умолчанию: fromEnv.", + "enum": ["auto", "fromEnv"] + }, + "waitForQualityGate": { + "type": "boolean", + "description": "Ожидать состояние Quality Gate от SonarQube после загрузки анализа. По умолчанию `false`.\n Таймаут ожидания состояния равен таймауту шага.\n " } } }, - "syntaxCheck" : { - "type" : "object", - "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:SyntaxCheckOptions", - "description" : "Настройки синтаксического контроля", - "properties" : { - "pathToJUnitReport" : { - "type" : "string", - "description" : "Путь к файлу отчета jUnit\n По умолчанию содержит значение \"./build/out/jUnit/syntax.xml\"\n " - }, - "groupErrorsByMetadata" : { - "type" : "boolean", - "description" : "Группировать выявленные ошибки по объектам метаданных.\n По умолчанию включено.\n " - }, - "checkModes" : { - "type" : "array", - "description" : "Режимы проверки конфигурации", - "items" : { - "type" : "string" + "syntaxCheck": { + "type": "object", + "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:SyntaxCheckOptions", + "description": "Настройки синтаксического контроля", + "properties": { + "pathToJUnitReport": { + "type": "string", + "description": "Путь к файлу отчета jUnit\n По умолчанию содержит значение \"./build/out/jUnit/syntax.xml\"\n " + }, + "groupErrorsByMetadata": { + "type": "boolean", + "description": "Группировать выявленные ошибки по объектам метаданных.\n По умолчанию включено.\n " + }, + "checkModes": { + "type": "array", + "description": "Режимы проверки конфигурации", + "items": { + "type": "string" } }, - "exceptionFile" : { - "type" : "string", - "description" : "Путь к файлу с указанием пропускаемых ошибок.\n Формат файла: в каждой строке файла указан текст пропускаемого исключения или его часть\n Кодировка: UTF-8\n " + "exceptionFile": { + "type": "string", + "description": "Путь к файлу с указанием пропускаемых ошибок.\n Формат файла: в каждой строке файла указан текст пропускаемого исключения или его часть\n Кодировка: UTF-8\n " }, - "vrunnerSettings" : { - "type" : "string", - "description" : "Путь к конфигурационному файлу vanessa-runner.\n По умолчанию содержит значение \"./tools/vrunner.json\".\n " + "vrunnerSettings": { + "type": "string", + "description": "Путь к конфигурационному файлу vanessa-runner.\n По умолчанию содержит значение \"./tools/vrunner.json\".\n " } } }, - "smoke" : { - "type" : "object", - "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:SmokeTestOptions", - "description" : "Настройки дымового тестирования", - "properties" : { - "vrunnerSettings" : { - "type" : "string", - "description" : "Путь к конфигурационному файлу vanessa-runner.\n По умолчанию содержит значение \"./tools/vrunner.json\".\n " - }, - "xddConfigPath" : { - "type" : "string", - "description" : "Путь к конфигурационному файлу для xddTestRunner.\n По умолчанию содержит значение \"./tools/xUnitParams.json\".\n " - }, - "publishToAllureReport" : { - "type" : "boolean", - "description" : "Выполнять публикацию результатов в отчет Allure.\n По умолчанию выключено.\n " - }, - "publishToJUnitReport" : { - "type" : "boolean", - "description" : "Выполнять публикацию результатов в отчет JUnit.\n По умолчанию включено.\n " + "smoke": { + "type": "object", + "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:SmokeTestOptions", + "description": "Настройки дымового тестирования", + "properties": { + "vrunnerSettings": { + "type": "string", + "description": "Путь к конфигурационному файлу vanessa-runner.\n По умолчанию содержит значение \"./tools/vrunner.json\".\n " + }, + "xddConfigPath": { + "type": "string", + "description": "Путь к конфигурационному файлу для xddTestRunner.\n По умолчанию содержит значение \"./tools/xUnitParams.json\".\n " + }, + "publishToAllureReport": { + "type": "boolean", + "description": "Выполнять публикацию результатов в отчет Allure.\n По умолчанию выключено.\n " + }, + "publishToJUnitReport": { + "type": "boolean", + "description": "Выполнять публикацию результатов в отчет JUnit.\n По умолчанию включено.\n " } } }, - "resultsTransform" : { - "type" : "object", - "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:ResultsTransformOptions", - "description" : "Настройки трансформации результатов анализа", - "properties" : { - "removeSupport" : { - "type" : "boolean", - "description" : "Фильтровать замечания по уровню поддержки модуля. По умолчанию включено." - }, - "supportLevel" : { - "type" : "integer", - "description" : "Настройка фильтрации замечаний по уровню поддержки.\n 0 - удалить файлы на замке;\n 1 - удалить файлы на замке и на поддержке;\n 2 - удалить файлы на замке, на поддержке и снятые с поддержки.\n " + "resultsTransform": { + "type": "object", + "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:ResultsTransformOptions", + "description": "Настройки трансформации результатов анализа", + "properties": { + "removeSupport": { + "type": "boolean", + "description": "Фильтровать замечания по уровню поддержки модуля. По умолчанию включено." + }, + "supportLevel": { + "type": "integer", + "description": "Настройка фильтрации замечаний по уровню поддержки.\n 0 - удалить файлы на замке;\n 1 - удалить файлы на замке и на поддержке;\n 2 - удалить файлы на замке, на поддержке и снятые с поддержки.\n " } } }, - "notifications" : { - "type" : "object", - "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:NotificationsOptions", - "description" : "Настройки рассылки результатов сборки", - "properties" : { - "email" : { - "type" : "object", - "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:EmailNotificationOptions", - "description" : "Настройки рассылки результатов сборки через email", - "properties" : { - "onAlways" : { - "type" : "boolean", - "description" : "Отправлять всегда" + "notifications": { + "type": "object", + "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:NotificationsOptions", + "description": "Настройки рассылки результатов сборки", + "properties": { + "email": { + "type": "object", + "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:EmailNotificationOptions", + "description": "Настройки рассылки результатов сборки через email", + "properties": { + "onAlways": { + "type": "boolean", + "description": "Отправлять всегда" }, - "onSuccess" : { - "type" : "boolean", - "description" : "Отправлять при успешной сборке" + "onSuccess": { + "type": "boolean", + "description": "Отправлять при успешной сборке" }, - "onFailure" : { - "type" : "boolean", - "description" : "Отправлять при падении сборки" + "onFailure": { + "type": "boolean", + "description": "Отправлять при падении сборки" }, - "onUnstable" : { - "type" : "boolean", - "description" : "Отправлять при нестабильной сборке" + "onUnstable": { + "type": "boolean", + "description": "Отправлять при нестабильной сборке" }, - "alwaysOptions" : { - "type" : "object", - "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:email:EmailExtConfiguration", - "properties" : { - "attachLog" : { - "type" : "boolean" + "alwaysOptions": { + "type": "object", + "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:email:EmailExtConfiguration", + "properties": { + "attachLog": { + "type": "boolean" }, - "directRecipients" : { - "type" : "array", - "items" : { - "type" : "string" + "directRecipients": { + "type": "array", + "items": { + "type": "string" } }, - "recipientProviders" : { - "type" : "array", - "items" : { - "type" : "string", - "enum" : [ "developers", "requestor", "brokenBuildSuspects", "brokenTestsSuspects" ] + "recipientProviders": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "developers", + "requestor", + "brokenBuildSuspects", + "brokenTestsSuspects" + ] } } } }, - "successOptions" : { - "type" : "object", - "$ref" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:email:EmailExtConfiguration" + "successOptions": { + "type": "object", + "$ref": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:email:EmailExtConfiguration" }, - "failureOptions" : { - "type" : "object", - "$ref" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:email:EmailExtConfiguration" + "failureOptions": { + "type": "object", + "$ref": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:email:EmailExtConfiguration" }, - "unstableOptions" : { - "type" : "object", - "$ref" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:email:EmailExtConfiguration" + "unstableOptions": { + "type": "object", + "$ref": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:email:EmailExtConfiguration" } } }, - "telegram" : { - "type" : "object", - "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:TelegramNotificationOptions", - "description" : "Настройки рассылки результатов сборки через telegram", - "properties" : { - "onAlways" : { - "type" : "boolean", - "description" : "Отправлять всегда" + "telegram": { + "type": "object", + "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:TelegramNotificationOptions", + "description": "Настройки рассылки результатов сборки через telegram", + "properties": { + "onAlways": { + "type": "boolean", + "description": "Отправлять всегда" }, - "onSuccess" : { - "type" : "boolean", - "description" : "Отправлять при успешной сборке" + "onSuccess": { + "type": "boolean", + "description": "Отправлять при успешной сборке" }, - "onFailure" : { - "type" : "boolean", - "description" : "Отправлять при падении сборки" + "onFailure": { + "type": "boolean", + "description": "Отправлять при падении сборки" }, - "onUnstable" : { - "type" : "boolean", - "description" : "Отправлять при нестабильной сборке" + "onUnstable": { + "type": "boolean", + "description": "Отправлять при нестабильной сборке" } } } } }, - "logosConfig" : { - "type" : "string", - "description" : "Конфигурация библиотеки logos. Применяется перед запуском каждой стадии сборки" + "logosConfig": { + "type": "string", + "description": "Конфигурация библиотеки logos. Применяется перед запуском каждой стадии сборки" } } -} \ No newline at end of file +} diff --git a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy index a7f2c1c8..ab835753 100644 --- a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy @@ -61,6 +61,7 @@ class ConfigurationReader implements Serializable { "stageFlags", "timeoutOptions", "initInfoBaseOptions", + "extensions", "bddOptions", "sonarQubeOptions", "smokeTestOptions", @@ -113,12 +114,30 @@ class ConfigurationReader implements Serializable { @NonCPS private static void mergeInitInfoBaseOptions(InitInfoBaseOptions baseObject, InitInfoBaseOptions objectToMerge) { - if (objectToMerge == null || objectToMerge.additionalInitializationSteps == null) { + if (objectToMerge == null) { + return + } + mergeInitInfoBaseAdditionalInitializationSteps(baseObject, objectToMerge) + mergeInitInfoBaseExtintions(baseObject, objectToMerge) + } + + @NonCPS + private static void mergeInitInfoBaseAdditionalInitializationSteps(InitInfoBaseOptions baseObject, InitInfoBaseOptions objectToMerge) { + if (objectToMerge.additionalInitializationSteps == null) { return } baseObject.additionalInitializationSteps = objectToMerge.additionalInitializationSteps.clone() } + + @NonCPS + private static void mergeInitInfoBaseExtintions(InitInfoBaseOptions baseObject, InitInfoBaseOptions objectToMerge) { + if (objectToMerge.extensions == null) { + return + } + baseObject.extensions = objectToMerge.extensions.clone() + } + @NonCPS private static void mergeBddOptions(BddOptions baseObject, BddOptions objectToMerge) { if (objectToMerge == null || objectToMerge.vrunnerSteps == null) { diff --git a/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy index f0874a60..3031e548 100644 --- a/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy @@ -25,6 +25,30 @@ class InitInfoBaseOptions implements Serializable { """) String[] additionalInitializationSteps + @JsonPropertyDescription("Массив расширений для загрузки в конфигурацию.") + Extension[] extensions; + + @JsonIgnoreProperties(ignoreUnknown = true) + static class Extension implements Serializable { + @JsonPropertyDescription("Имя расширения с которым оно грузится в конфигурацию") + String name; + + @JsonPropertyDescription(""" + Способ инициализации расширения. + Поддерживается два варианта: + * fromSource - инициализация расширения из исходников; + * fromInternet - скачивание скомпилированного cfe по ссылке. + """) + InitMethod initMethod; + + @JsonPropertyDescription(""" + Хранит в себе путь к расширению. + * В случае если выбран initMethod - указывается путь к исходникам расширения. + * В случае если выбран initMethod - указывается ссылка на cfe-файл + """) + String path; + } + @Override @NonCPS String toString() { @@ -32,6 +56,7 @@ class InitInfoBaseOptions implements Serializable { "initMethod=" + initMethod + ", runMigration=" + runMigration + ", additionalInitializationSteps=" + additionalInitializationSteps + + ", extensions=" + extensions + '}'; } } diff --git a/src/ru/pulsar/jenkins/library/configuration/InitMethod.groovy b/src/ru/pulsar/jenkins/library/configuration/InitMethod.groovy new file mode 100644 index 00000000..4473c598 --- /dev/null +++ b/src/ru/pulsar/jenkins/library/configuration/InitMethod.groovy @@ -0,0 +1,12 @@ +package ru.pulsar.jenkins.library.configuration + +import com.fasterxml.jackson.annotation.JsonProperty + +enum InitMethod { + @JsonProperty("fromSource") + SOURCE, + + @JsonProperty("fromInternet") + INTERNET + +} \ No newline at end of file diff --git a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy index 75932fd9..101f3dac 100644 --- a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy @@ -100,6 +100,15 @@ class JobConfiguration implements Serializable { (initMethod == InitInfoBaseMethod.DEFAULT_BRANCH_FROM_STORAGE && branchName != defaultBranch) } + boolean needLoadExtensions() { + IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() + def env = steps.env(); + String branchName = env.BRANCH_NAME; + def extensions = initInfoBaseOptions.extensions + + return extensions.length != 0 + } + String v8AgentLabel() { return v8version } diff --git a/src/ru/pulsar/jenkins/library/configuration/TimeoutOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/TimeoutOptions.groovy index 4def6ec1..612dc2b6 100644 --- a/src/ru/pulsar/jenkins/library/configuration/TimeoutOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/TimeoutOptions.groovy @@ -11,6 +11,11 @@ class TimeoutOptions implements Serializable { ''') Integer edtToDesignerFormatTransformation + @JsonPropertyDescription('''Таймаут шага получения бинарников, в минутах. + По умолчанию содержит значение 60. + ''') + Integer getBinaries + @JsonPropertyDescription('''Таймаут шага создания информационной базы, в минутах. По умолчанию содержит значение 60. ''') @@ -21,6 +26,11 @@ class TimeoutOptions implements Serializable { ''') Integer initInfoBase + @JsonPropertyDescription('''Таймаут шага загрузки расширений в базу, в минутах. + По умолчанию содержит значение 60. + ''') + Integer loadExtensions + @JsonPropertyDescription('''Таймаут шага архивирования информационной базы, в минутах. По умолчанию содержит значение 60. ''') diff --git a/src/ru/pulsar/jenkins/library/steps/EdtToDesignerFormatTransformation.groovy b/src/ru/pulsar/jenkins/library/steps/EdtToDesignerFormatTransformation.groovy index f80acf22..edad3de5 100644 --- a/src/ru/pulsar/jenkins/library/steps/EdtToDesignerFormatTransformation.groovy +++ b/src/ru/pulsar/jenkins/library/steps/EdtToDesignerFormatTransformation.groovy @@ -4,6 +4,7 @@ package ru.pulsar.jenkins.library.steps import ru.pulsar.jenkins.library.IStepExecutor import ru.pulsar.jenkins.library.configuration.JobConfiguration import ru.pulsar.jenkins.library.configuration.SourceFormat +import ru.pulsar.jenkins.library.configuration.InitMethod import ru.pulsar.jenkins.library.ioc.ContextRegistry import ru.pulsar.jenkins.library.utils.Constants import ru.pulsar.jenkins.library.utils.EDT @@ -16,6 +17,9 @@ class EdtToDesignerFormatTransformation implements Serializable { public static final String CONFIGURATION_DIR = 'build/cfg' public static final String CONFIGURATION_ZIP = 'build/cfg.zip' public static final String CONFIGURATION_ZIP_STASH = 'cfg-zip' + public static final String EXTENSION_DIR = 'build/cfe_src' + public static final String EXTENSION_ZIP = 'build/cfe_src.zip' + public static final String EXTENSION_ZIP_STASH = 'cfe_src-zip' private final JobConfiguration config; @@ -35,18 +39,29 @@ class EdtToDesignerFormatTransformation implements Serializable { def env = steps.env(); - def srcDir = config.srcDir - def projectDir = FileUtils.getFilePath("$env.WORKSPACE/$srcDir") - def workspaceDir = FileUtils.getFilePath("$env.WORKSPACE/$WORKSPACE") - def configurationRoot = FileUtils.getFilePath("$env.WORKSPACE/$CONFIGURATION_DIR") + String srcDir = config.srcDir + String workspaceDir = FileUtils.getFilePath("$env.WORKSPACE/$WORKSPACE") + + String projectWorkspaceDir = FileUtils.getFilePath("$workspaceDir/cf") + String projectDir = FileUtils.getFilePath("$env.WORKSPACE/$srcDir") + String configurationRoot = FileUtils.getFilePath("$env.WORKSPACE/$CONFIGURATION_DIR") + + + String extensionRoot = FileUtils.getFilePath("$env.WORKSPACE/$EXTENSION_DIR") def edtVersionForRing = EDT.ringModule(config) steps.deleteDir(workspaceDir) - steps.deleteDir(configurationRoot) - Logger.println("Конвертация исходников из формата EDT в формат Конфигуратора") + transformConfiguration(steps, projectDir, projectWorkspaceDir, configurationRoot, edtVersionForRing) + transformExtensions(steps, workspaceDir, extensionRoot, edtVersionForRing) + } - def ringCommand = "ring $edtVersionForRing workspace export --workspace-location \"$workspaceDir\" --project \"$projectDir\" --configuration-files \"$configurationRoot\"" + private void transformConfiguration(IStepExecutor steps, String projectDir, String projectWorkspaceDir, String configurationRoot, String edtVersionForRing) { + + Logger.println("Конвертация исходников конфигурации из формата EDT в формат Конфигуратора") + steps.deleteDir(configurationRoot) + + def ringCommand = "ring $edtVersionForRing workspace export --workspace-location \"$projectWorkspaceDir\" --project \"$projectDir\" --configuration-files \"$configurationRoot\"" def ringOpts = [Constants.DEFAULT_RING_OPTS] steps.withEnv(ringOpts) { @@ -57,4 +72,30 @@ class EdtToDesignerFormatTransformation implements Serializable { steps.stash(CONFIGURATION_ZIP_STASH, CONFIGURATION_ZIP) } + private void transformExtensions(IStepExecutor steps, String workspaceDir, String extensionRoot, String edtVersionForRing) { + steps.deleteDir(extensionRoot) + + config.initInfoBaseOptions.extensions.each { + + if (it.initMethod != InitMethod.SOURCE) { + return + } + + Logger.println("Конвертация исходников расширения ${it.name} из формата EDT в формат Конфигуратора") + + def env = steps.env(); + def projectDir = FileUtils.getFilePath("$env.WORKSPACE/${it.path}") + def currentExtensionWorkspaceDir = FileUtils.getFilePath("$workspaceDir/cfe/${it.name}") + + def ringCommand = "ring $edtVersionForRing workspace export --workspace-location \"$currentExtensionWorkspaceDir\" --project \"$projectDir\" --configuration-files \"$extensionRoot/${it.name}\"" + + def ringOpts = [Constants.DEFAULT_RING_OPTS] + steps.withEnv(ringOpts) { + steps.cmd(ringCommand) + } + } + steps.zip(EXTENSION_DIR, EXTENSION_ZIP) + steps.stash(EXTENSION_ZIP_STASH, EXTENSION_ZIP) + } + } diff --git a/src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy b/src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy new file mode 100644 index 00000000..b891f4cb --- /dev/null +++ b/src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy @@ -0,0 +1,96 @@ +package ru.pulsar.jenkins.library.steps + +import ru.pulsar.jenkins.library.IStepExecutor +import ru.pulsar.jenkins.library.configuration.JobConfiguration +import ru.pulsar.jenkins.library.configuration.SourceFormat +import ru.pulsar.jenkins.library.configuration.InitMethod +import ru.pulsar.jenkins.library.configuration.InitInfoBaseOptions.Extension +import ru.pulsar.jenkins.library.ioc.ContextRegistry +import ru.pulsar.jenkins.library.utils.Logger +import ru.pulsar.jenkins.library.utils.VRunner +import hudson.FilePath +import ru.pulsar.jenkins.library.utils.FileUtils + +class GetExtensions implements Serializable { + + public static final String EXTENSIONS_OUT_DIR = 'build/out/cfe' + + private final JobConfiguration config; + + GetExtensions(JobConfiguration config) { + this.config = config + } + + def run() { + IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() + + Logger.printLocation() + + def env = steps.env() + + steps.installLocalDependencies(); + + + String vrunnerPath = initVRunnerPath(); + + + Logger.println("Сборка расширений") + + String sourceDirName = "" + + if (config.sourceFormat == SourceFormat.EDT) { + sourceDirName = "$env.WORKSPACE/$EdtToDesignerFormatTransformation.EXTENSION_DIR" + } + extractConvertedExtensions(sourceDirName, steps) + + config.initInfoBaseOptions.extensions.each { + if (it.initMethod == InitMethod.SOURCE) { + Logger.println("Сборка расширения ${it.name} из исходников") + String srcDir = getSrcDir(it, sourceDirName) + buildExtension(it, srcDir, vrunnerPath, steps) + } else { + Logger.println("Загрузка расширения ${it.name} из интернета по ссылке ${it.path}") + loadExtension(it, env) + } + } + } + + private void buildExtension(Extension extension, String srcDir, String vrunnerPath, IStepExecutor steps) { + // ТУТ ГРЯЗНЫЙ ХАК + VRunner.exec("mkdir -p $EXTENSIONS_OUT_DIR") + // ТУТ КОНЕЦ ГРЯЗНОГО ХАКА + + def compileExtCommand = "$vrunnerPath compileexttocfe --src ${srcDir} --out $EXTENSIONS_OUT_DIR/${extension.name}.cfe" + List logosConfig = ["LOGOS_CONFIG=$config.logosConfig"] + steps.withEnv(logosConfig) { + VRunner.exec(compileExtCommand) + } + } + + private void loadExtension(Extension extension, def env) { + String pathToExtension = "$env.WORKSPACE/${EXTENSIONS_OUT_DIR}/${extension.name}.cfe" + FilePath localPathToExtension = FileUtils.getFilePath(pathToExtension) + localPathToExtension.copyFrom(new URL(extension.path)) + } + + + private String initVRunnerPath() { + return VRunner.getVRunnerPath() + } + + private String getSrcDir(Extension extension, String sourceDirName) { + if (config.sourceFormat == SourceFormat.EDT) { + return "${sourceDirName}/${extension.name}" + } else { + return "${sourceDirName}/${extension.path}" + } + } + + private void extractConvertedExtensions(String sourceDirName, IStepExecutor steps) { + if (config.sourceFormat == SourceFormat.EDT) { + // распакуем расширения + steps.unstash(EdtToDesignerFormatTransformation.EXTENSION_ZIP_STASH) + steps.unzip(sourceDirName, EdtToDesignerFormatTransformation.EXTENSION_ZIP) + } + } +} diff --git a/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy b/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy new file mode 100644 index 00000000..53be96c6 --- /dev/null +++ b/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy @@ -0,0 +1,55 @@ +package ru.pulsar.jenkins.library.steps + +import ru.pulsar.jenkins.library.IStepExecutor +import ru.pulsar.jenkins.library.configuration.JobConfiguration +import ru.pulsar.jenkins.library.configuration.InitInfoBaseOptions.Extension +import ru.pulsar.jenkins.library.ioc.ContextRegistry +import ru.pulsar.jenkins.library.utils.Logger +import ru.pulsar.jenkins.library.utils.VRunner +import hudson.FilePath +import ru.pulsar.jenkins.library.utils.FileUtils + +class LoadExtensions implements Serializable { + + private final JobConfiguration config; + + LoadExtensions(JobConfiguration config) { + this.config = config + } + + def run() { + IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() + + Logger.printLocation() + + def env = steps.env(); + String cfeDir = "$env.WORKSPACE/$GetExtensions.EXTENSIONS_OUT_DIR" + + String vrunnerPath = VRunner.getVRunnerPath(); + + config.initInfoBaseOptions.extensions.each { + Logger.println("Установим расширение ${it.name}") + loadExtension(it, vrunnerPath, steps, cfeDir) + } + } + + private void loadExtension (Extension extension, String vrunnerPath, IStepExecutor steps, String cfeDir) { + + String pathToExt = "$cfeDir/${extension.name}.cfe" + FilePath localPathToExt = FileUtils.getFilePath(pathToExt) + + // Команда загрузки расширения + String loadCommand = vrunnerPath + ' run --command "Путь=' + localPathToExt + ';ЗавершитьРаботуСистемы;" --execute ' + String executeParameter = '$runnerRoot/epf/ЗагрузитьРасширениеВРежимеПредприятия.epf' + if (steps.isUnix()) { + executeParameter = '\\' + executeParameter + } + loadCommand += executeParameter + loadCommand += ' --ibconnection "/F./build/ib"' + + List logosConfig = ["LOGOS_CONFIG=$config.logosConfig"] + steps.withEnv(logosConfig) { + VRunner.exec(loadCommand) + } + } +} diff --git a/vars/getExtensions.groovy b/vars/getExtensions.groovy new file mode 100644 index 00000000..12a79c82 --- /dev/null +++ b/vars/getExtensions.groovy @@ -0,0 +1,10 @@ +import ru.pulsar.jenkins.library.configuration.JobConfiguration +import ru.pulsar.jenkins.library.ioc.ContextRegistry +import ru.pulsar.jenkins.library.steps.GetExtensions + +def call(JobConfiguration config) { + ContextRegistry.registerDefaultContext(this) + + def getExtensions = new GetExtensions(config) + getExtensions.run() +} \ No newline at end of file diff --git a/vars/loadExtensions.groovy b/vars/loadExtensions.groovy new file mode 100644 index 00000000..78e8b766 --- /dev/null +++ b/vars/loadExtensions.groovy @@ -0,0 +1,10 @@ +import ru.pulsar.jenkins.library.configuration.JobConfiguration +import ru.pulsar.jenkins.library.ioc.ContextRegistry +import ru.pulsar.jenkins.library.steps.LoadExtensions + +def call(JobConfiguration config) { + ContextRegistry.registerDefaultContext(this) + + def loadExtensions = new LoadExtensions(config) + loadExtensions.run() +} \ No newline at end of file diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index 89faa801..23785161 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -76,10 +76,22 @@ void call() { } stages { + stage('Сборка из исходников'){ + when { + expression { config.needLoadExtensions() } + } + steps { + timeout(time: config.timeoutOptions.getBinaries, unit: TimeUnit.MINUTES) { + createDir('build/out/cfe') + // Соберем или загрузим cfe из исходников и положим их в папку build/out/cfe + getExtensions config + } + } + } stage('Создание ИБ') { steps { timeout(time: config.timeoutOptions.createInfoBase, unit: TimeUnit.MINUTES) { - createDir('build/out') + createDir('build/out/') script { if (config.infoBaseFromFiles()) { @@ -107,6 +119,18 @@ void call() { } } + stage('Загрузка расширений в конфигурацию'){ + when { + beforeAgent true + expression { config.needLoadExtensions() } + } + steps { + timeout(time: config.timeoutOptions.loadExtensions, unit: TimeUnit.MINUTES) { + loadExtensions config + } + } + } + stage('Архивация ИБ') { steps { timeout(time: config.timeoutOptions.zipInfoBase, unit: TimeUnit.MINUTES) { From c70b46191aaef0c22e77754eb2f44fb327972aaa Mon Sep 17 00:00:00 2001 From: ivanovEV Date: Fri, 19 Jan 2024 15:03:41 +0300 Subject: [PATCH 2/9] =?UTF-8?q?=D0=94=D0=BE=D0=BF=D0=B8=D0=B0=D0=BB=20?= =?UTF-8?q?=D1=80=D0=B8=D0=B4=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/README.md b/README.md index 0dd12c5c..3d177b34 100644 --- a/README.md +++ b/README.md @@ -128,6 +128,21 @@ pipeline1C() * Если информационная база нужна для запуска в режиме "Предприятие" (например, для шагов `bdd` или `smoke`), то будет запущен шаг "Миграция ИБ". * После загрузки конфигурации в ИБ будет выполняться запуск ИБ с целью запуска обработчиков обновления из БСП (`initInfobase` -> `runMigration`). * Если в настройках шага инициализации не заполнен массив дополнительных шагов миграции (`initInfobase` -> `additionalInitializationSteps`), но в каталоге `tools` присутствуют файлы с именами, удовлетворяющими шаблону `vrunner.init*.json`, то автоматически выполняется запуск `vrunner vanessa` с передачей найденных файлов в качестве значения настроек (параметр `--settings`) в порядке лексикографической сортировки имен файлов. +* Загрузка расширений в информационную базу + * Если у вас есть расширения которые необходимо загрузить в базу для проведения тестов и проверок, это можно сделать на этапе подготовки базы. + * При загрузке из исходников расширения должны быть в том же формате(edt или конфигуратора) что и основная конфигурация. + * Для загрузки расширений необходимо описать каждое из них в массиве (`initInfobase` -> `extensions`) + * Для каждого из расширений необходимо указать: + * Имя (`extensions` -> `name`) + * Способ получения (`extensions` -> `initMethod`) + + Сейчас поддерживаются 2 варианта: + * Из исходников(`fromSource`); + * Скачать cfe-файл из интернета (`fromInternet`) + * Путь до расширения (`extensions` -> `path`) + + * В случае загрузки из исходников - необходимо указать путь к исходникам расширения + * В случае загрузки из интернета - Укажите url по которому будет скачан cfe(Прим.: https://github.com/bia-technologies/yaxunit/releases/download/23.05/YAXUNIT-23.05.cfe) * BDD: * Если в конфигурационном файле проекта не заполнена настройка `bdd` -> `vrunnerSteps`, то автоматически выполняется запуск `vrunner vanessa --settings tools/vrunner.json`. * Дымовые тесты: From b2a7aee0ad1efe8e6d1b32839fab7f3f893080af Mon Sep 17 00:00:00 2001 From: ivanovEV Date: Fri, 19 Jan 2024 15:21:41 +0300 Subject: [PATCH 3/9] =?UTF-8?q?=D0=94=D0=BB=D1=8F=20=D1=82=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=BE=D0=B2=20=D0=BD=D0=BE=20=D0=BD=D0=B0=D1=83=D0=B3?= =?UTF-8?q?=D0=B0=D0=B4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 2 +- jenkinsResources/core-version.txt | 2 +- test/integration/groovy/jobConfigurationTest.groovy | 1 + test/integration/resources/jobConfiguration.json | 7 ++++++- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 14f2850e..7b6e22dd 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -48,7 +48,7 @@ dependencies { testImplementation("org.slf4j", "slf4j-api", slf4jVersion) testImplementation("org.slf4j", "slf4j-simple", slf4jVersion) - + // integration-tests integrationTestImplementation("org.spockframework", "spock-core", spockVersion) integrationTestImplementation("org.codehaus.groovy", "groovy-all", groovyVersion) diff --git a/jenkinsResources/core-version.txt b/jenkinsResources/core-version.txt index b8b8d1ea..efd56a90 100644 --- a/jenkinsResources/core-version.txt +++ b/jenkinsResources/core-version.txt @@ -1 +1 @@ -2.246 \ No newline at end of file +2.441 \ No newline at end of file diff --git a/test/integration/groovy/jobConfigurationTest.groovy b/test/integration/groovy/jobConfigurationTest.groovy index e3ded0b8..7418bccb 100644 --- a/test/integration/groovy/jobConfigurationTest.groovy +++ b/test/integration/groovy/jobConfigurationTest.groovy @@ -74,5 +74,6 @@ class jobConfigurationTest { rule.assertLogContains("v8version='8.3.12.1500'", run) rule.assertLogContains("sonarScannerToolName='sonar-scanner'", run) rule.assertLogContains("initMethod=FROM_SOURCE", run) + rule.assertLogContains("path='/src/cfe/тест'", run) } } \ No newline at end of file diff --git a/test/integration/resources/jobConfiguration.json b/test/integration/resources/jobConfiguration.json index e027b9f9..38b207a9 100644 --- a/test/integration/resources/jobConfiguration.json +++ b/test/integration/resources/jobConfiguration.json @@ -1,6 +1,11 @@ { "v8version": "8.3.12.1500", "initInfobase": { - "initMethod": "fromSource" + "initMethod": "fromSource", + "extensions": [{ + "name": "Тест", + "initMethod": "fromSource", + "path": "/src/cfe/тест" + }] } } \ No newline at end of file From 20c4bccb53a48136a52dd2b7ef8878cbfc641b09 Mon Sep 17 00:00:00 2001 From: ivanovEV Date: Fri, 19 Jan 2024 15:38:47 +0300 Subject: [PATCH 4/9] add filter --- src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy b/src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy index b891f4cb..ac8d5330 100644 --- a/src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy +++ b/src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy @@ -41,6 +41,9 @@ class GetExtensions implements Serializable { if (config.sourceFormat == SourceFormat.EDT) { sourceDirName = "$env.WORKSPACE/$EdtToDesignerFormatTransformation.EXTENSION_DIR" } + else { + sourceDirName = "$env.WORKSPACE" + } extractConvertedExtensions(sourceDirName, steps) config.initInfoBaseOptions.extensions.each { From e512a03e3f64d9b805ce1a9a73b97cd6547844d6 Mon Sep 17 00:00:00 2001 From: ivanovEV Date: Mon, 22 Jan 2024 07:05:48 +0300 Subject: [PATCH 5/9] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=80=D0=B8=D0=B4=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3d177b34..cea2670c 100644 --- a/README.md +++ b/README.md @@ -157,6 +157,7 @@ pipeline1C() * Выгрузка результатов в формат `jUnit` осуществляется в файл `./build/out/jUnit/syntax.xml` (`syntaxCheck` -> `pathToJUnitReport`). * Если в репозитории существует файл `./tools/syntax-check-exception-file.txt`, то команде запуска синтаксического контроля конфигурации данный файл будет передаваться как файл с исключениями сообщений об ошибках (параметр `--exception-file`) (`syntaxCheck` -> `exceptionFile`). * Конфигурационный файл по умолчанию уже содержит ряд "режимов проверки" для синтаксического контроля конфигурации (`syntaxCheck` -> `checkModes`). + * Если вы хотите провести синтаксический контроль для расширения воспользуйтесь режимом проверки `-Extension <Имя расширения>`, или же `-AllExtensions` для проверки всех расширений. * Трансформация результатов валидации EDT: * По умолчанию из результатов анализа исключаются замечания, сработавшие на модулях с включенным запретом редактирования (желтый куб с замком) (параметры `resultsTransform` -> `removeSupport` и `resultsTransform` -> `supportLevel`). * Анализ SonarQube: From 4d7efed5f07c288aa632451c11cc2e91f9c728d4 Mon Sep 17 00:00:00 2001 From: ivanovEV Date: Mon, 22 Jan 2024 07:30:18 +0300 Subject: [PATCH 6/9] =?UTF-8?q?=D0=9F=D0=BE=D0=BC=D0=B5=D0=BD=D1=8F=D0=BB?= =?UTF-8?q?=20=D1=85=D0=B0=D0=BA=20=D0=BD=D0=B0=20=D0=BD=D0=BE=D1=80=D0=BC?= =?UTF-8?q?=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=BC=D0=B5=D1=82=D0=BE?= =?UTF-8?q?=D0=B4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy b/src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy index ac8d5330..422985f7 100644 --- a/src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy +++ b/src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy @@ -30,14 +30,11 @@ class GetExtensions implements Serializable { steps.installLocalDependencies(); - String vrunnerPath = initVRunnerPath(); - Logger.println("Сборка расширений") String sourceDirName = "" - if (config.sourceFormat == SourceFormat.EDT) { sourceDirName = "$env.WORKSPACE/$EdtToDesignerFormatTransformation.EXTENSION_DIR" } @@ -46,6 +43,8 @@ class GetExtensions implements Serializable { } extractConvertedExtensions(sourceDirName, steps) + steps.createDir(EXTENSIONS_OUT_DIR) + config.initInfoBaseOptions.extensions.each { if (it.initMethod == InitMethod.SOURCE) { Logger.println("Сборка расширения ${it.name} из исходников") @@ -59,9 +58,6 @@ class GetExtensions implements Serializable { } private void buildExtension(Extension extension, String srcDir, String vrunnerPath, IStepExecutor steps) { - // ТУТ ГРЯЗНЫЙ ХАК - VRunner.exec("mkdir -p $EXTENSIONS_OUT_DIR") - // ТУТ КОНЕЦ ГРЯЗНОГО ХАКА def compileExtCommand = "$vrunnerPath compileexttocfe --src ${srcDir} --out $EXTENSIONS_OUT_DIR/${extension.name}.cfe" List logosConfig = ["LOGOS_CONFIG=$config.logosConfig"] From ea96d9703cd7fd7bc6743791a44cba5d908ff32a Mon Sep 17 00:00:00 2001 From: ivanovEV Date: Mon, 22 Jan 2024 07:39:17 +0300 Subject: [PATCH 7/9] =?UTF-8?q?=D0=92=20=D0=BF=D1=80=D0=B5=D0=B4=D1=8B?= =?UTF-8?q?=D0=B4=D1=83=D1=89=D0=B5=D0=B9=20=D0=B8=D1=82=D0=B5=D1=80=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B8=20=D0=BD=D0=B5=20=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0=D0=B5=D1=82,=20=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE?= =?UTF-8?q?=D0=B6=D0=BD=D0=BE=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=B5=D1=82?= =?UTF-8?q?=D1=81=D1=8F=20=D0=B0=D0=B1=D1=81=D0=BE=D0=BB=D1=8E=D1=82=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9=20=D0=BF=D1=83=D1=82=D1=8C,=20=D0=B0=20=D0=BD?= =?UTF-8?q?=D0=B5=20=D0=BE=D1=82=D0=BD=D0=BE=D1=81=D0=B8=D1=82=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D1=8B=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy b/src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy index 422985f7..772a8258 100644 --- a/src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy +++ b/src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy @@ -43,7 +43,7 @@ class GetExtensions implements Serializable { } extractConvertedExtensions(sourceDirName, steps) - steps.createDir(EXTENSIONS_OUT_DIR) + steps.createDir("${env.WORKSPACE}/${EXTENSIONS_OUT_DIR}") config.initInfoBaseOptions.extensions.each { if (it.initMethod == InitMethod.SOURCE) { @@ -58,6 +58,9 @@ class GetExtensions implements Serializable { } private void buildExtension(Extension extension, String srcDir, String vrunnerPath, IStepExecutor steps) { + // ТУТ ГРЯЗНЫЙ ХАК + VRunner.exec("mkdir -p $EXTENSIONS_OUT_DIR") + // ТУТ КОНЕЦ ГРЯЗНОГО ХАКА def compileExtCommand = "$vrunnerPath compileexttocfe --src ${srcDir} --out $EXTENSIONS_OUT_DIR/${extension.name}.cfe" List logosConfig = ["LOGOS_CONFIG=$config.logosConfig"] From ea98885829913b48c9e6168035a5f429593dfb92 Mon Sep 17 00:00:00 2001 From: ivanovEV Date: Mon, 22 Jan 2024 07:53:50 +0300 Subject: [PATCH 8/9] =?UTF-8?q?=D0=92=20=D0=BF=D1=80=D0=B5=D0=B4=D1=8B?= =?UTF-8?q?=D0=B4=D1=83=D1=89=D0=B5=D0=B9=20=D0=B8=D1=82=D0=B5=D1=80=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B8=20=D0=BD=D0=B5=20=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0=D0=B5=D1=82,=20=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE?= =?UTF-8?q?=D0=B6=D0=BD=D0=BE=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=B5=D1=82?= =?UTF-8?q?=D1=81=D1=8F=20=D0=B0=D0=B1=D1=81=D0=BE=D0=BB=D1=8E=D1=82=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9=20=D0=BF=D1=83=D1=82=D1=8C,=20=D0=B0=20=D0=BD?= =?UTF-8?q?=D0=B5=20=D0=BE=D1=82=D0=BD=D0=BE=D1=81=D0=B8=D1=82=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D1=8B=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy b/src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy index 772a8258..91bbe28a 100644 --- a/src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy +++ b/src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy @@ -58,9 +58,6 @@ class GetExtensions implements Serializable { } private void buildExtension(Extension extension, String srcDir, String vrunnerPath, IStepExecutor steps) { - // ТУТ ГРЯЗНЫЙ ХАК - VRunner.exec("mkdir -p $EXTENSIONS_OUT_DIR") - // ТУТ КОНЕЦ ГРЯЗНОГО ХАКА def compileExtCommand = "$vrunnerPath compileexttocfe --src ${srcDir} --out $EXTENSIONS_OUT_DIR/${extension.name}.cfe" List logosConfig = ["LOGOS_CONFIG=$config.logosConfig"] From 9f279c0415b350eddf2fdb11324eef87588887e6 Mon Sep 17 00:00:00 2001 From: ivanovEV Date: Mon, 22 Jan 2024 07:56:55 +0300 Subject: [PATCH 9/9] =?UTF-8?q?=D0=9D=D0=B5=D1=82,=20=D1=82=D0=B0=D0=BA=20?= =?UTF-8?q?=D1=82=D0=BE=D0=B6=D0=B5=20=D0=BD=D0=B5=20=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=B0=D0=B5=D1=82=20)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy b/src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy index 91bbe28a..42f37ec5 100644 --- a/src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy +++ b/src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy @@ -43,8 +43,6 @@ class GetExtensions implements Serializable { } extractConvertedExtensions(sourceDirName, steps) - steps.createDir("${env.WORKSPACE}/${EXTENSIONS_OUT_DIR}") - config.initInfoBaseOptions.extensions.each { if (it.initMethod == InitMethod.SOURCE) { Logger.println("Сборка расширения ${it.name} из исходников") @@ -58,6 +56,9 @@ class GetExtensions implements Serializable { } private void buildExtension(Extension extension, String srcDir, String vrunnerPath, IStepExecutor steps) { + // ТУТ ГРЯЗНЫЙ ХАК + VRunner.exec("mkdir -p $EXTENSIONS_OUT_DIR") + // ТУТ КОНЕЦ ГРЯЗНОГО ХАКА def compileExtCommand = "$vrunnerPath compileexttocfe --src ${srcDir} --out $EXTENSIONS_OUT_DIR/${extension.name}.cfe" List logosConfig = ["LOGOS_CONFIG=$config.logosConfig"]