From 571b37b054e35edb20708efd4b9884c926ee3e25 Mon Sep 17 00:00:00 2001 From: Dima Date: Fri, 30 Aug 2024 19:34:56 +0300 Subject: [PATCH] new json schema generator defaults for enums --- build.gradle.kts | 4 + resources/schema.json | 686 +++++++++--------- src/JobConfigurationSchemaGenerator.java | 43 +- .../configuration/InitInfoBaseOptions.groovy | 2 + .../configuration/JobConfiguration.groovy | 33 +- .../ResultsTransformOptions.groovy | 5 +- .../configuration/SonarQubeOptions.groovy | 6 +- .../sonarqube/GenericIssueFormat.groovy | 2 - .../ConfigurationReaderTest.java | 2 +- test/unit/resources/jobConfiguration.json | 2 +- 10 files changed, 400 insertions(+), 385 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index a731a1da..a8f141db 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -43,6 +43,10 @@ dependencies { // jackson implementation("com.fasterxml.jackson.module", "jackson-module-jsonSchema", jacksonVersion) + // jsonschema-generator + implementation("com.github.victools", "jsonschema-generator", "4.36.0") + implementation("com.github.victools", "jsonschema-module-jackson", "4.36.0") + // unit-tests testImplementation("org.junit.jupiter", "junit-jupiter-api", junitVersion) testRuntimeOnly("org.junit.jupiter", "junit-jupiter-engine", junitVersion) diff --git a/resources/schema.json b/resources/schema.json index 8a433eef..a1c89a0f 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -1,284 +1,337 @@ { - "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" - }, - "srcDir" : { - "type" : "string", - "description" : "Путь к корневому каталогу с исходниками конфигурации, в случае хранения исходников в формате EDT, необходимо указать путь к проекту" - }, - "sourceFormat" : { - "type" : "string", - "description" : "Формат исходников конфигурации", - "enum" : [ "edt", "designer" ] - }, - "defaultBranch" : { - "type" : "string", - "description" : "Имя ветки по умолчанию. Значение по умолчанию - main." - }, - "secrets" : { + "$schema" : "http://json-schema.org/draft-07/schema#", + "definitions" : { + "EmailExtConfiguration" : { "type" : "object", - "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:Secrets", - "description" : "Идентификаторы сохраненных секретов", "properties" : { - "storagePath" : { - "type" : "string", - "description" : "Путь к хранилищу конфигурации" - }, - "storage" : { - "type" : "string", - "description" : "Данные авторизации в хранилище конфигурации" + "attachLog" : { + "type" : "boolean" }, - "telegramChatId" : { - "type" : "string", - "description" : "Идентификатор telegram-чата для отправки уведомлений" + "directRecipients" : { + "type" : "array", + "items" : { + "type" : "string" + } }, - "telegramBotToken" : { - "type" : "string", - "description" : "Токен авторизации telegram-бота для отправки уведомлений" + "recipientProviders" : { + "type" : "array", + "items" : { + "type" : "string", + "enum" : [ "developers", "requestor", "brokenBuildSuspects", "brokenTestsSuspects" ] + } } } - }, - "stages" : { + } + }, + "type" : "object", + "properties" : { + "bdd" : { "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" : "Дымовые тесты включены" - }, - "yaxunit" : { - "type" : "boolean", - "description" : "Запуск YAXUnit тестов включен" - }, - "initSteps" : { - "type" : "boolean", - "description" : "Предварительные шаги инициализации включены" - }, - "bdd" : { - "type" : "boolean", - "description" : "Запуск BDD сценариев включен" - }, - "email" : { - "type" : "boolean", - "description" : "Выполнять рассылку результатов сборки на email" - }, - "telegram" : { - "type" : "boolean", - "description" : "Выполнять рассылку результатов сборки в telegram" + "vrunnerSteps" : { + "description" : "Шаги, запускаемые через vrunner.\n В каждой строке передается отдельная команда \n vrunner и ее аргументы (например, \"vanessa --settings ./tools/vrunner.json\").\n По умолчанию содержит одну команду \"vanessa --settings ./tools/vrunner.json\".\n ", + "type" : "array", + "items" : { + "type" : "string" + } } - } + }, + "description" : "Настройки шага запуска BDD сценариев" }, - "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 " - }, - "loadConfiguration" : { - "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 " - }, - "yaxunit" : { - "type" : "integer", - "description" : "Таймаут шага YAXUnit тестов, в минутах.\n По умолчанию содержит значение 240.\n " - }, - "sonarqube" : { - "type" : "integer", - "description" : "Таймаут шага статического анализа SonarQube, в минутах.\n По умолчанию содержит значение 90.\n " - } - } + "defaultBranch" : { + "type" : "string", + "description" : "Имя ветки по умолчанию. Значение по умолчанию - main." + }, + "edtVersion" : { + "type" : "string", + "description" : "Версия модуля 1C:Enterprise Development Tools формате xxxx.x.x:x86_64" }, "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 ", + "type" : "array", "items" : { "type" : "string" } }, - "vrunnerSettings" : { - "type" : "string", - "description" : "Путь к конфигурационному файлу vanessa-runner.\n По умолчанию содержит значение \"./tools/vrunner.json\"\n Используется, если на этапе подготовки база загружается из эталона. \n " - }, - "templateDBPath" : { - "type" : "string", - "description" : "\n Путь к файлу эталонной базы данных.\n * По умолчанию не заполнен;\n * Указывается путь к файлу *.dt или *.1CD.\n " - }, "extensions" : { - "type" : "array", "description" : "Массив расширений для загрузки в конфигурацию.", + "type" : "array", "items" : { "type" : "object", - "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:InitInfoBaseOptions:Extension", "properties" : { - "name" : { + "initMethod" : { "type" : "string", - "description" : "Имя расширения, используемое при его загрузке в конфигурацию." + "enum" : [ "fromSource", "fromFile" ], + "description" : "\n Способ инициализации расширения.\n Поддерживается два варианта:\n * fromSource - инициализация расширения из исходников;\n * fromFile - скачивание скомпилированного cfe по ссылке.\n " }, - "initMethod" : { + "name" : { "type" : "string", - "description" : "\n Способ инициализации расширения.\n Поддерживается два варианта:\n * fromSource - инициализация расширения из исходников;\n * fromFile - скачивание скомпилированного cfe по ссылке.\n ", - "enum" : [ "fromSource", "fromFile" ] + "description" : "Имя расширения, используемое при его загрузке в конфигурацию." }, "path" : { "type" : "string", "description" : "\n Путь к расширению.\n * В случае если выбран initMethod - указывается путь к исходникам расширения.\n * В случае если выбран initMethod - указывается путь к cfe-файлу\n " }, "stages" : { - "type" : "array", "description" : "\n Шаги, на которых необходимо использовать расширение\n * Если не заполнено, то расширение будет подключено при инициализации базы и останется в базе на всех последующих шагах.\n * Если заполнено, то расширение будет подключено только на соответствующих шагах.\n ", + "type" : "array", "items" : { "type" : "string" } } } } + }, + "initMethod" : { + "type" : "string", + "enum" : [ "fromStorage", "fromSource", "defaultBranchFromStorage" ], + "description" : "\n Способ инициализации информационной базы.\n Поддерживается три варианта:\n * fromStorage - инициализация информационной базы из хранилища конфигурации;\n * fromSource - инициализация информационной базы из исходников конфигурации;\n * defaultBranchFromStorage - инициализация основной ветки из хранилища конфигурации, остальных - из исходников конфигурации.\n По умолчанию содержит значение \"fromStorage\".", + "default" : "fromStorage" + }, + "runMigration" : { + "type" : "boolean", + "description" : "Запустить миграцию ИБ" + }, + "templateDBPath" : { + "type" : "string", + "description" : "\n Путь к файлу эталонной базы данных.\n * По умолчанию не заполнен;\n * Указывается путь к файлу *.dt или *.1CD.\n " + }, + "vrunnerSettings" : { + "type" : "string", + "description" : "Путь к конфигурационному файлу vanessa-runner.\n По умолчанию содержит значение \"./tools/vrunner.json\"\n Используется, если на этапе подготовки база загружается из эталона. \n " } - } + }, + "description" : "Настройки шага инициализации ИБ" }, - "bdd" : { + "logosConfig" : { + "type" : "string", + "description" : "Конфигурация библиотеки logos. Применяется перед запуском каждой стадии сборки" + }, + "notifications" : { "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" - } + "email" : { + "type" : "object", + "properties" : { + "alwaysOptions" : { + "$ref" : "#/definitions/EmailExtConfiguration" + }, + "failureOptions" : { + "$ref" : "#/definitions/EmailExtConfiguration" + }, + "onAlways" : { + "type" : "boolean", + "description" : "Отправлять всегда" + }, + "onFailure" : { + "type" : "boolean", + "description" : "Отправлять при падении сборки" + }, + "onSuccess" : { + "type" : "boolean", + "description" : "Отправлять при успешной сборке" + }, + "onUnstable" : { + "type" : "boolean", + "description" : "Отправлять при нестабильной сборке" + }, + "successOptions" : { + "$ref" : "#/definitions/EmailExtConfiguration" + }, + "unstableOptions" : { + "$ref" : "#/definitions/EmailExtConfiguration" + } + }, + "description" : "Настройки рассылки результатов сборки через email" + }, + "telegram" : { + "type" : "object", + "properties" : { + "onAlways" : { + "type" : "boolean", + "description" : "Отправлять всегда" + }, + "onFailure" : { + "type" : "boolean", + "description" : "Отправлять при падении сборки" + }, + "onSuccess" : { + "type" : "boolean", + "description" : "Отправлять при успешной сборке" + }, + "onUnstable" : { + "type" : "boolean", + "description" : "Отправлять при нестабильной сборке" + } + }, + "description" : "Настройки рассылки результатов сборки через telegram" + } + }, + "description" : "Настройки рассылки результатов сборки" + }, + "resultsTransform" : { + "type" : "object", + "properties" : { + "genericIssueFormat" : { + "type" : "string", + "enum" : [ "Generic_Issue", "Generic_Issue_10_3" ], + "description" : "Формат отчета generic issue. Только для stebi.\n Для SonarQube версии ниже 10.3 необходимо использовать Generic_Issue.\n По умолчанию Generic_Issue_10_3\n ", + "default" : "Generic_Issue_10_3" + }, + "removeSupport" : { + "type" : "boolean", + "description" : "Фильтровать замечания по уровню поддержки модуля. Только для stebi. По умолчанию включено." + }, + "supportLevel" : { + "type" : "integer", + "description" : "Настройка фильтрации замечаний по уровню поддержки. Только для stebi.\n 0 - удалить файлы на замке;\n 1 - удалить файлы на замке и на поддержке;\n 2 - удалить файлы на замке, на поддержке и снятые с поддержки.\n " + }, + "transformer" : { + "type" : "string", + "enum" : [ "stebi", "edt-ripper" ], + "description" : "Способ преобразования замечаний.\n Поддерживается stebi и edt-ripper.\n По умолчанию содержит значение \"stebi\".\n ", + "default" : "stebi" + } + }, + "description" : "Настройки трансформации результатов анализа" + }, + "secrets" : { + "type" : "object", + "properties" : { + "storage" : { + "type" : "string", + "description" : "Данные авторизации в хранилище конфигурации" + }, + "storagePath" : { + "type" : "string", + "description" : "Путь к хранилищу конфигурации" + }, + "telegramBotToken" : { + "type" : "string", + "description" : "Токен авторизации telegram-бота для отправки уведомлений" + }, + "telegramChatId" : { + "type" : "string", + "description" : "Идентификатор telegram-чата для отправки уведомлений" + } + }, + "description" : "Идентификаторы сохраненных секретов" + }, + "smoke" : { + "type" : "object", + "properties" : { + "publishToAllureReport" : { + "type" : "boolean", + "description" : "Выполнять публикацию результатов в отчет Allure.\n По умолчанию выключено.\n " + }, + "publishToJUnitReport" : { + "type" : "boolean", + "description" : "Выполнять публикацию результатов в отчет JUnit.\n По умолчанию включено.\n " + }, + "vrunnerSettings" : { + "type" : "string", + "description" : "Путь к конфигурационному файлу vanessa-runner.\n По умолчанию содержит значение \"./tools/vrunner.json\".\n " + }, + "xddConfigPath" : { + "type" : "string", + "description" : "Путь к конфигурационному файлу для xddTestRunner.\n По умолчанию содержит значение \"./tools/xUnitParams.json\".\n " } - } + }, + "description" : "Настройки дымового тестирования" }, "sonarqube" : { "type" : "object", - "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:SonarQubeOptions", - "description" : "Настройки анализа SonarQube", "properties" : { + "branchAnalysisConfiguration" : { + "type" : "string", + "enum" : [ "auto", "fromEnv" ], + "description" : "Вариант конфигурации branch plugin.\n Поддерживаемые варианты:\n * auto - применяется автоконфигурация sonar-scanner силами branchplugin. Так же может применяться для отключения конфигурирования, если branch plugin отсутствует;\n * fromEnv - применяется ручная конфигурация sonar-scanner на основе переменных среды.\n Значение по умолчанию: fromEnv.", + "default" : "auto" + }, + "infoBaseUpdateModuleName" : { + "type" : "string", + "description" : "Имя общего модуля (например, ОбновлениеИнформационнойБазыXXX), в котором указана версия библиотеки.\n Версия должна задаваться в виде присвоения `Описание.Версия = \"ваш номер версии\";`\n " + }, "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" ] + "useSonarScannerFromPath" : { + "type" : "boolean", + "description" : "Использовать sonar-scanner, доступный в PATH" }, "waitForQualityGate" : { "type" : "boolean", "description" : "Ожидать состояние Quality Gate от SonarQube после загрузки анализа. По умолчанию `false`.\n Таймаут ожидания состояния равен таймауту шага.\n " } - } + }, + "description" : "Настройки анализа SonarQube" }, - "syntaxCheck" : { + "sourceFormat" : { + "type" : "string", + "enum" : [ "edt", "designer" ], + "description" : "Формат исходников конфигурации", + "default" : "designer" + }, + "srcDir" : { + "type" : "string", + "description" : "Путь к корневому каталогу с исходниками конфигурации, в случае хранения исходников в формате EDT, необходимо указать путь к проекту" + }, + "stages" : { "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 " + "bdd" : { + "type" : "boolean", + "description" : "Запуск BDD сценариев включен" }, - "groupErrorsByMetadata" : { + "edtValidate" : { "type" : "boolean", - "description" : "Группировать выявленные ошибки по объектам метаданных.\n По умолчанию включено.\n " + "description" : "Валидация EDT включена" + }, + "email" : { + "type" : "boolean", + "description" : "Выполнять рассылку результатов сборки на email" + }, + "initSteps" : { + "type" : "boolean", + "description" : "Предварительные шаги инициализации включены" + }, + "smoke" : { + "type" : "boolean", + "description" : "Дымовые тесты включены" }, + "sonarqube" : { + "type" : "boolean", + "description" : "Анализ SonarQube включен" + }, + "syntaxCheck" : { + "type" : "boolean", + "description" : "Синтаксический контроль включен" + }, + "telegram" : { + "type" : "boolean", + "description" : "Выполнять рассылку результатов сборки в telegram" + }, + "yaxunit" : { + "type" : "boolean", + "description" : "Запуск YAXUnit тестов включен" + } + }, + "description" : "Включение этапов сборок" + }, + "syntaxCheck" : { + "type" : "object", + "properties" : { "checkModes" : { - "type" : "array", "description" : "Режимы проверки конфигурации", + "type" : "array", "items" : { "type" : "string" } @@ -287,44 +340,94 @@ "type" : "string", "description" : "Путь к файлу с указанием пропускаемых ошибок.\n Формат файла: в каждой строке файла указан текст пропускаемого исключения или его часть\n Кодировка: UTF-8\n " }, + "groupErrorsByMetadata" : { + "type" : "boolean", + "description" : "Группировать выявленные ошибки по объектам метаданных.\n По умолчанию включено.\n " + }, + "pathToJUnitReport" : { + "type" : "string", + "description" : "Путь к файлу отчета jUnit\n По умолчанию содержит значение \"./build/out/jUnit/syntax.xml\"\n " + }, "vrunnerSettings" : { "type" : "string", "description" : "Путь к конфигурационному файлу vanessa-runner.\n По умолчанию содержит значение \"./tools/vrunner.json\".\n " } - } + }, + "description" : "Настройки синтаксического контроля" }, - "smoke" : { + "timeout" : { "type" : "object", - "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:SmokeTestOptions", - "description" : "Настройки дымового тестирования", "properties" : { - "vrunnerSettings" : { - "type" : "string", - "description" : "Путь к конфигурационному файлу vanessa-runner.\n По умолчанию содержит значение \"./tools/vrunner.json\".\n " + "bdd" : { + "type" : "integer", + "description" : "Таймаут шага проверки сценариев поведения, в минутах.\n По умолчанию содержит значение 120.\n " }, - "xddConfigPath" : { - "type" : "string", - "description" : "Путь к конфигурационному файлу для xddTestRunner.\n По умолчанию содержит значение \"./tools/xUnitParams.json\".\n " + "createInfoBase" : { + "type" : "integer", + "description" : "Таймаут шага создания информационной базы, в минутах.\n По умолчанию содержит значение 60.\n " }, - "publishToAllureReport" : { - "type" : "boolean", - "description" : "Выполнять публикацию результатов в отчет Allure.\n По умолчанию выключено.\n " + "designerToEdtFormatTransformation" : { + "type" : "integer", + "description" : "Таймаут шага трансформации исходников из формата Конфигуратора в формат EDT, в минутах.\n По умолчанию содержит значение 60.\n " }, - "publishToJUnitReport" : { - "type" : "boolean", - "description" : "Выполнять публикацию результатов в отчет JUnit.\n По умолчанию включено.\n " + "edtToDesignerFormatTransformation" : { + "type" : "integer", + "description" : "Таймаут шага трансформации исходников из формата EDT в формат Конфигуратора, в минутах.\n По умолчанию содержит значение 60.\n " + }, + "edtValidate" : { + "type" : "integer", + "description" : "Таймаут шага валидации EDT, в минутах.\n По умолчанию содержит значение 240.\n " + }, + "getBinaries" : { + "type" : "integer", + "description" : "Таймаут шага получения бинарников, в минутах.\n По умолчанию содержит значение 60.\n " + }, + "initInfoBase" : { + "type" : "integer", + "description" : "Таймаут шага инициализации информационной базы, в минутах.\n По умолчанию содержит значение 60.\n " + }, + "loadConfiguration" : { + "type" : "integer", + "description" : "Таймаут шага загрузки конфигурации в базу, в минутах.\n По умолчанию содержит значение 60.\n " + }, + "loadExtensions" : { + "type" : "integer", + "description" : "Таймаут шага загрузки расширений в базу, в минутах.\n По умолчанию содержит значение 60.\n " + }, + "resultTransformation" : { + "type" : "integer", + "description" : "Таймаут шага трансформации результатов EDT, в минутах.\n По умолчанию содержит значение 10.\n " + }, + "smoke" : { + "type" : "integer", + "description" : "Таймаут шага дымовых тестов, в минутах.\n По умолчанию содержит значение 240.\n " + }, + "sonarqube" : { + "type" : "integer", + "description" : "Таймаут шага статического анализа SonarQube, в минутах.\n По умолчанию содержит значение 90.\n " + }, + "syntaxCheck" : { + "type" : "integer", + "description" : "Таймаут шага синтаксического контроля, в минутах.\n По умолчанию содержит значение 240.\n " + }, + "yaxunit" : { + "type" : "integer", + "description" : "Таймаут шага YAXUnit тестов, в минутах.\n По умолчанию содержит значение 240.\n " + }, + "zipInfoBase" : { + "type" : "integer", + "description" : "Таймаут шага архивирования информационной базы, в минутах.\n По умолчанию содержит значение 60.\n " } - } + }, + "description" : "Настройка таймаутов для шагов" + }, + "v8version" : { + "type" : "string", + "description" : "Версия платформы 1С:Предприятие в формате 8.3.хх.хххх." }, "yaxunit" : { "type" : "object", - "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:YaxunitOptions", - "description" : "Настройки YAXUnit", "properties" : { - "vrunnerSettings" : { - "type" : "string", - "description" : "Путь к конфигурационному файлу vanessa-runner.\n По умолчанию содержит значение \"./tools/vrunner.json\".\n " - }, "configPath" : { "type" : "string", "description" : "Путь к конфигурационному файлу YAXUnit.\n По умолчанию содержит значение \"./tools/yaxunit.json\".\n " @@ -336,124 +439,13 @@ "publishToJUnitReport" : { "type" : "boolean", "description" : "Выполнять публикацию результатов в отчет JUnit.\n По умолчанию включено.\n " - } - } - }, - "resultsTransform" : { - "type" : "object", - "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:ResultsTransformOptions", - "description" : "Настройки трансформации результатов анализа", - "properties" : { - "transformer" : { - "type" : "string", - "description" : "Способ преобразования замечаний.\n Поддерживается stebi и edt-ripper.\n По умолчанию содержит значение \"stebi\".\n ", - "enum" : [ "stebi", "edt-ripper" ] - }, - "removeSupport" : { - "type" : "boolean", - "description" : "Фильтровать замечания по уровню поддержки модуля. Только для stebi. По умолчанию включено." - }, - "supportLevel" : { - "type" : "integer", - "description" : "Настройка фильтрации замечаний по уровню поддержки. Только для stebi.\n 0 - удалить файлы на замке;\n 1 - удалить файлы на замке и на поддержке;\n 2 - удалить файлы на замке, на поддержке и снятые с поддержки.\n " }, - "genericIssueFormat" : { + "vrunnerSettings" : { "type" : "string", - "description" : "Формат отчета generic issue. Только для stebi.\n Для SonarQube старее 10.3 необходимо использовать Generic_Issue.\n По умолчанию Generic_Issue_10_3\n ", - "enum" : [ "Generic_Issue", "Generic_Issue_10_3" ] - } - } - }, - "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" : "Отправлять при успешной сборке" - }, - "onFailure" : { - "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" - }, - "directRecipients" : { - "type" : "array", - "items" : { - "type" : "string" - } - }, - "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" - }, - "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" - } - } - }, - "telegram" : { - "type" : "object", - "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:TelegramNotificationOptions", - "description" : "Настройки рассылки результатов сборки через telegram", - "properties" : { - "onAlways" : { - "type" : "boolean", - "description" : "Отправлять всегда" - }, - "onSuccess" : { - "type" : "boolean", - "description" : "Отправлять при успешной сборке" - }, - "onFailure" : { - "type" : "boolean", - "description" : "Отправлять при падении сборки" - }, - "onUnstable" : { - "type" : "boolean", - "description" : "Отправлять при нестабильной сборке" - } - } + "description" : "Путь к конфигурационному файлу vanessa-runner.\n По умолчанию содержит значение \"./tools/vrunner.json\".\n " } - } - }, - "logosConfig" : { - "type" : "string", - "description" : "Конфигурация библиотеки logos. Применяется перед запуском каждой стадии сборки" + }, + "description" : "Настройки YAXUnit" } } } \ No newline at end of file diff --git a/src/JobConfigurationSchemaGenerator.java b/src/JobConfigurationSchemaGenerator.java index 0a542b05..c272bb58 100644 --- a/src/JobConfigurationSchemaGenerator.java +++ b/src/JobConfigurationSchemaGenerator.java @@ -1,27 +1,40 @@ -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.module.jsonSchema.JsonSchema; -import com.fasterxml.jackson.module.jsonSchema.JsonSchemaGenerator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.JsonNode; +import com.github.victools.jsonschema.generator.OptionPreset; +import com.github.victools.jsonschema.generator.SchemaGenerator; +import com.github.victools.jsonschema.generator.SchemaGeneratorConfigBuilder; +import com.github.victools.jsonschema.generator.SchemaVersion; +import com.github.victools.jsonschema.module.jackson.JacksonModule; + +import com.github.victools.jsonschema.module.jackson.JacksonOption; import ru.pulsar.jenkins.library.configuration.JobConfiguration; -import java.io.File; -import java.io.StringWriter; +import java.io.BufferedWriter; +import java.io.FileWriter; +import java.io.IOException; public class JobConfigurationSchemaGenerator { public static void main(String[] args) throws Exception { - ObjectMapper mapper = new ObjectMapper(); - JsonSchemaGenerator generator = new JsonSchemaGenerator(mapper); - JsonSchema jsonSchema = generator.generateSchema(JobConfiguration.class); - StringWriter json = new StringWriter(); - mapper.configure(SerializationFeature.INDENT_OUTPUT, true); - mapper.writeValue(json, jsonSchema); + SchemaGeneratorConfigBuilder configBuilder = new SchemaGeneratorConfigBuilder(SchemaVersion.DRAFT_7, OptionPreset.PLAIN_JSON) + .with(new JacksonModule(JacksonOption.FLATTENED_ENUMS_FROM_JSONVALUE, JacksonOption.FLATTENED_ENUMS_FROM_JSONPROPERTY)); + + configBuilder.forFields().withDefaultResolver(field -> { + JsonProperty annotation = field.getAnnotationConsideringFieldAndGetter(JsonProperty.class); + return annotation == null || annotation.defaultValue().isEmpty() ? null : annotation.defaultValue(); + }); - File jsonSchemaFile = new File("./resources/schema.json"); - mapper.writeValue(jsonSchemaFile, jsonSchema); + SchemaGenerator generator = new SchemaGenerator(configBuilder.build()); + JsonNode jsonSchema = generator.generateSchema(JobConfiguration.class); - System.out.println(json); + String outputPath = "./resources/schema.json"; + try (BufferedWriter writer = new BufferedWriter(new FileWriter(outputPath))) { + writer.write(jsonSchema.toPrettyString()); + System.out.println(jsonSchema.toPrettyString()); + } catch (IOException e) { + e.printStackTrace(); + } } } diff --git a/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy index 46ba640e..32f7ca9f 100644 --- a/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy @@ -2,6 +2,7 @@ package ru.pulsar.jenkins.library.configuration import com.cloudbees.groovy.cps.NonCPS import com.fasterxml.jackson.annotation.JsonIgnoreProperties +import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonPropertyDescription @JsonIgnoreProperties(ignoreUnknown = true) @@ -14,6 +15,7 @@ class InitInfoBaseOptions implements Serializable { * fromSource - инициализация информационной базы из исходников конфигурации; * defaultBranchFromStorage - инициализация основной ветки из хранилища конфигурации, остальных - из исходников конфигурации. По умолчанию содержит значение "fromStorage".""") + @JsonProperty(defaultValue = "fromStorage") InitInfoBaseMethod initMethod = InitInfoBaseMethod.FROM_STORAGE @JsonPropertyDescription("Запустить миграцию ИБ") diff --git a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy index 8330abe6..3175d42f 100644 --- a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy @@ -19,57 +19,58 @@ class JobConfiguration implements Serializable { String srcDir @JsonPropertyDescription("Формат исходников конфигурации") - SourceFormat sourceFormat; + @JsonProperty(defaultValue = "designer") + SourceFormat sourceFormat @JsonProperty("stages") @JsonPropertyDescription("Включение этапов сборок") - StageFlags stageFlags; + StageFlags stageFlags @JsonProperty("timeout") @JsonPropertyDescription("Настройка таймаутов для шагов") - TimeoutOptions timeoutOptions; + TimeoutOptions timeoutOptions @JsonPropertyDescription("Имя ветки по умолчанию. Значение по умолчанию - main.") String defaultBranch @JsonPropertyDescription("Идентификаторы сохраненных секретов") - Secrets secrets; + Secrets secrets @JsonProperty("initInfobase") @JsonPropertyDescription("Настройки шага инициализации ИБ") - InitInfoBaseOptions initInfoBaseOptions; + InitInfoBaseOptions initInfoBaseOptions @JsonProperty("bdd") @JsonPropertyDescription("Настройки шага запуска BDD сценариев") - BddOptions bddOptions; + BddOptions bddOptions @JsonProperty("sonarqube") @JsonPropertyDescription("Настройки анализа SonarQube") - SonarQubeOptions sonarQubeOptions; + SonarQubeOptions sonarQubeOptions @JsonProperty("syntaxCheck") @JsonPropertyDescription("Настройки синтаксического контроля") - SyntaxCheckOptions syntaxCheckOptions; + SyntaxCheckOptions syntaxCheckOptions @JsonProperty("smoke") @JsonPropertyDescription("Настройки дымового тестирования") - SmokeTestOptions smokeTestOptions; + SmokeTestOptions smokeTestOptions @JsonProperty("yaxunit") @JsonPropertyDescription("Настройки YAXUnit") - YaxunitOptions yaxunitOptions; + YaxunitOptions yaxunitOptions @JsonProperty("resultsTransform") @JsonPropertyDescription("Настройки трансформации результатов анализа") - ResultsTransformOptions resultsTransformOptions; + ResultsTransformOptions resultsTransformOptions @JsonProperty("notifications") @JsonPropertyDescription("Настройки рассылки результатов сборки") - NotificationsOptions notificationsOptions; + NotificationsOptions notificationsOptions @JsonProperty("logosConfig") @JsonPropertyDescription("Конфигурация библиотеки logos. Применяется перед запуском каждой стадии сборки") - String logosConfig; + String logosConfig @Override @NonCPS @@ -92,13 +93,13 @@ class JobConfiguration implements Serializable { ", resultsTransformOptions=" + resultsTransformOptions + ", notificationOptions=" + notificationsOptions + ", logosConfig='" + logosConfig + '\'' + - '}'; + '}' } boolean infoBaseFromFiles() { IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() - def env = steps.env(); - String branchName = env.BRANCH_NAME; + def env = steps.env() + String branchName = env.BRANCH_NAME def initMethod = initInfoBaseOptions.initMethod return (initMethod == InitInfoBaseMethod.FROM_SOURCE) || diff --git a/src/ru/pulsar/jenkins/library/configuration/ResultsTransformOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/ResultsTransformOptions.groovy index d9cb7b88..e46ba0ee 100644 --- a/src/ru/pulsar/jenkins/library/configuration/ResultsTransformOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/ResultsTransformOptions.groovy @@ -3,6 +3,7 @@ package ru.pulsar.jenkins.library.configuration import com.cloudbees.groovy.cps.NonCPS import com.fasterxml.jackson.annotation.JsonIgnoreProperties import com.fasterxml.jackson.annotation.JsonPropertyDescription +import com.fasterxml.jackson.annotation.JsonProperty import ru.pulsar.jenkins.library.configuration.sonarqube.GenericIssueFormat @JsonIgnoreProperties(ignoreUnknown = true) @@ -12,6 +13,7 @@ class ResultsTransformOptions implements Serializable { Поддерживается stebi и edt-ripper. По умолчанию содержит значение "stebi". """) + @JsonProperty(defaultValue = "stebi") ResultsTransformerType transformer = ResultsTransformerType.STEBI @JsonPropertyDescription("Фильтровать замечания по уровню поддержки модуля. Только для stebi. По умолчанию включено.") @@ -28,7 +30,8 @@ class ResultsTransformOptions implements Serializable { Для SonarQube версии ниже 10.3 необходимо использовать Generic_Issue. По умолчанию Generic_Issue_10_3 """) - GenericIssueFormat genericIssueFormat = GenericIssueFormat.GENERIC_ISSUE_10_3 + @JsonProperty(defaultValue = "Generic_Issue_10_3") + GenericIssueFormat genericIssueFormat @Override @NonCPS diff --git a/src/ru/pulsar/jenkins/library/configuration/SonarQubeOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/SonarQubeOptions.groovy index efa3da76..b030a35d 100644 --- a/src/ru/pulsar/jenkins/library/configuration/SonarQubeOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/SonarQubeOptions.groovy @@ -2,6 +2,7 @@ package ru.pulsar.jenkins.library.configuration import com.cloudbees.groovy.cps.NonCPS import com.fasterxml.jackson.annotation.JsonIgnoreProperties +import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonPropertyDescription @JsonIgnoreProperties(ignoreUnknown = true) @@ -10,7 +11,7 @@ class SonarQubeOptions implements Serializable { @JsonPropertyDescription( "Имя настроенного SonarQube-сервера (SonarQube installations).\nЕсли настроен только один сервер, то может быть оставлено пустым." ) - String sonarQubeInstallation; + String sonarQubeInstallation @JsonPropertyDescription("Использовать sonar-scanner, доступный в PATH") Boolean useSonarScannerFromPath @@ -30,6 +31,7 @@ class SonarQubeOptions implements Serializable { * auto - применяется автоконфигурация sonar-scanner силами branchplugin. Так же может применяться для отключения конфигурирования, если branch plugin отсутствует; * fromEnv - применяется ручная конфигурация sonar-scanner на основе переменных среды. Значение по умолчанию: fromEnv.""") + @JsonProperty(defaultValue = "auto") BranchAnalysisConfiguration branchAnalysisConfiguration @JsonPropertyDescription("""Ожидать состояние Quality Gate от SonarQube после загрузки анализа. По умолчанию `false`. @@ -47,6 +49,6 @@ class SonarQubeOptions implements Serializable { ", infoBaseUpdateModuleName='" + infoBaseUpdateModuleName + '\'' + ", branchAnalysisConfiguration='" + branchAnalysisConfiguration + '\'' + ", waitForQualityGate='" + waitForQualityGate + '\'' + - '}'; + '}' } } diff --git a/src/ru/pulsar/jenkins/library/configuration/sonarqube/GenericIssueFormat.groovy b/src/ru/pulsar/jenkins/library/configuration/sonarqube/GenericIssueFormat.groovy index 518c6013..0062d0d5 100644 --- a/src/ru/pulsar/jenkins/library/configuration/sonarqube/GenericIssueFormat.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/sonarqube/GenericIssueFormat.groovy @@ -1,7 +1,6 @@ package ru.pulsar.jenkins.library.configuration.sonarqube import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.annotation.JsonValue enum GenericIssueFormat { @JsonProperty("Generic_Issue") @@ -16,7 +15,6 @@ enum GenericIssueFormat { this.value = value } - String getValue() { return value } diff --git a/test/unit/groovy/ru/pulsar/jenkins/library/configuration/ConfigurationReaderTest.java b/test/unit/groovy/ru/pulsar/jenkins/library/configuration/ConfigurationReaderTest.java index 6bb7e476..9200320b 100644 --- a/test/unit/groovy/ru/pulsar/jenkins/library/configuration/ConfigurationReaderTest.java +++ b/test/unit/groovy/ru/pulsar/jenkins/library/configuration/ConfigurationReaderTest.java @@ -50,7 +50,7 @@ void testCreateJobConfigurationObject() throws IOException { ResultsTransformOptions resultsTransformOptions = jobConfiguration.getResultsTransformOptions(); assertThat(resultsTransformOptions.getTransformer()).isEqualTo(ResultsTransformerType.STEBI); - assertThat(resultsTransformOptions.getGenericIssueFormat()).isEqualTo(GenericIssueFormat.GENERIC_ISSUE_10_3); + assertThat(resultsTransformOptions.getGenericIssueFormat()).isEqualTo(GenericIssueFormat.GENERIC_ISSUE); assertThat(resultsTransformOptions.getRemoveSupport()).isFalse(); assertThat(resultsTransformOptions.getSupportLevel()).isZero(); diff --git a/test/unit/resources/jobConfiguration.json b/test/unit/resources/jobConfiguration.json index 78ee8556..3b3dcbc5 100644 --- a/test/unit/resources/jobConfiguration.json +++ b/test/unit/resources/jobConfiguration.json @@ -55,7 +55,7 @@ }, "resultsTransform": { "transformer": "stebi", - "genericIssueFormat": "Generic_Issue_10_3", + "genericIssueFormat": "Generic_Issue", "removeSupport": false }, "smoke": {