From fcb233e6dfbd66bc92afb9bd4951c628b62e7a7a Mon Sep 17 00:00:00 2001 From: Dima Date: Wed, 24 Jul 2024 11:37:47 +0300 Subject: [PATCH 01/29] add edt-ripper --- README.md | 8 ++-- .../configuration/GenericIssueFormat.groovy | 12 ++++++ .../ResultsTransformOptions.groovy | 23 +++++++++-- .../ResultsTransformerType.groovy | 12 ++++++ .../library/steps/ResultsTransformer.groovy | 39 +++++++++++++------ 5 files changed, 75 insertions(+), 19 deletions(-) create mode 100644 src/ru/pulsar/jenkins/library/configuration/GenericIssueFormat.groovy create mode 100644 src/ru/pulsar/jenkins/library/configuration/ResultsTransformerType.groovy diff --git a/README.md b/README.md index d9f27e27..19d8c076 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ 1. Для шага подготовки требуется любой агент с меткой `agent`. 1. Для запуска шага анализа SonarQube требуется агент с меткой `sonar`. -1. Для запуска шагов, работающих с EDT (валидация, трансформация формата исходников) требуется агент с меткой `edt` (если используется несколько версий EDT необходимо к метке добавить версию, например `edt@2021.3.4:x86_64`) и агент с меткой `oscript`, на котором глобально установлена библиотека [stebi](https://github.com/Stepa86/stebi) версии 1.9.1 или новее. +1. Для запуска шагов, работающих с EDT (валидация, трансформация формата исходников) требуется агент с меткой `edt` (если используется несколько версий EDT необходимо к метке добавить версию, например `edt@2021.3.4:x86_64`) и агент с меткой `oscript`, на котором глобально установлена библиотека [stebi](https://github.com/Stepa86/stebi) или [edt-ripper](https://github.com/bia-technologies/edt_ripper). 1. Для запуска шагов, работающих с 1С (подготовка, синтаксический контроль и т.д.) требуется агент с меткой, совпадающей со значением в поле `v8version` файла конфигурации. 1. В качестве ИБ используется файловая база, создаваемая в каталоге `./build/ib`. При необходимости вы можете создать пользователей на фазе инициализации ИБ. @@ -38,7 +38,7 @@ 1. Запуск BDD сценариев с сохранением результатов в формате Allure. 1. Запуск юнит-тестов с помощью фреймворка YAXUnit с сохранением результатов в формате jUnit и Allure. 1. Запуск синтаксического контроля средствами конфигуратора и сохранение результатов в виде отчета jUnit. -1. Запуск валидации проекта средствами EDT и конвертация отчета в формате generic issues. +1. Запуск валидации проекта средствами EDT и конвертация отчета в форматах BSL или Generic Issue. 1. Запуск статического анализа для SonarQube. 1. Публикация результатов junit и Allure в интерфейс Jenkins. 1. Рассылка результатов сборки на почту и в Telegram. @@ -148,7 +148,7 @@ pipeline1C() * Если в репозитории существует файл `./tools/syntax-check-exception-file.txt`, то команде запуска синтаксического контроля конфигурации данный файл будет передаваться как файл с исключениями сообщений об ошибках (параметр `--exception-file`) (`syntaxCheck` -> `exceptionFile`). * Конфигурационный файл по умолчанию уже содержит ряд "режимов проверки" для синтаксического контроля конфигурации (`syntaxCheck` -> `checkModes`). * Трансформация результатов валидации EDT: - * По умолчанию из результатов анализа исключаются замечания, сработавшие на модулях с включенным запретом редактирования (желтый куб с замком) (параметры `resultsTransform` -> `removeSupport` и `resultsTransform` -> `supportLevel`). + * При использовании stebi по умолчанию из результатов анализа исключаются замечания, сработавшие на модулях с включенным запретом редактирования (желтый куб с замком) (параметры `resultsTransform` -> `removeSupport` и `resultsTransform` -> `supportLevel`). * Анализ SonarQube: * Предполагается наличие единственной настройки `SonarQube installation` (`sonarqube` -> `sonarQubeInstallation`). * Используется `sonar-scanner` из переменной окружения `PATH` (`sonarqube` -> `useSonarScannerFromPath`). @@ -156,7 +156,7 @@ pipeline1C() * Применяется расчет аргументов командной строки для работы [`branch plugin`](https://github.com/mc1arke/sonarqube-community-branch-plugin) или коммерческих версий SonarQube (`sonarqube` -> `branchAnalysisConfiguration`). * Если разработка ведется с использованием подсистемы [БСП "Обновление версии ИБ"](https://its.1c.ru/db/bsp315doc#content:4:1:issogl1_обновление_версии_иб), то в значение параметра `sonar.projectVersion=$configurationVersion` утилиты `sonar-scanner` можно передавать версию из созданного общего модуля. Для этого необходимо заполнить параметр (`sonarqube` -> `infoBaseUpdateModuleName`). Если параметр не заполнен, версия передается из корня конфигурации. * По умолчанию шаг анализа не дожидается окончания фонового задания на сервере SonarQube и не анализирует результат прохождения Порога качества (`sonarqube` -> `waitForQualityGate`). - * Если выполнялась валидация EDT, результаты валидации в формате `generic issues` передаются утилите `sonar-scanner` как значение параметра `sonar.externalIssuesReportPaths`. + * Если валидация EDT выполнялась через stebi, путь к результирующему файлу в формате `generic issues` необходимо передать утилите `sonar-scanner` как значение параметра `sonar.externalIssuesReportPaths`. При использовании `edt-ripper` необходимо передать путь к файлу в качестве значения параметра `sonar.bsl.languageserver.reportPaths` * Рассылка уведомлений: * Электронная почта: * Для отправки используется плагин [`email-ext`](https://plugins.jenkins.io/email-ext). Шаблоны сообщений конфигурируются в настройках плагина. diff --git a/src/ru/pulsar/jenkins/library/configuration/GenericIssueFormat.groovy b/src/ru/pulsar/jenkins/library/configuration/GenericIssueFormat.groovy new file mode 100644 index 00000000..c9cfce12 --- /dev/null +++ b/src/ru/pulsar/jenkins/library/configuration/GenericIssueFormat.groovy @@ -0,0 +1,12 @@ +package ru.pulsar.jenkins.library.configuration + +import com.fasterxml.jackson.annotation.JsonProperty + +enum GenericIssueFormat { + @JsonProperty("Generic_Issue") + GENERIC_ISSUE, + + @JsonProperty("Generic_Issue_10_3") + GENERIC_ISSUE_10_3 + +} \ No newline at end of file diff --git a/src/ru/pulsar/jenkins/library/configuration/ResultsTransformOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/ResultsTransformOptions.groovy index f450d84a..363d0a62 100644 --- a/src/ru/pulsar/jenkins/library/configuration/ResultsTransformOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/ResultsTransformOptions.groovy @@ -7,22 +7,37 @@ import com.fasterxml.jackson.annotation.JsonPropertyDescription @JsonIgnoreProperties(ignoreUnknown = true) class ResultsTransformOptions implements Serializable { - @JsonPropertyDescription("Фильтровать замечания по уровню поддержки модуля. По умолчанию включено.") + @JsonPropertyDescription("""Способ преобразования замечаний. + Поддерживается stebi и edt-ripper + По умолчанию содержит значение "stebi". + """) + ResultsTransformerType transformer = ResultsTransformerType.STEBI + + @JsonPropertyDescription("Фильтровать замечания по уровню поддержки модуля. Только для stebi. По умолчанию включено.") Boolean removeSupport = true - @JsonPropertyDescription("""Настройка фильтрации замечаний по уровню поддержки. + @JsonPropertyDescription("""Настройка фильтрации замечаний по уровню поддержки. Только для stebi. 0 - удалить файлы на замке; 1 - удалить файлы на замке и на поддержке; 2 - удалить файлы на замке, на поддержке и снятые с поддержки. """) Integer supportLevel + @JsonPropertyDescription("""Формат отчета generic issue. Только для stebi. + Для SonarQube 10.3+ необходимо использовать Generic_Issue_10_3. + По умолчанию Generic_Issue + """) + + GenericIssueFormat genericIssueFormat = GenericIssueFormat.GENERIC_ISSUE + @Override @NonCPS String toString() { return "ResultsTransformOptions{" + + "transformer=" + transformer + "removeSupport=" + removeSupport + - ", supportLevel=" + supportLevel + - '}'; + "supportLevel=" + supportLevel + + "genericIssueFormat=" + genericIssueFormat + + '}' } } diff --git a/src/ru/pulsar/jenkins/library/configuration/ResultsTransformerType.groovy b/src/ru/pulsar/jenkins/library/configuration/ResultsTransformerType.groovy new file mode 100644 index 00000000..cd997460 --- /dev/null +++ b/src/ru/pulsar/jenkins/library/configuration/ResultsTransformerType.groovy @@ -0,0 +1,12 @@ +package ru.pulsar.jenkins.library.configuration + +import com.fasterxml.jackson.annotation.JsonProperty + +enum ResultsTransformerType { + @JsonProperty("stebi") + STEBI, + + @JsonProperty("edt-ripper") + EDT_RIPPER + +} \ No newline at end of file diff --git a/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy b/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy index 6ea02f94..b32174eb 100644 --- a/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy +++ b/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy @@ -2,6 +2,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.ResultsTransformerType import ru.pulsar.jenkins.library.configuration.SourceFormat import ru.pulsar.jenkins.library.ioc.ContextRegistry import ru.pulsar.jenkins.library.utils.Logger @@ -10,10 +11,10 @@ import java.nio.file.Paths class ResultsTransformer implements Serializable { - public static final String RESULT_STASH = 'edt-generic-issue' - public static final String RESULT_FILE = 'build/out/edt-generic-issue.json' + public static final String RESULT_STASH = 'edt-issues' + public static final String RESULT_FILE = 'build/out/edt-issues.json' - private final JobConfiguration config; + private final JobConfiguration config ResultsTransformer(JobConfiguration config) { this.config = config @@ -24,7 +25,7 @@ class ResultsTransformer implements Serializable { Logger.printLocation() - def env = steps.env(); + def env = steps.env() if (!config.stageFlags.edtValidate) { Logger.println("EDT validation is disabled. No transform is needed.") @@ -33,20 +34,36 @@ class ResultsTransformer implements Serializable { steps.unstash(EdtValidate.RESULT_STASH) - Logger.println("Конвертация результата EDT в Generic Issue") + ResultsTransformerType transformerType = config.resultsTransformOptions.transformer def edtValidateFile = "$env.WORKSPACE/$EdtValidate.RESULT_FILE" - def genericIssueFile = "$env.WORKSPACE/$RESULT_FILE" - String srcDir = config.sourceFormat == SourceFormat.DESIGNER ? config.srcDir : Paths.get(config.srcDir, "src") - steps.cmd("stebi convert -r $edtValidateFile $genericIssueFile $srcDir") - if (config.resultsTransformOptions.removeSupport) { - def supportLevel = config.resultsTransformOptions.supportLevel - steps.cmd("stebi transform --remove_support $supportLevel --src $srcDir $genericIssueFile") + if (transformerType == ResultsTransformerType.STEBI) { + + Logger.println("Конвертация результата EDT в Generic Issue с помощью stebi") + + def genericIssueFile = "$env.WORKSPACE/$RESULT_FILE" + def genericIssuesFormat = config.resultsTransformOptions.genericIssueFormat + + steps.cmd("stebi convert --format $genericIssuesFormat -r $edtValidateFile $genericIssueFile $srcDir") + + if (config.resultsTransformOptions.removeSupport) { + def supportLevel = config.resultsTransformOptions.supportLevel + steps.cmd("stebi transform --format $genericIssuesFormat --remove_support $supportLevel --src $srcDir $genericIssueFile") + } + + } else { + + Logger.println("Конвертация результата EDT в Issues с помощью edt-ripper") + + steps.cmd("edt-ripper parse $edtValidateFile $srcDir $env.WORKSPACE/$RESULT_FILE") + steps.cmd("edt-ripper publish $env.WORKSPACE/build/out/edt-rules.json") + } steps.archiveArtifacts(RESULT_FILE) steps.stash(RESULT_STASH, RESULT_FILE) + } } From 0d0041743ae131b3a93224cf04cd1ae3d2b1a8ef Mon Sep 17 00:00:00 2001 From: Dima Date: Wed, 24 Jul 2024 12:18:01 +0300 Subject: [PATCH 02/29] upd schema --- resources/schema.json | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/resources/schema.json b/resources/schema.json index 326c1e0a..20e30db7 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -332,13 +332,23 @@ "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" : "Фильтровать замечания по уровню поддержки модуля. По умолчанию включено." + "description" : "Фильтровать замечания по уровню поддержки модуля. Только для stebi. По умолчанию включено." }, "supportLevel" : { "type" : "integer", - "description" : "Настройка фильтрации замечаний по уровню поддержки.\n 0 - удалить файлы на замке;\n 1 - удалить файлы на замке и на поддержке;\n 2 - удалить файлы на замке, на поддержке и снятые с поддержки.\n " + "description" : "Настройка фильтрации замечаний по уровню поддержки. Только для stebi.\n 0 - удалить файлы на замке;\n 1 - удалить файлы на замке и на поддержке;\n 2 - удалить файлы на замке, на поддержке и снятые с поддержки.\n " + }, + "genericIssueFormat" : { + "type" : "string", + "description" : "Формат отчета generic issue. Только для stebi.\n Для SonarQube 10.3+ необходимо использовать Generic_Issue_10_3.\n По умолчанию Generic_Issue\n ", + "enum" : [ "Generic_Issue", "Generic_Issue_10_3" ] } } }, From bf3fb2ddda34835bceddf073a4451b5992e02b33 Mon Sep 17 00:00:00 2001 From: Dima Date: Wed, 24 Jul 2024 12:40:50 +0300 Subject: [PATCH 03/29] fix errors --- .../library/configuration/GenericIssueFormat.groovy | 9 +++++++++ .../library/configuration/ResultsTransformOptions.groovy | 1 - .../jenkins/library/steps/ResultsTransformer.groovy | 4 ++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/ru/pulsar/jenkins/library/configuration/GenericIssueFormat.groovy b/src/ru/pulsar/jenkins/library/configuration/GenericIssueFormat.groovy index c9cfce12..8775c6fc 100644 --- a/src/ru/pulsar/jenkins/library/configuration/GenericIssueFormat.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/GenericIssueFormat.groovy @@ -9,4 +9,13 @@ enum GenericIssueFormat { @JsonProperty("Generic_Issue_10_3") GENERIC_ISSUE_10_3 + @Override + String toString() { + switch(this) { + case GENERIC_ISSUE: return "Generic_Issue" + case GENERIC_ISSUE_10_3: return "Generic_Issue_10_3" + default: throw new IllegalArgumentException() + } + } + } \ No newline at end of file diff --git a/src/ru/pulsar/jenkins/library/configuration/ResultsTransformOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/ResultsTransformOptions.groovy index 363d0a62..28767095 100644 --- a/src/ru/pulsar/jenkins/library/configuration/ResultsTransformOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/ResultsTransformOptions.groovy @@ -27,7 +27,6 @@ class ResultsTransformOptions implements Serializable { Для SonarQube 10.3+ необходимо использовать Generic_Issue_10_3. По умолчанию Generic_Issue """) - GenericIssueFormat genericIssueFormat = GenericIssueFormat.GENERIC_ISSUE @Override diff --git a/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy b/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy index b32174eb..ce949ded 100644 --- a/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy +++ b/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy @@ -46,11 +46,11 @@ class ResultsTransformer implements Serializable { def genericIssueFile = "$env.WORKSPACE/$RESULT_FILE" def genericIssuesFormat = config.resultsTransformOptions.genericIssueFormat - steps.cmd("stebi convert --format $genericIssuesFormat -r $edtValidateFile $genericIssueFile $srcDir") + steps.cmd("stebi convert --Format $genericIssuesFormat -r $edtValidateFile $genericIssueFile $srcDir") if (config.resultsTransformOptions.removeSupport) { def supportLevel = config.resultsTransformOptions.supportLevel - steps.cmd("stebi transform --format $genericIssuesFormat --remove_support $supportLevel --src $srcDir $genericIssueFile") + steps.cmd("stebi transform --Format $genericIssuesFormat --remove_support $supportLevel --src $srcDir $genericIssueFile") } } else { From edfc25e98c0c930086bdd4bda15113c5b63406e5 Mon Sep 17 00:00:00 2001 From: Dima Date: Wed, 24 Jul 2024 13:25:35 +0300 Subject: [PATCH 04/29] add NonCPS --- .../jenkins/library/configuration/GenericIssueFormat.groovy | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ru/pulsar/jenkins/library/configuration/GenericIssueFormat.groovy b/src/ru/pulsar/jenkins/library/configuration/GenericIssueFormat.groovy index 8775c6fc..0b215139 100644 --- a/src/ru/pulsar/jenkins/library/configuration/GenericIssueFormat.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/GenericIssueFormat.groovy @@ -1,5 +1,6 @@ package ru.pulsar.jenkins.library.configuration +import com.cloudbees.groovy.cps.NonCPS import com.fasterxml.jackson.annotation.JsonProperty enum GenericIssueFormat { @@ -10,6 +11,7 @@ enum GenericIssueFormat { GENERIC_ISSUE_10_3 @Override + @NonCPS String toString() { switch(this) { case GENERIC_ISSUE: return "Generic_Issue" From 5d01386b795a91661cf4e78cd7673a93a16aec73 Mon Sep 17 00:00:00 2001 From: Dima Date: Wed, 24 Jul 2024 13:33:28 +0300 Subject: [PATCH 05/29] add toString --- src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy b/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy index ce949ded..985e6fc9 100644 --- a/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy +++ b/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy @@ -44,7 +44,7 @@ class ResultsTransformer implements Serializable { Logger.println("Конвертация результата EDT в Generic Issue с помощью stebi") def genericIssueFile = "$env.WORKSPACE/$RESULT_FILE" - def genericIssuesFormat = config.resultsTransformOptions.genericIssueFormat + def genericIssuesFormat = config.resultsTransformOptions.genericIssueFormat.toString() steps.cmd("stebi convert --Format $genericIssuesFormat -r $edtValidateFile $genericIssueFile $srcDir") From 20a66450c794f2dddf53b452e82e880c9596857b Mon Sep 17 00:00:00 2001 From: Dima Date: Wed, 24 Jul 2024 14:35:13 +0300 Subject: [PATCH 06/29] fixes and tests --- resources/globalConfiguration.json | 2 ++ .../configuration/GenericIssueFormat.groovy | 15 +++++++-------- .../library/steps/ResultsTransformer.groovy | 2 +- .../configuration/ConfigurationReaderTest.java | 7 +++++-- test/unit/resources/jobConfiguration.json | 2 ++ 5 files changed, 17 insertions(+), 11 deletions(-) diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index 693f5544..a5ba57b9 100644 --- a/resources/globalConfiguration.json +++ b/resources/globalConfiguration.json @@ -89,6 +89,8 @@ "publishToJUnitReport": true }, "resultsTransform": { + "transformer": "stebi", + "genericIssueFormat": "Generic_Issue", "removeSupport": true, "supportLevel": 0 }, diff --git a/src/ru/pulsar/jenkins/library/configuration/GenericIssueFormat.groovy b/src/ru/pulsar/jenkins/library/configuration/GenericIssueFormat.groovy index 0b215139..392e73d5 100644 --- a/src/ru/pulsar/jenkins/library/configuration/GenericIssueFormat.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/GenericIssueFormat.groovy @@ -1,7 +1,7 @@ package ru.pulsar.jenkins.library.configuration -import com.cloudbees.groovy.cps.NonCPS import com.fasterxml.jackson.annotation.JsonProperty +import com.fasterxml.jackson.annotation.JsonValue enum GenericIssueFormat { @JsonProperty("Generic_Issue") @@ -10,13 +10,12 @@ enum GenericIssueFormat { @JsonProperty("Generic_Issue_10_3") GENERIC_ISSUE_10_3 - @Override - @NonCPS - String toString() { - switch(this) { - case GENERIC_ISSUE: return "Generic_Issue" - case GENERIC_ISSUE_10_3: return "Generic_Issue_10_3" - default: throw new IllegalArgumentException() + @JsonValue + String toValue() { + if (this == GENERIC_ISSUE) { + return "Generic_Issue" + } else { + return "Generic_Issue_10_3" } } diff --git a/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy b/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy index 985e6fc9..abfeaee2 100644 --- a/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy +++ b/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy @@ -44,7 +44,7 @@ class ResultsTransformer implements Serializable { Logger.println("Конвертация результата EDT в Generic Issue с помощью stebi") def genericIssueFile = "$env.WORKSPACE/$RESULT_FILE" - def genericIssuesFormat = config.resultsTransformOptions.genericIssueFormat.toString() + def genericIssuesFormat = config.resultsTransformOptions.genericIssueFormat.toValue() steps.cmd("stebi convert --Format $genericIssuesFormat -r $edtValidateFile $genericIssueFile $srcDir") 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 89c46ad3..f85275ed 100644 --- a/test/unit/groovy/ru/pulsar/jenkins/library/configuration/ConfigurationReaderTest.java +++ b/test/unit/groovy/ru/pulsar/jenkins/library/configuration/ConfigurationReaderTest.java @@ -47,8 +47,11 @@ void testCreateJobConfigurationObject() throws IOException { assertThat(jobConfiguration.getSyntaxCheckOptions().getCheckModes()).hasSize(4); - assertThat(jobConfiguration.getResultsTransformOptions().getRemoveSupport()).isFalse(); - assertThat(jobConfiguration.getResultsTransformOptions().getSupportLevel()).isZero(); + ResultsTransformOptions resultsTransformOptions = jobConfiguration.getResultsTransformOptions(); + assertThat(resultsTransformOptions.getTransformer()).isEqualTo(ResultsTransformerType.STEBI); + assertThat(resultsTransformOptions.getGenericIssueFormat()).isEqualTo(GenericIssueFormat.GENERIC_ISSUE_10_3); + assertThat(resultsTransformOptions.getRemoveSupport()).isFalse(); + assertThat(resultsTransformOptions.getSupportLevel()).isZero(); assertThat(jobConfiguration.getSmokeTestOptions().getVrunnerSettings()).contains("./tools/vrunner-smoke.json"); assertThat(jobConfiguration.getSmokeTestOptions().isPublishToAllureReport()).isFalse(); diff --git a/test/unit/resources/jobConfiguration.json b/test/unit/resources/jobConfiguration.json index 803b75ea..78ee8556 100644 --- a/test/unit/resources/jobConfiguration.json +++ b/test/unit/resources/jobConfiguration.json @@ -54,6 +54,8 @@ ] }, "resultsTransform": { + "transformer": "stebi", + "genericIssueFormat": "Generic_Issue_10_3", "removeSupport": false }, "smoke": { From 44d988db616a5b9c85d3b9c92b3528099e8d2705 Mon Sep 17 00:00:00 2001 From: Dima Date: Wed, 24 Jul 2024 14:44:24 +0300 Subject: [PATCH 07/29] fixes --- .../library/configuration/GenericIssueFormat.groovy | 10 ---------- .../jenkins/library/steps/ResultsTransformer.groovy | 6 +++++- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/ru/pulsar/jenkins/library/configuration/GenericIssueFormat.groovy b/src/ru/pulsar/jenkins/library/configuration/GenericIssueFormat.groovy index 392e73d5..c9cfce12 100644 --- a/src/ru/pulsar/jenkins/library/configuration/GenericIssueFormat.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/GenericIssueFormat.groovy @@ -1,7 +1,6 @@ package ru.pulsar.jenkins.library.configuration import com.fasterxml.jackson.annotation.JsonProperty -import com.fasterxml.jackson.annotation.JsonValue enum GenericIssueFormat { @JsonProperty("Generic_Issue") @@ -10,13 +9,4 @@ enum GenericIssueFormat { @JsonProperty("Generic_Issue_10_3") GENERIC_ISSUE_10_3 - @JsonValue - String toValue() { - if (this == GENERIC_ISSUE) { - return "Generic_Issue" - } else { - return "Generic_Issue_10_3" - } - } - } \ No newline at end of file diff --git a/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy b/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy index abfeaee2..b01565c1 100644 --- a/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy +++ b/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy @@ -1,6 +1,7 @@ package ru.pulsar.jenkins.library.steps import ru.pulsar.jenkins.library.IStepExecutor +import ru.pulsar.jenkins.library.configuration.GenericIssueFormat import ru.pulsar.jenkins.library.configuration.JobConfiguration import ru.pulsar.jenkins.library.configuration.ResultsTransformerType import ru.pulsar.jenkins.library.configuration.SourceFormat @@ -44,7 +45,10 @@ class ResultsTransformer implements Serializable { Logger.println("Конвертация результата EDT в Generic Issue с помощью stebi") def genericIssueFile = "$env.WORKSPACE/$RESULT_FILE" - def genericIssuesFormat = config.resultsTransformOptions.genericIssueFormat.toValue() + def genericIssuesFormat = "Generic_Issue" + if (config.resultsTransformOptions.genericIssueFormat == GenericIssueFormat.GENERIC_ISSUE_10_3) { + genericIssuesFormat = "Generic_Issue_10_3" + } steps.cmd("stebi convert --Format $genericIssuesFormat -r $edtValidateFile $genericIssueFile $srcDir") From d70a5981f8a06b7d342c46f4654e472787f7a228 Mon Sep 17 00:00:00 2001 From: Dima Date: Wed, 24 Jul 2024 16:35:46 +0300 Subject: [PATCH 08/29] fix edt-ripper cmd, stashes and sonar-scanner parameters --- README.md | 2 +- .../jenkins/library/steps/ResultsTransformer.groovy | 4 ++-- .../jenkins/library/steps/SonarScanner.groovy | 13 +++++++++---- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 19d8c076..ee3ac9ca 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ 1. Для шага подготовки требуется любой агент с меткой `agent`. 1. Для запуска шага анализа SonarQube требуется агент с меткой `sonar`. -1. Для запуска шагов, работающих с EDT (валидация, трансформация формата исходников) требуется агент с меткой `edt` (если используется несколько версий EDT необходимо к метке добавить версию, например `edt@2021.3.4:x86_64`) и агент с меткой `oscript`, на котором глобально установлена библиотека [stebi](https://github.com/Stepa86/stebi) или [edt-ripper](https://github.com/bia-technologies/edt_ripper). +1. Для запуска шагов, работающих с EDT (валидация, трансформация формата исходников) требуется агент с меткой `edt` (если используется несколько версий EDT необходимо к метке добавить версию, например `edt@2021.3.4:x86_64`) и агент с меткой `oscript`, на котором глобально установлена библиотека [stebi](https://github.com/Stepa86/stebi) версии 1.11.1 и выше или [edt-ripper](https://github.com/bia-technologies/edt_ripper). 1. Для запуска шагов, работающих с 1С (подготовка, синтаксический контроль и т.д.) требуется агент с меткой, совпадающей со значением в поле `v8version` файла конфигурации. 1. В качестве ИБ используется файловая база, создаваемая в каталоге `./build/ib`. При необходимости вы можете создать пользователей на фазе инициализации ИБ. diff --git a/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy b/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy index b01565c1..9c692493 100644 --- a/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy +++ b/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy @@ -61,8 +61,8 @@ class ResultsTransformer implements Serializable { Logger.println("Конвертация результата EDT в Issues с помощью edt-ripper") - steps.cmd("edt-ripper parse $edtValidateFile $srcDir $env.WORKSPACE/$RESULT_FILE") - steps.cmd("edt-ripper publish $env.WORKSPACE/build/out/edt-rules.json") + steps.cmd("edt-ripper parse $edtValidateFile $srcDir $DesignerToEdtFormatTransformation.PROJECT_NAME $env.WORKSPACE/$RESULT_FILE") + steps.cmd("edt-ripper publish $env.WORKSPACE/$RESULT_FILE") } diff --git a/src/ru/pulsar/jenkins/library/steps/SonarScanner.groovy b/src/ru/pulsar/jenkins/library/steps/SonarScanner.groovy index 23b55386..97c0e450 100644 --- a/src/ru/pulsar/jenkins/library/steps/SonarScanner.groovy +++ b/src/ru/pulsar/jenkins/library/steps/SonarScanner.groovy @@ -3,6 +3,7 @@ package ru.pulsar.jenkins.library.steps import ru.pulsar.jenkins.library.IStepExecutor import ru.pulsar.jenkins.library.configuration.BranchAnalysisConfiguration import ru.pulsar.jenkins.library.configuration.JobConfiguration +import ru.pulsar.jenkins.library.configuration.ResultsTransformerType import ru.pulsar.jenkins.library.configuration.SourceFormat import ru.pulsar.jenkins.library.ioc.ContextRegistry import ru.pulsar.jenkins.library.utils.Logger @@ -10,7 +11,7 @@ import ru.pulsar.jenkins.library.utils.VersionParser class SonarScanner implements Serializable { - private final JobConfiguration config; + private final JobConfiguration config SonarScanner(JobConfiguration config) { this.config = config @@ -26,7 +27,7 @@ class SonarScanner implements Serializable { return } - def env = steps.env(); + def env = steps.env() def sonarScannerBinary @@ -58,8 +59,12 @@ class SonarScanner implements Serializable { } if (config.stageFlags.edtValidate) { - steps.unstash("edt-generic-issue") - sonarCommand += " -Dsonar.externalIssuesReportPaths=build/out/edt-generic-issue.json" + steps.unstash(ResultsTransformer.RESULT_STASH) + if (config.resultsTransformOptions.transformer == ResultsTransformerType.STEBI) { + sonarCommand += " -Dsonar.externalIssuesReportPaths=" + ResultsTransformer.RESULT_FILE + } else { + sonarCommand += " -Dsonar.bsl.languageserver.reportPaths=" + ResultsTransformer.RESULT_FILE + } } if (config.sonarQubeOptions.waitForQualityGate) { From 2f32edbd47acd229a3abf8f80537e9ff5ab380ca Mon Sep 17 00:00:00 2001 From: Dima Date: Wed, 24 Jul 2024 18:03:07 +0300 Subject: [PATCH 09/29] fix workspace path --- .../library/steps/ResultsTransformer.groovy | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy b/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy index 9c692493..d73b9ecf 100644 --- a/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy +++ b/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy @@ -6,6 +6,7 @@ import ru.pulsar.jenkins.library.configuration.JobConfiguration import ru.pulsar.jenkins.library.configuration.ResultsTransformerType import ru.pulsar.jenkins.library.configuration.SourceFormat import ru.pulsar.jenkins.library.ioc.ContextRegistry +import ru.pulsar.jenkins.library.utils.FileUtils import ru.pulsar.jenkins.library.utils.Logger import java.nio.file.Paths @@ -38,7 +39,7 @@ class ResultsTransformer implements Serializable { ResultsTransformerType transformerType = config.resultsTransformOptions.transformer def edtValidateFile = "$env.WORKSPACE/$EdtValidate.RESULT_FILE" - String srcDir = config.sourceFormat == SourceFormat.DESIGNER ? config.srcDir : Paths.get(config.srcDir, "src") + def srcDir = FileUtils.getFilePath("$env.WORKSPACE/$config.srcDir") if (transformerType == ResultsTransformerType.STEBI) { @@ -61,7 +62,20 @@ class ResultsTransformer implements Serializable { Logger.println("Конвертация результата EDT в Issues с помощью edt-ripper") - steps.cmd("edt-ripper parse $edtValidateFile $srcDir $DesignerToEdtFormatTransformation.PROJECT_NAME $env.WORKSPACE/$RESULT_FILE") + def workspace + + if (config.sourceFormat == SourceFormat.DESIGNER) { + + steps.unstash(DesignerToEdtFormatTransformation.WORKSPACE_ZIP_STASH) + steps.unzip(DesignerToEdtFormatTransformation.WORKSPACE, DesignerToEdtFormatTransformation.WORKSPACE_ZIP) + + workspace = DesignerToEdtFormatTransformation.WORKSPACE + + } else { + workspace = FileUtils.getFilePath("$env.WORKSPACE/$srcDir") + } + + steps.cmd("edt-ripper parse $edtValidateFile $workspace $DesignerToEdtFormatTransformation.PROJECT_NAME $env.WORKSPACE/$RESULT_FILE") steps.cmd("edt-ripper publish $env.WORKSPACE/$RESULT_FILE") } From 206309622fdb0bd81ed0628aa4dd453171058424 Mon Sep 17 00:00:00 2001 From: Dima Date: Thu, 25 Jul 2024 10:21:00 +0300 Subject: [PATCH 10/29] comment edt-ripper publish --- src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy b/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy index d73b9ecf..a4080f30 100644 --- a/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy +++ b/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy @@ -76,7 +76,7 @@ class ResultsTransformer implements Serializable { } steps.cmd("edt-ripper parse $edtValidateFile $workspace $DesignerToEdtFormatTransformation.PROJECT_NAME $env.WORKSPACE/$RESULT_FILE") - steps.cmd("edt-ripper publish $env.WORKSPACE/$RESULT_FILE") + //steps.cmd("edt-ripper publish $env.WORKSPACE/$RESULT_FILE") } From a63847df9d99779040ae43446ae9e2847d5db289 Mon Sep 17 00:00:00 2001 From: Dima Date: Thu, 25 Jul 2024 10:44:21 +0300 Subject: [PATCH 11/29] fix workspace path --- src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy b/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy index a4080f30..d06e44c5 100644 --- a/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy +++ b/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy @@ -69,14 +69,13 @@ class ResultsTransformer implements Serializable { steps.unstash(DesignerToEdtFormatTransformation.WORKSPACE_ZIP_STASH) steps.unzip(DesignerToEdtFormatTransformation.WORKSPACE, DesignerToEdtFormatTransformation.WORKSPACE_ZIP) - workspace = DesignerToEdtFormatTransformation.WORKSPACE + workspace = FileUtils.getFilePath("$env.WORKSPACE/$DesignerToEdtFormatTransformation.WORKSPACE") } else { workspace = FileUtils.getFilePath("$env.WORKSPACE/$srcDir") } steps.cmd("edt-ripper parse $edtValidateFile $workspace $DesignerToEdtFormatTransformation.PROJECT_NAME $env.WORKSPACE/$RESULT_FILE") - //steps.cmd("edt-ripper publish $env.WORKSPACE/$RESULT_FILE") } From aa4a9d68790cc375410ded57f8bfac31c497385d Mon Sep 17 00:00:00 2001 From: Dima Date: Thu, 25 Jul 2024 13:29:11 +0300 Subject: [PATCH 12/29] add unstash for sonar-scanner --- src/ru/pulsar/jenkins/library/steps/SonarScanner.groovy | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/ru/pulsar/jenkins/library/steps/SonarScanner.groovy b/src/ru/pulsar/jenkins/library/steps/SonarScanner.groovy index 97c0e450..7d80da5e 100644 --- a/src/ru/pulsar/jenkins/library/steps/SonarScanner.groovy +++ b/src/ru/pulsar/jenkins/library/steps/SonarScanner.groovy @@ -60,6 +60,14 @@ class SonarScanner implements Serializable { if (config.stageFlags.edtValidate) { steps.unstash(ResultsTransformer.RESULT_STASH) + + if (config.sourceFormat == SourceFormat.DESIGNER) { + + steps.unstash(DesignerToEdtFormatTransformation.WORKSPACE_ZIP_STASH) + steps.unzip(DesignerToEdtFormatTransformation.WORKSPACE, DesignerToEdtFormatTransformation.WORKSPACE_ZIP) + + } + if (config.resultsTransformOptions.transformer == ResultsTransformerType.STEBI) { sonarCommand += " -Dsonar.externalIssuesReportPaths=" + ResultsTransformer.RESULT_FILE } else { From 4b6b3ebe5db1efd1a0319b04aff29a22edabd787 Mon Sep 17 00:00:00 2001 From: Dima Date: Thu, 25 Jul 2024 15:00:11 +0300 Subject: [PATCH 13/29] fix workspace path (experiment) --- src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy b/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy index d06e44c5..f3f976ef 100644 --- a/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy +++ b/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy @@ -69,10 +69,10 @@ class ResultsTransformer implements Serializable { steps.unstash(DesignerToEdtFormatTransformation.WORKSPACE_ZIP_STASH) steps.unzip(DesignerToEdtFormatTransformation.WORKSPACE, DesignerToEdtFormatTransformation.WORKSPACE_ZIP) - workspace = FileUtils.getFilePath("$env.WORKSPACE/$DesignerToEdtFormatTransformation.WORKSPACE") + workspace = FileUtils.getFilePath("$DesignerToEdtFormatTransformation.WORKSPACE") } else { - workspace = FileUtils.getFilePath("$env.WORKSPACE/$srcDir") + workspace = srcDir } steps.cmd("edt-ripper parse $edtValidateFile $workspace $DesignerToEdtFormatTransformation.PROJECT_NAME $env.WORKSPACE/$RESULT_FILE") From cf890d0fb7b9ddd0a1cc61f7c7937fd4016b0403 Mon Sep 17 00:00:00 2001 From: Dima Date: Sat, 27 Jul 2024 10:40:35 +0300 Subject: [PATCH 14/29] fix projectName, add split for srcDir for edt-ripper --- .../steps/DesignerToEdtFormatTransformation.groovy | 8 ++++---- .../jenkins/library/steps/ResultsTransformer.groovy | 12 +++++------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/ru/pulsar/jenkins/library/steps/DesignerToEdtFormatTransformation.groovy b/src/ru/pulsar/jenkins/library/steps/DesignerToEdtFormatTransformation.groovy index f678d0cf..29c586e4 100644 --- a/src/ru/pulsar/jenkins/library/steps/DesignerToEdtFormatTransformation.groovy +++ b/src/ru/pulsar/jenkins/library/steps/DesignerToEdtFormatTransformation.groovy @@ -10,12 +10,11 @@ import ru.pulsar.jenkins.library.utils.Logger class DesignerToEdtFormatTransformation implements Serializable { - public static final String PROJECT_NAME = 'temp' public static final String WORKSPACE = 'build/edt-workspace' public static final String WORKSPACE_ZIP = 'build/edt-workspace.zip' public static final String WORKSPACE_ZIP_STASH = 'edt-workspace-zip' - private final JobConfiguration config; + private final JobConfiguration config DesignerToEdtFormatTransformation(JobConfiguration config) { this.config = config @@ -31,18 +30,19 @@ class DesignerToEdtFormatTransformation implements Serializable { return } - def env = steps.env(); + def env = steps.env() def workspaceDir = FileUtils.getFilePath("$env.WORKSPACE/$WORKSPACE") def srcDir = config.srcDir def configurationRoot = FileUtils.getFilePath("$env.WORKSPACE/$srcDir") + def projectName = config.srcDir.split(File.separator).last() def edtVersionForRing = EDT.ringModule(config) steps.deleteDir(workspaceDir) Logger.println("Конвертация исходников из формата конфигуратора в формат EDT") - def ringCommand = "ring $edtVersionForRing workspace import --configuration-files \"$configurationRoot\" --project-name $PROJECT_NAME --workspace-location \"$workspaceDir\"" + def ringCommand = "ring $edtVersionForRing workspace import --configuration-files \"$configurationRoot\" --project-name $projectName --workspace-location \"$workspaceDir\"" steps.ringCommand(ringCommand) diff --git a/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy b/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy index f3f976ef..40045e5b 100644 --- a/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy +++ b/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy @@ -62,20 +62,18 @@ class ResultsTransformer implements Serializable { Logger.println("Конвертация результата EDT в Issues с помощью edt-ripper") - def workspace - if (config.sourceFormat == SourceFormat.DESIGNER) { steps.unstash(DesignerToEdtFormatTransformation.WORKSPACE_ZIP_STASH) steps.unzip(DesignerToEdtFormatTransformation.WORKSPACE, DesignerToEdtFormatTransformation.WORKSPACE_ZIP) - workspace = FileUtils.getFilePath("$DesignerToEdtFormatTransformation.WORKSPACE") - - } else { - workspace = srcDir } - steps.cmd("edt-ripper parse $edtValidateFile $workspace $DesignerToEdtFormatTransformation.PROJECT_NAME $env.WORKSPACE/$RESULT_FILE") + def splitDir = config.srcDir.split(File.separator) + def projectName = splitDir.last() + def srcDirExceptLast = splitDir.dropRight(1).join(File.separator) + + steps.cmd("edt-ripper parse $edtValidateFile $srcDirExceptLast $projectName $env.WORKSPACE/$RESULT_FILE") } From 17b606664b9c392e68cc83df3a12228fd3e7cdb9 Mon Sep 17 00:00:00 2001 From: Dima Date: Sat, 27 Jul 2024 11:00:06 +0300 Subject: [PATCH 15/29] fix projectName --- src/ru/pulsar/jenkins/library/steps/EdtValidate.groovy | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/ru/pulsar/jenkins/library/steps/EdtValidate.groovy b/src/ru/pulsar/jenkins/library/steps/EdtValidate.groovy index f766b9e0..a0f50a3b 100644 --- a/src/ru/pulsar/jenkins/library/steps/EdtValidate.groovy +++ b/src/ru/pulsar/jenkins/library/steps/EdtValidate.groovy @@ -13,7 +13,7 @@ class EdtValidate implements Serializable { public static final String RESULT_STASH = 'edt-validate' public static final String RESULT_FILE = 'build/out/edt-validate.out' - private final JobConfiguration config; + private final JobConfiguration config EdtValidate(JobConfiguration config) { this.config = config @@ -29,16 +29,18 @@ class EdtValidate implements Serializable { return } - def env = steps.env(); + def env = steps.env() String workspaceLocation = "$env.WORKSPACE/$DesignerToEdtFormatTransformation.WORKSPACE" - String projectList; + String projectList if (config.sourceFormat == SourceFormat.DESIGNER) { steps.unstash(DesignerToEdtFormatTransformation.WORKSPACE_ZIP_STASH) steps.unzip(DesignerToEdtFormatTransformation.WORKSPACE, DesignerToEdtFormatTransformation.WORKSPACE_ZIP) - projectList = "--project-name-list $DesignerToEdtFormatTransformation.PROJECT_NAME" + def projectName = config.srcDir.split(File.separator).last() + + projectList = "--project-name-list $projectName" } else { def srcDir = config.srcDir def projectDir = FileUtils.getFilePath("$env.WORKSPACE/$srcDir") From 3e5209a5c5e324a81156b568b14055f594328248 Mon Sep 17 00:00:00 2001 From: Dima Ovcharenko Date: Sat, 27 Jul 2024 17:53:27 +0300 Subject: [PATCH 16/29] Update README.md Co-authored-by: Nikita Fedkin --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ee3ac9ca..331ffaf6 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,8 @@ 1. Запуск BDD сценариев с сохранением результатов в формате Allure. 1. Запуск юнит-тестов с помощью фреймворка YAXUnit с сохранением результатов в формате jUnit и Allure. 1. Запуск синтаксического контроля средствами конфигуратора и сохранение результатов в виде отчета jUnit. -1. Запуск валидации проекта средствами EDT и конвертация отчета в форматах BSL или Generic Issue. +1. Запуск валидации проекта средствами EDT и конвертация отчета в форматах BSL LS или Generic Issue. + 1. Запуск статического анализа для SonarQube. 1. Публикация результатов junit и Allure в интерфейс Jenkins. 1. Рассылка результатов сборки на почту и в Telegram. From accc8e8559ec3a35297060ab017b63239896d7db Mon Sep 17 00:00:00 2001 From: Dima Date: Sun, 28 Jul 2024 10:04:45 +0300 Subject: [PATCH 17/29] fixes --- README.md | 6 ++++- .../configuration/GenericIssueFormat.groovy | 12 ---------- .../ResultsTransformOptions.groovy | 1 + .../sonarqube/GenericIssueFormat.groovy | 24 +++++++++++++++++++ .../library/steps/ResultsTransformer.groovy | 8 +------ .../ConfigurationReaderTest.java | 1 + 6 files changed, 32 insertions(+), 20 deletions(-) delete mode 100644 src/ru/pulsar/jenkins/library/configuration/GenericIssueFormat.groovy create mode 100644 src/ru/pulsar/jenkins/library/configuration/sonarqube/GenericIssueFormat.groovy diff --git a/README.md b/README.md index 331ffaf6..f516ab2b 100644 --- a/README.md +++ b/README.md @@ -157,7 +157,6 @@ pipeline1C() * Применяется расчет аргументов командной строки для работы [`branch plugin`](https://github.com/mc1arke/sonarqube-community-branch-plugin) или коммерческих версий SonarQube (`sonarqube` -> `branchAnalysisConfiguration`). * Если разработка ведется с использованием подсистемы [БСП "Обновление версии ИБ"](https://its.1c.ru/db/bsp315doc#content:4:1:issogl1_обновление_версии_иб), то в значение параметра `sonar.projectVersion=$configurationVersion` утилиты `sonar-scanner` можно передавать версию из созданного общего модуля. Для этого необходимо заполнить параметр (`sonarqube` -> `infoBaseUpdateModuleName`). Если параметр не заполнен, версия передается из корня конфигурации. * По умолчанию шаг анализа не дожидается окончания фонового задания на сервере SonarQube и не анализирует результат прохождения Порога качества (`sonarqube` -> `waitForQualityGate`). - * Если валидация EDT выполнялась через stebi, путь к результирующему файлу в формате `generic issues` необходимо передать утилите `sonar-scanner` как значение параметра `sonar.externalIssuesReportPaths`. При использовании `edt-ripper` необходимо передать путь к файлу в качестве значения параметра `sonar.bsl.languageserver.reportPaths` * Рассылка уведомлений: * Электронная почта: * Для отправки используется плагин [`email-ext`](https://plugins.jenkins.io/email-ext). Шаблоны сообщений конфигурируются в настройках плагина. @@ -211,3 +210,8 @@ pipeline1C() * Добавить расширение `YAXUnit` и дополнительные расширения с тестами можно в `jobConfiguration.json` -> `initInfobase` -> `extensions`. Они будут загружены при инициализации ИБ. * Если ваши тесты размещены в отдельных расширениях, скопируйте файл `./resources/yaxunit.json` из текущей библиотеки в свой репозиторий (`./tools/yaxunit.json`) и перечислите в нем имена ваших расширений. * Если используется собственный файл `tools/yaxunit.json`, то значение параметра reportPath в нем должно быть равно `./build/out/yaxunit/junit.xml` + +## Настройка шага resultsTransform + + * Если валидация EDT выполнялась через `stebi`, необходимо в `sonar-project.properties` указать `sonar.externalIssuesReportPaths=build/out/edt-issues.json` + * Если валидация EDT выполнялась через `edt-ripper`, необходимо в `sonar-project.properties` указать `sonar.bsl.languageserver.reportPaths=build/out/edt-issues.json` diff --git a/src/ru/pulsar/jenkins/library/configuration/GenericIssueFormat.groovy b/src/ru/pulsar/jenkins/library/configuration/GenericIssueFormat.groovy deleted file mode 100644 index c9cfce12..00000000 --- a/src/ru/pulsar/jenkins/library/configuration/GenericIssueFormat.groovy +++ /dev/null @@ -1,12 +0,0 @@ -package ru.pulsar.jenkins.library.configuration - -import com.fasterxml.jackson.annotation.JsonProperty - -enum GenericIssueFormat { - @JsonProperty("Generic_Issue") - GENERIC_ISSUE, - - @JsonProperty("Generic_Issue_10_3") - GENERIC_ISSUE_10_3 - -} \ No newline at end of file diff --git a/src/ru/pulsar/jenkins/library/configuration/ResultsTransformOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/ResultsTransformOptions.groovy index 28767095..2f4dcb77 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 ru.pulsar.jenkins.library.configuration.sonarqube.GenericIssueFormat @JsonIgnoreProperties(ignoreUnknown = true) class ResultsTransformOptions implements Serializable { diff --git a/src/ru/pulsar/jenkins/library/configuration/sonarqube/GenericIssueFormat.groovy b/src/ru/pulsar/jenkins/library/configuration/sonarqube/GenericIssueFormat.groovy new file mode 100644 index 00000000..518c6013 --- /dev/null +++ b/src/ru/pulsar/jenkins/library/configuration/sonarqube/GenericIssueFormat.groovy @@ -0,0 +1,24 @@ +package ru.pulsar.jenkins.library.configuration.sonarqube + +import com.fasterxml.jackson.annotation.JsonProperty +import com.fasterxml.jackson.annotation.JsonValue + +enum GenericIssueFormat { + @JsonProperty("Generic_Issue") + GENERIC_ISSUE("Generic_Issue"), + + @JsonProperty("Generic_Issue_10_3") + GENERIC_ISSUE_10_3("Generic_Issue_10_3") + + private String value + + private GenericIssueFormat(String value) { + this.value = value + } + + + String getValue() { + return value + } + +} \ No newline at end of file diff --git a/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy b/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy index 40045e5b..17f7aab1 100644 --- a/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy +++ b/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy @@ -1,7 +1,6 @@ package ru.pulsar.jenkins.library.steps import ru.pulsar.jenkins.library.IStepExecutor -import ru.pulsar.jenkins.library.configuration.GenericIssueFormat import ru.pulsar.jenkins.library.configuration.JobConfiguration import ru.pulsar.jenkins.library.configuration.ResultsTransformerType import ru.pulsar.jenkins.library.configuration.SourceFormat @@ -9,8 +8,6 @@ import ru.pulsar.jenkins.library.ioc.ContextRegistry import ru.pulsar.jenkins.library.utils.FileUtils import ru.pulsar.jenkins.library.utils.Logger -import java.nio.file.Paths - class ResultsTransformer implements Serializable { public static final String RESULT_STASH = 'edt-issues' @@ -46,10 +43,7 @@ class ResultsTransformer implements Serializable { Logger.println("Конвертация результата EDT в Generic Issue с помощью stebi") def genericIssueFile = "$env.WORKSPACE/$RESULT_FILE" - def genericIssuesFormat = "Generic_Issue" - if (config.resultsTransformOptions.genericIssueFormat == GenericIssueFormat.GENERIC_ISSUE_10_3) { - genericIssuesFormat = "Generic_Issue_10_3" - } + def genericIssuesFormat = config.resultsTransformOptions.genericIssueFormat.getValue() steps.cmd("stebi convert --Format $genericIssuesFormat -r $edtValidateFile $genericIssueFile $srcDir") 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 f85275ed..6bb7e476 100644 --- a/test/unit/groovy/ru/pulsar/jenkins/library/configuration/ConfigurationReaderTest.java +++ b/test/unit/groovy/ru/pulsar/jenkins/library/configuration/ConfigurationReaderTest.java @@ -4,6 +4,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import ru.pulsar.jenkins.library.configuration.sonarqube.GenericIssueFormat; import ru.pulsar.jenkins.library.utils.TestUtils; import java.io.IOException; From dd5f568f4474ebde048a756e8988d6b7710a45cd Mon Sep 17 00:00:00 2001 From: Dima Date: Sun, 28 Jul 2024 11:28:05 +0300 Subject: [PATCH 18/29] fix paths --- .../library/steps/DesignerToEdtFormatTransformation.groovy | 2 +- src/ru/pulsar/jenkins/library/steps/EdtValidate.groovy | 5 ++++- .../pulsar/jenkins/library/steps/ResultsTransformer.groovy | 7 ++++--- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/ru/pulsar/jenkins/library/steps/DesignerToEdtFormatTransformation.groovy b/src/ru/pulsar/jenkins/library/steps/DesignerToEdtFormatTransformation.groovy index 29c586e4..320fb609 100644 --- a/src/ru/pulsar/jenkins/library/steps/DesignerToEdtFormatTransformation.groovy +++ b/src/ru/pulsar/jenkins/library/steps/DesignerToEdtFormatTransformation.groovy @@ -35,7 +35,7 @@ class DesignerToEdtFormatTransformation implements Serializable { def workspaceDir = FileUtils.getFilePath("$env.WORKSPACE/$WORKSPACE") def srcDir = config.srcDir def configurationRoot = FileUtils.getFilePath("$env.WORKSPACE/$srcDir") - def projectName = config.srcDir.split(File.separator).last() + def projectName = configurationRoot.getName() def edtVersionForRing = EDT.ringModule(config) steps.deleteDir(workspaceDir) diff --git a/src/ru/pulsar/jenkins/library/steps/EdtValidate.groovy b/src/ru/pulsar/jenkins/library/steps/EdtValidate.groovy index a0f50a3b..70efc79f 100644 --- a/src/ru/pulsar/jenkins/library/steps/EdtValidate.groovy +++ b/src/ru/pulsar/jenkins/library/steps/EdtValidate.groovy @@ -38,7 +38,10 @@ class EdtValidate implements Serializable { steps.unstash(DesignerToEdtFormatTransformation.WORKSPACE_ZIP_STASH) steps.unzip(DesignerToEdtFormatTransformation.WORKSPACE, DesignerToEdtFormatTransformation.WORKSPACE_ZIP) - def projectName = config.srcDir.split(File.separator).last() + def srcDir = config.srcDir + def configurationRoot = FileUtils.getFilePath("$env.WORKSPACE/$srcDir") + + def projectName = configurationRoot.getName() projectList = "--project-name-list $projectName" } else { diff --git a/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy b/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy index 17f7aab1..fc6c6fc1 100644 --- a/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy +++ b/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy @@ -63,9 +63,10 @@ class ResultsTransformer implements Serializable { } - def splitDir = config.srcDir.split(File.separator) - def projectName = splitDir.last() - def srcDirExceptLast = splitDir.dropRight(1).join(File.separator) + srcDir = FileUtils.getFilePath("$env.WORKSPACE/$config.srcDir") + + def projectName = srcDir.getName() + def srcDirExceptLast = srcDir.getParent() steps.cmd("edt-ripper parse $edtValidateFile $srcDirExceptLast $projectName $env.WORKSPACE/$RESULT_FILE") From f528bd342115303477a5bf0c4e2bfd5f4031deb5 Mon Sep 17 00:00:00 2001 From: Dima Date: Sun, 28 Jul 2024 13:11:20 +0300 Subject: [PATCH 19/29] fix README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f516ab2b..7968cf2f 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ ## Ограничения +1. Хранение исходников в корне репозитория или в каталоге первого уровня (например, в `src`) не рекомендуется. 1. Для шага подготовки требуется любой агент с меткой `agent`. 1. Для запуска шага анализа SonarQube требуется агент с меткой `sonar`. 1. Для запуска шагов, работающих с EDT (валидация, трансформация формата исходников) требуется агент с меткой `edt` (если используется несколько версий EDT необходимо к метке добавить версию, например `edt@2021.3.4:x86_64`) и агент с меткой `oscript`, на котором глобально установлена библиотека [stebi](https://github.com/Stepa86/stebi) версии 1.11.1 и выше или [edt-ripper](https://github.com/bia-technologies/edt_ripper). @@ -211,7 +212,7 @@ pipeline1C() * Если ваши тесты размещены в отдельных расширениях, скопируйте файл `./resources/yaxunit.json` из текущей библиотеки в свой репозиторий (`./tools/yaxunit.json`) и перечислите в нем имена ваших расширений. * Если используется собственный файл `tools/yaxunit.json`, то значение параметра reportPath в нем должно быть равно `./build/out/yaxunit/junit.xml` -## Настройка шага resultsTransform +## Настройка трансформации результатов в шаге edtValidate * Если валидация EDT выполнялась через `stebi`, необходимо в `sonar-project.properties` указать `sonar.externalIssuesReportPaths=build/out/edt-issues.json` * Если валидация EDT выполнялась через `edt-ripper`, необходимо в `sonar-project.properties` указать `sonar.bsl.languageserver.reportPaths=build/out/edt-issues.json` From 45d5e8ab688b00280de8c9ac45371f548d110b04 Mon Sep 17 00:00:00 2001 From: Dima Date: Sun, 28 Jul 2024 13:41:02 +0300 Subject: [PATCH 20/29] fix README.md --- README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/README.md b/README.md index 7968cf2f..b717fb7d 100644 --- a/README.md +++ b/README.md @@ -211,8 +211,3 @@ pipeline1C() * Добавить расширение `YAXUnit` и дополнительные расширения с тестами можно в `jobConfiguration.json` -> `initInfobase` -> `extensions`. Они будут загружены при инициализации ИБ. * Если ваши тесты размещены в отдельных расширениях, скопируйте файл `./resources/yaxunit.json` из текущей библиотеки в свой репозиторий (`./tools/yaxunit.json`) и перечислите в нем имена ваших расширений. * Если используется собственный файл `tools/yaxunit.json`, то значение параметра reportPath в нем должно быть равно `./build/out/yaxunit/junit.xml` - -## Настройка трансформации результатов в шаге edtValidate - - * Если валидация EDT выполнялась через `stebi`, необходимо в `sonar-project.properties` указать `sonar.externalIssuesReportPaths=build/out/edt-issues.json` - * Если валидация EDT выполнялась через `edt-ripper`, необходимо в `sonar-project.properties` указать `sonar.bsl.languageserver.reportPaths=build/out/edt-issues.json` From e0f349a4758717e1f4516f94a581575b7c45dd89 Mon Sep 17 00:00:00 2001 From: Dima Date: Fri, 30 Aug 2024 17:09:49 +0300 Subject: [PATCH 21/29] fix defaults and doc --- README.md | 17 ++++++++++++----- resources/globalConfiguration.json | 2 +- resources/schema.json | 2 +- .../ResultsTransformOptions.groovy | 4 ++-- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 2cd18837..61aa22f0 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ 1. Запуск BDD сценариев с сохранением результатов в формате Allure. 1. Запуск юнит-тестов с помощью фреймворка YAXUnit с сохранением результатов в формате jUnit и Allure. 1. Запуск синтаксического контроля средствами конфигуратора и сохранение результатов в виде отчета jUnit. -1. Запуск валидации проекта средствами EDT и конвертация отчета в форматах BSL LS или Generic Issue. +1. Валидация проекта средствами EDT и трансформация отчета EDT в формат BSL LS с помощью `edt-ripper` или Generic Issue с помощью `stebi`. 1. Запуск статического анализа для SonarQube. 1. Публикация результатов junit и Allure в интерфейс Jenkins. @@ -150,7 +150,9 @@ pipeline1C() * Если в репозитории существует файл `./tools/syntax-check-exception-file.txt`, то команде запуска синтаксического контроля конфигурации данный файл будет передаваться как файл с исключениями сообщений об ошибках (параметр `--exception-file`) (`syntaxCheck` -> `exceptionFile`). * Конфигурационный файл по умолчанию уже содержит ряд "режимов проверки" для синтаксического контроля конфигурации (`syntaxCheck` -> `checkModes`). * Трансформация результатов валидации EDT: - * При использовании stebi по умолчанию из результатов анализа исключаются замечания, сработавшие на модулях с включенным запретом редактирования (желтый куб с замком) (параметры `resultsTransform` -> `removeSupport` и `resultsTransform` -> `supportLevel`). + * Используется `stebi` (параметр `resultsTransform` -> `transformer`) + * Формат файла - `generic issues` для SonarQube 10.3+ (параметр `resultsTransform` -> `genericIssueFormat`) + * `stebi` исключает из результатов анализа замечания, сработавшие на модулях с включенным запретом редактирования (желтый куб с замком) (параметры `resultsTransform` -> `removeSupport` и `resultsTransform` -> `supportLevel`). * Анализ SonarQube: * Предполагается наличие единственной настройки `SonarQube installation` (`sonarqube` -> `sonarQubeInstallation`). * Используется `sonar-scanner` из переменной окружения `PATH` (`sonarqube` -> `useSonarScannerFromPath`). @@ -174,9 +176,9 @@ pipeline1C() ## Настройка загрузки расширений -Если у вас есть расширения которые необходимо загрузить в базу для проведения тестов и проверок, это можно сделать на этапе подготовки базы. +Если у вас есть расширения, которые необходимо загрузить в базу для проведения тестов и проверок, это можно сделать на этапе подготовки базы. -* При загрузке из исходников расширения должны быть в том же формате(edt или конфигуратора) что и основная конфигурация. +* При загрузке из исходников расширения должны быть в том же формате (edt или конфигуратора), что и основная конфигурация. * Для загрузки расширений необходимо описать каждое из них в массиве (`initInfobase` -> `extensions`). Для загрузки расширений в информационную базу необходимо выполнить следующие шаги: @@ -234,4 +236,9 @@ pipeline1C() * Добавить расширение `YAXUnit` и дополнительные расширения с тестами можно в `jobConfiguration.json` -> `initInfobase` -> `extensions`. Они будут загружены при инициализации ИБ. * Если ваши тесты размещены в отдельных расширениях, скопируйте файл `./resources/yaxunit.json` из текущей библиотеки в свой репозиторий (`./tools/yaxunit.json`) и перечислите в нем имена ваших расширений. - * Если используется собственный файл `tools/yaxunit.json`, то значение параметра reportPath в нем должно быть равно `./build/out/yaxunit/junit.xml` + * Если используется собственный файл `tools/yaxunit.json`, то значение параметра `reportPath` в нем должно быть равно `./build/out/yaxunit/junit.xml` + +## Настройка трансформации результата валидации EDT + + * При использовании SonarQube версии <10.3 и `stebi` формат отчета должен быть `Generic_Issue` (параметр `resultsTransform` -> `genericIssueFormat`) + * Трансформацию результатов может выполнять `edt-ripper` (параметр `resultsTransform` -> `transformer`). В этом случае замечания будут загружены в SonarQube в формате BSL LS, что позволяет полноценно управлять ими в SonarQube. diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index 6486af0f..aa1af975 100644 --- a/resources/globalConfiguration.json +++ b/resources/globalConfiguration.json @@ -93,7 +93,7 @@ }, "resultsTransform": { "transformer": "stebi", - "genericIssueFormat": "Generic_Issue", + "genericIssueFormat": "Generic_Issue_10_3", "removeSupport": true, "supportLevel": 0 }, diff --git a/resources/schema.json b/resources/schema.json index f612008c..324f4446 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -359,7 +359,7 @@ }, "genericIssueFormat" : { "type" : "string", - "description" : "Формат отчета generic issue. Только для stebi.\n Для SonarQube 10.3+ необходимо использовать Generic_Issue_10_3.\n По умолчанию Generic_Issue\n ", + "description" : "Формат отчета generic issue. Только для stebi.\n Для SonarQube 10.3+ необходимо использовать Generic_Issue_10_3.\n По умолчанию Generic_Issue_10_3\n ", "enum" : [ "Generic_Issue", "Generic_Issue_10_3" ] } } diff --git a/src/ru/pulsar/jenkins/library/configuration/ResultsTransformOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/ResultsTransformOptions.groovy index 2f4dcb77..86f474e9 100644 --- a/src/ru/pulsar/jenkins/library/configuration/ResultsTransformOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/ResultsTransformOptions.groovy @@ -26,9 +26,9 @@ class ResultsTransformOptions implements Serializable { @JsonPropertyDescription("""Формат отчета generic issue. Только для stebi. Для SonarQube 10.3+ необходимо использовать Generic_Issue_10_3. - По умолчанию Generic_Issue + По умолчанию Generic_Issue_10_3 """) - GenericIssueFormat genericIssueFormat = GenericIssueFormat.GENERIC_ISSUE + GenericIssueFormat genericIssueFormat = GenericIssueFormat.GENERIC_ISSUE_10_3 @Override @NonCPS From 6561fe19a52dd002ab02b776f6f22ec2a7e4e31f Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Fri, 30 Aug 2024 16:21:24 +0200 Subject: [PATCH 22/29] =?UTF-8?q?=D0=A1=D0=BC=D0=B5=D0=BD=D0=B0=20=D0=B4?= =?UTF-8?q?=D0=B5=D1=84=D0=BE=D0=BB=D1=82=D0=BD=D0=BE=D0=B9=20=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D1=81=D0=B8=D0=B8=20=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=82?= =?UTF-8?q?=D1=82=D0=B5=D1=80=D0=B0=20=D1=81=D1=82=D0=B5=D0=B1=D0=B8=20?= =?UTF-8?q?=D0=BD=D0=B0=2010.3+?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/globalConfiguration.json | 2 +- resources/schema.json | 4 ++-- .../library/configuration/ResultsTransformOptions.groovy | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index 6486af0f..aa1af975 100644 --- a/resources/globalConfiguration.json +++ b/resources/globalConfiguration.json @@ -93,7 +93,7 @@ }, "resultsTransform": { "transformer": "stebi", - "genericIssueFormat": "Generic_Issue", + "genericIssueFormat": "Generic_Issue_10_3", "removeSupport": true, "supportLevel": 0 }, diff --git a/resources/schema.json b/resources/schema.json index f612008c..8a433eef 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -346,7 +346,7 @@ "properties" : { "transformer" : { "type" : "string", - "description" : "Способ преобразования замечаний.\n Поддерживается stebi и edt-ripper\n По умолчанию содержит значение \"stebi\".\n ", + "description" : "Способ преобразования замечаний.\n Поддерживается stebi и edt-ripper.\n По умолчанию содержит значение \"stebi\".\n ", "enum" : [ "stebi", "edt-ripper" ] }, "removeSupport" : { @@ -359,7 +359,7 @@ }, "genericIssueFormat" : { "type" : "string", - "description" : "Формат отчета generic issue. Только для stebi.\n Для SonarQube 10.3+ необходимо использовать Generic_Issue_10_3.\n По умолчанию Generic_Issue\n ", + "description" : "Формат отчета generic issue. Только для stebi.\n Для SonarQube старее 10.3 необходимо использовать Generic_Issue.\n По умолчанию Generic_Issue_10_3\n ", "enum" : [ "Generic_Issue", "Generic_Issue_10_3" ] } } diff --git a/src/ru/pulsar/jenkins/library/configuration/ResultsTransformOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/ResultsTransformOptions.groovy index 2f4dcb77..de471214 100644 --- a/src/ru/pulsar/jenkins/library/configuration/ResultsTransformOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/ResultsTransformOptions.groovy @@ -9,7 +9,7 @@ import ru.pulsar.jenkins.library.configuration.sonarqube.GenericIssueFormat class ResultsTransformOptions implements Serializable { @JsonPropertyDescription("""Способ преобразования замечаний. - Поддерживается stebi и edt-ripper + Поддерживается stebi и edt-ripper. По умолчанию содержит значение "stebi". """) ResultsTransformerType transformer = ResultsTransformerType.STEBI @@ -25,10 +25,10 @@ class ResultsTransformOptions implements Serializable { Integer supportLevel @JsonPropertyDescription("""Формат отчета generic issue. Только для stebi. - Для SonarQube 10.3+ необходимо использовать Generic_Issue_10_3. - По умолчанию Generic_Issue + Для SonarQube старее 10.3 необходимо использовать Generic_Issue. + По умолчанию Generic_Issue_10_3 """) - GenericIssueFormat genericIssueFormat = GenericIssueFormat.GENERIC_ISSUE + GenericIssueFormat genericIssueFormat = GenericIssueFormat.GENERIC_ISSUE_10_3 @Override @NonCPS From 571b37b054e35edb20708efd4b9884c926ee3e25 Mon Sep 17 00:00:00 2001 From: Dima Date: Fri, 30 Aug 2024 19:34:56 +0300 Subject: [PATCH 23/29] 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": { From 49fe3ea22abbe323c0e9268abb6755a7e0750914 Mon Sep 17 00:00:00 2001 From: Dima Date: Fri, 30 Aug 2024 19:47:41 +0300 Subject: [PATCH 24/29] fix edt srcDir --- .../jenkins/library/steps/ResultsTransformer.groovy | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy b/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy index fc6c6fc1..68c4ee5a 100644 --- a/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy +++ b/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy @@ -8,6 +8,8 @@ import ru.pulsar.jenkins.library.ioc.ContextRegistry import ru.pulsar.jenkins.library.utils.FileUtils import ru.pulsar.jenkins.library.utils.Logger +import java.nio.file.Paths + class ResultsTransformer implements Serializable { public static final String RESULT_STASH = 'edt-issues' @@ -36,7 +38,13 @@ class ResultsTransformer implements Serializable { ResultsTransformerType transformerType = config.resultsTransformOptions.transformer def edtValidateFile = "$env.WORKSPACE/$EdtValidate.RESULT_FILE" - def srcDir = FileUtils.getFilePath("$env.WORKSPACE/$config.srcDir") + def srcDir + if (config.sourceFormat == SourceFormat.DESIGNER) { + srcDir = FileUtils.getFilePath("$env.WORKSPACE/$config.srcDir") + } else { + def src = Paths.get(config.srcDir, "src") + srcDir = FileUtils.getFilePath("$env.WORKSPACE/$src") + } if (transformerType == ResultsTransformerType.STEBI) { From 28e298b7d532e22ff601084c36d33a4a1f3a2f1f Mon Sep 17 00:00:00 2001 From: Dima Ovcharenko Date: Sat, 31 Aug 2024 11:12:31 +0300 Subject: [PATCH 25/29] Update src/ru/pulsar/jenkins/library/configuration/ResultsTransformOptions.groovy Co-authored-by: Nikita Fedkin --- .../library/configuration/ResultsTransformOptions.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ru/pulsar/jenkins/library/configuration/ResultsTransformOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/ResultsTransformOptions.groovy index e46ba0ee..1e4ba92a 100644 --- a/src/ru/pulsar/jenkins/library/configuration/ResultsTransformOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/ResultsTransformOptions.groovy @@ -14,7 +14,7 @@ class ResultsTransformOptions implements Serializable { По умолчанию содержит значение "stebi". """) @JsonProperty(defaultValue = "stebi") - ResultsTransformerType transformer = ResultsTransformerType.STEBI + ResultsTransformerType transformer @JsonPropertyDescription("Фильтровать замечания по уровню поддержки модуля. Только для stebi. По умолчанию включено.") Boolean removeSupport = true From 453abf4ec6282ce858cf994c27c8a8f9b9b9f1bf Mon Sep 17 00:00:00 2001 From: Dima Date: Sat, 31 Aug 2024 11:20:19 +0300 Subject: [PATCH 26/29] fixes --- build.gradle.kts | 9 +++------ .../jenkins/library/steps/ResultsTransformer.groovy | 9 +-------- src/ru/pulsar/jenkins/library/steps/SonarScanner.groovy | 7 ------- 3 files changed, 4 insertions(+), 21 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index a8f141db..c3fc0d7e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -35,17 +35,14 @@ val junitVersion = "5.6.1" val spockVersion = "1.3-groovy-2.4" val groovyVersion = "2.4.19" val slf4jVersion = "1.8.0-beta4" -var jacksonVersion = "2.9.8" +val jsonschemaVersion = "4.36.0" dependencies { implementation("org.codehaus.groovy", "groovy-all", groovyVersion) - // 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") + implementation("com.github.victools", "jsonschema-generator", jsonschemaVersion) + implementation("com.github.victools", "jsonschema-module-jackson", jsonschemaVersion) // unit-tests testImplementation("org.junit.jupiter", "junit-jupiter-api", junitVersion) diff --git a/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy b/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy index 68c4ee5a..0eabf616 100644 --- a/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy +++ b/src/ru/pulsar/jenkins/library/steps/ResultsTransformer.groovy @@ -58,19 +58,12 @@ class ResultsTransformer implements Serializable { if (config.resultsTransformOptions.removeSupport) { def supportLevel = config.resultsTransformOptions.supportLevel steps.cmd("stebi transform --Format $genericIssuesFormat --remove_support $supportLevel --src $srcDir $genericIssueFile") - } + } } else { Logger.println("Конвертация результата EDT в Issues с помощью edt-ripper") - if (config.sourceFormat == SourceFormat.DESIGNER) { - - steps.unstash(DesignerToEdtFormatTransformation.WORKSPACE_ZIP_STASH) - steps.unzip(DesignerToEdtFormatTransformation.WORKSPACE, DesignerToEdtFormatTransformation.WORKSPACE_ZIP) - - } - srcDir = FileUtils.getFilePath("$env.WORKSPACE/$config.srcDir") def projectName = srcDir.getName() diff --git a/src/ru/pulsar/jenkins/library/steps/SonarScanner.groovy b/src/ru/pulsar/jenkins/library/steps/SonarScanner.groovy index 7d80da5e..5b9808b2 100644 --- a/src/ru/pulsar/jenkins/library/steps/SonarScanner.groovy +++ b/src/ru/pulsar/jenkins/library/steps/SonarScanner.groovy @@ -61,13 +61,6 @@ class SonarScanner implements Serializable { if (config.stageFlags.edtValidate) { steps.unstash(ResultsTransformer.RESULT_STASH) - if (config.sourceFormat == SourceFormat.DESIGNER) { - - steps.unstash(DesignerToEdtFormatTransformation.WORKSPACE_ZIP_STASH) - steps.unzip(DesignerToEdtFormatTransformation.WORKSPACE, DesignerToEdtFormatTransformation.WORKSPACE_ZIP) - - } - if (config.resultsTransformOptions.transformer == ResultsTransformerType.STEBI) { sonarCommand += " -Dsonar.externalIssuesReportPaths=" + ResultsTransformer.RESULT_FILE } else { From 6ae35d012bc52083897c8459d108d4e5507256b5 Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Sat, 31 Aug 2024 17:06:51 +0200 Subject: [PATCH 27/29] Dry-run pipeline1C test --- build.gradle.kts | 44 +++++++++++-------- test/integration/groovy/pipeline1cTest.groovy | 33 ++++++++++++++ 2 files changed, 59 insertions(+), 18 deletions(-) create mode 100644 test/integration/groovy/pipeline1cTest.groovy diff --git a/build.gradle.kts b/build.gradle.kts index c3fc0d7e..68b71f58 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,8 +5,8 @@ plugins { groovy jacoco id("com.mkobit.jenkins.pipelines.shared-library") version "0.10.1" - id("com.github.ben-manes.versions") version "0.28.0" - id("org.jenkins-ci.jpi") version "0.38.0" apply false + id("com.github.ben-manes.versions") version "0.51.0" + id("org.jenkins-ci.jpi") version "0.52.0-rc.1" apply false } repositories { @@ -28,13 +28,14 @@ tasks { } java { - sourceCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 } -val junitVersion = "5.6.1" +val junitVersion = "5.11.0" val spockVersion = "1.3-groovy-2.4" -val groovyVersion = "2.4.19" -val slf4jVersion = "1.8.0-beta4" +val groovyVersion = "2.4.21" +val slf4jVersion = "2.0.16" val jsonschemaVersion = "4.36.0" dependencies { @@ -48,8 +49,8 @@ dependencies { testImplementation("org.junit.jupiter", "junit-jupiter-api", junitVersion) testRuntimeOnly("org.junit.jupiter", "junit-jupiter-engine", junitVersion) - testImplementation("org.assertj", "assertj-core", "3.15.0") - testImplementation("org.mockito", "mockito-core", "5.11.0") + testImplementation("org.assertj", "assertj-core", "3.26.3") + testImplementation("org.mockito", "mockito-core", "5.13.0") testImplementation("org.slf4j", "slf4j-api", slf4jVersion) testImplementation("org.slf4j", "slf4j-simple", slf4jVersion) @@ -102,20 +103,27 @@ sharedLibrary { coreVersion.set(jenkinsIntegration.downloadDirectory.file("core-version.txt").map { it.asFile.readText().trim() }) // TODO: retrieve downloaded plugin resource pluginDependencies { - dependency("org.jenkins-ci.plugins", "pipeline-build-step", "2.12") - dependency("org.jenkins-ci.plugins", "pipeline-utility-steps", "2.8.0") - dependency("org.jenkins-ci.plugins", "git", "4.4.4") - dependency("org.jenkins-ci.plugins", "http_request", "1.15") - dependency("org.6wind.jenkins", "lockable-resources", "2.7") - dependency("ru.yandex.qatools.allure", "allure-jenkins-plugin", "2.28.1") - val declarativePluginsVersion = "1.6.0" + dependency("org.jenkins-ci.plugins", "pipeline-build-step", "540.vb_e8849e1a_b_d8") + dependency("org.jenkins-ci.plugins", "pipeline-utility-steps", "2.17.0") + dependency("org.jenkins-ci.plugins", "git", "5.2.2") + dependency("org.jenkins-ci.plugins", "http_request", "1.19") + dependency("org.jenkins-ci.plugins", "timestamper", "1.27") + dependency("org.jenkins-ci.plugins", "credentials", "1371.vfee6b_095f0a_3") + dependency("org.jenkins-ci.plugins", "token-macro", "400.v35420b_922dcb_") + dependency("org.jenkins-ci.plugins.workflow", "workflow-step-api", "678.v3ee58b_469476") + dependency("org.jenkins-ci.modules", "sshd", "3.329.v668e35efc720") + + dependency("org.6wind.jenkins", "lockable-resources", "1255.vf48745da_35d0") + dependency("ru.yandex.qatools.allure", "allure-jenkins-plugin", "2.31.1") + dependency("io.jenkins.blueocean", "blueocean-pipeline-api-impl", "1.27.14") + dependency("sp.sd", "file-operations", "266.v9d4e1eb_235b_a_") + + val declarativePluginsVersion = "2.2214.vb_b_34b_2ea_9b_83" dependency("org.jenkinsci.plugins", "pipeline-model-api", declarativePluginsVersion) - dependency("org.jenkinsci.plugins", "pipeline-model-declarative-agent", "1.1.1") dependency("org.jenkinsci.plugins", "pipeline-model-definition", declarativePluginsVersion) dependency("org.jenkinsci.plugins", "pipeline-model-extensions", declarativePluginsVersion) - dependency("io.jenkins.blueocean", "blueocean-pipeline-api-impl", "1.25.3") - dependency("sp.sd", "file-operations", "214.v2e7dc7f25757") + dependency("org.jenkinsci.plugins", "pipeline-model-declarative-agent", "1.1.1") } } diff --git a/test/integration/groovy/pipeline1cTest.groovy b/test/integration/groovy/pipeline1cTest.groovy new file mode 100644 index 00000000..5930571d --- /dev/null +++ b/test/integration/groovy/pipeline1cTest.groovy @@ -0,0 +1,33 @@ +import hudson.model.Label +import org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition +import org.jenkinsci.plugins.workflow.job.WorkflowJob +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.jvnet.hudson.test.JenkinsRule + +class pipeline1cTest { + + @Rule + public JenkinsRule rule = new JenkinsRule() + + @Before + void configureGlobalGitLibraries() { + RuleBootstrapper.setup(rule) + } + + @Test + void "pipeline1C should do something"() { + def pipeline = ''' + pipeline1C() + '''.stripIndent() + + rule.createSlave(Label.get("agent")) + final CpsFlowDefinition flow = new CpsFlowDefinition(pipeline, true) + final WorkflowJob workflowJob = rule.createProject(WorkflowJob, 'project') + workflowJob.definition = flow + + rule.assertLogContains('(pre-stage)', rule.buildAndAssertSuccess(workflowJob)) + } + +} From 2680dd67d6dd8bf630a6a951102d5a604c1e45e6 Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Sat, 31 Aug 2024 17:15:15 +0200 Subject: [PATCH 28/29] Cleanups --- build.gradle.kts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 68b71f58..3f5ed774 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -46,8 +46,8 @@ dependencies { implementation("com.github.victools", "jsonschema-module-jackson", jsonschemaVersion) // unit-tests - testImplementation("org.junit.jupiter", "junit-jupiter-api", junitVersion) testRuntimeOnly("org.junit.jupiter", "junit-jupiter-engine", junitVersion) + testImplementation("org.junit.jupiter", "junit-jupiter-api", junitVersion) testImplementation("org.assertj", "assertj-core", "3.26.3") testImplementation("org.mockito", "mockito-core", "5.13.0") @@ -76,7 +76,7 @@ tasks.test { } reports { - html.isEnabled = true + html.required.set(true) } } @@ -87,8 +87,8 @@ tasks.check { tasks.jacocoTestReport { reports { - xml.isEnabled = true - xml.destination = File("$buildDir/reports/jacoco/test/jacoco.xml") + xml.required.set(true) + xml.outputLocation.set(File("$buildDir/reports/jacoco/test/jacoco.xml")) } } From 65799d149784c216ad643ab0abf8dfb467f7756e Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Wed, 11 Sep 2024 23:26:13 +0200 Subject: [PATCH 29/29] =?UTF-8?q?=D0=9D=D0=B5=D0=B1=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D1=88=D0=BE=D0=B5=20=D1=83=D1=82=D0=BE=D1=87=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B4=D0=BE=D0=BA=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 61aa22f0..89c095ea 100644 --- a/README.md +++ b/README.md @@ -160,6 +160,7 @@ pipeline1C() * Применяется расчет аргументов командной строки для работы [`branch plugin`](https://github.com/mc1arke/sonarqube-community-branch-plugin) или коммерческих версий SonarQube (`sonarqube` -> `branchAnalysisConfiguration`). * Если разработка ведется с использованием подсистемы [БСП "Обновление версии ИБ"](https://its.1c.ru/db/bsp315doc#content:4:1:issogl1_обновление_версии_иб), то в значение параметра `sonar.projectVersion=$configurationVersion` утилиты `sonar-scanner` можно передавать версию из созданного общего модуля. Для этого необходимо заполнить параметр (`sonarqube` -> `infoBaseUpdateModuleName`). Если параметр не заполнен, версия передается из корня конфигурации. * По умолчанию шаг анализа не дожидается окончания фонового задания на сервере SonarQube и не анализирует результат прохождения Порога качества (`sonarqube` -> `waitForQualityGate`). + * Если выполнялась валидация EDT, результаты валидации передаются утилите `sonar-scanner` как значение параметра `sonar.externalIssuesReportPaths` при использовании `stebi` или как значение параметра `sonar.bsl.languageserver.reportPaths` при использовании `edt-ripper`. * Рассылка уведомлений: * Электронная почта: * Для отправки используется плагин [`email-ext`](https://plugins.jenkins.io/email-ext). Шаблоны сообщений конфигурируются в настройках плагина.