From 152c12d9f3af8cd3006aad311868fbeeb0983931 Mon Sep 17 00:00:00 2001 From: Dima Date: Fri, 17 Jan 2025 10:56:37 +0300 Subject: [PATCH 01/23] fix load extensions, fix README --- README.md | 4 ++-- .../library/steps/LoadExtensions.groovy | 22 ++++++++++++------- .../library/steps/LoadExtensionsTest.java | 8 +++---- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index f9a7e4d..450818e 100644 --- a/README.md +++ b/README.md @@ -259,8 +259,8 @@ pipeline1C() * [Coverage41C](https://github.com/1c-syntax/Coverage41C), его необходимо установить на агент отдельно * EDT нужной версии или отдельные jar-файлы из его каталога установки, подробнее см. в [Coverage41C/README.md](https://github.com/1c-syntax/Coverage41C) * Если на агенте Coverage41C не включен в PATH, необходимо указать полный путь к нему в параметре `coverage41CPath` -* Сбор замеров покрытия активируется для каждого стейджа отдельно с помощью установки параметра `"coverage": true` -* поддерживаются `bdd` и `yaxunit`, для использования замеров на стейже `smoke` ожидается исправление vanessa-add в этом [PR](https://github.com/vanessa-opensource/add/pull/1153) +* Сбор замеров покрытия активируется для каждого этапа отдельно с помощью установки параметра `"coverage": true` +* поддерживаются `bdd` и `yaxunit`, для использования замеров на этапе `smoke` ожидается исправление vanessa-add в этом [PR](https://github.com/vanessa-opensource/add/pull/1153) * Чтобы замеры в `bdd`, `yaxunit`, `smoke` могли выполняться параллельно **на одном агенте**, необходимо указывать для них разные порты отладки в параметре `dbgsPort`. * Не забудьте настроить подключение клиентов тестирования к серверу отладки. diff --git a/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy b/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy index 1f7bef3..a3fc41c 100644 --- a/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy +++ b/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy @@ -17,7 +17,7 @@ class LoadExtensions implements Serializable { private Extension[] extensionsFiltered - LoadExtensions(JobConfiguration config, String stageName = "") { + LoadExtensions(JobConfiguration config, String stageName) { this.config = config this.stageName = stageName } @@ -33,13 +33,19 @@ class LoadExtensions implements Serializable { def extensions = this.config.initInfoBaseOptions.extensions - if (this.stageName) { - this.extensionsFiltered = extensions.findAll { extension -> - extension.stages.contains(this.stageName) - } - } - else { - this.extensionsFiltered = extensions.findAll { extension -> extension.stages.length == 0 || extension.stages.contains("initInfoBase") } + // NB: расширения, подключаемые на этапе initInfoBase, остаются подключенными на всех остальных этапах + if (this.stageName == "initInfoBase") { + // подключаются все расширения, у которых явно указано подключение на текущем этапе + // и те расширения, в которых этапы подключения не указаны вообще + this.extensionsFiltered = extensions.findAll({ extension -> + extension.stages.contains(this.stageName) || extension.stages.length == 0 + }) + } else { + // на остальных этапах подключаются расширения, которые не были подключены на этапе initInfoBase + // и у которых явно указано подключение на текущем этапе + this.extensionsFiltered = extensions.findAll({ extension -> + !extension.stages.contains("initInfoBase") && extension.stages.contains(this.stageName) + }) } def env = steps.env() diff --git a/test/unit/groovy/ru/pulsar/jenkins/library/steps/LoadExtensionsTest.java b/test/unit/groovy/ru/pulsar/jenkins/library/steps/LoadExtensionsTest.java index d4eb127..ff92ec8 100644 --- a/test/unit/groovy/ru/pulsar/jenkins/library/steps/LoadExtensionsTest.java +++ b/test/unit/groovy/ru/pulsar/jenkins/library/steps/LoadExtensionsTest.java @@ -35,7 +35,7 @@ class LoadExtensionsTest { .thenReturn(new FilePath(new File("/"))); // given - // файл содержит 4 расширения для разных стейджей + // файл содержит 4 расширения для разных этапов String config = IOUtils.resourceToString( "jobConfiguration.json", StandardCharsets.UTF_8, @@ -44,11 +44,11 @@ class LoadExtensionsTest { JobConfiguration jobConfiguration = ConfigurationReader.create(config); // when - LoadExtensions loadExtensions = new LoadExtensions(jobConfiguration); - loadExtensions.run(); + LoadExtensions loadExtensionsInit = new LoadExtensions(jobConfiguration, "initInfoBase"); + loadExtensionsInit.run(); // then - InitInfoBaseOptions.Extension[] extensions = loadExtensions.getExtensionsFiltered(); + InitInfoBaseOptions.Extension[] extensions = loadExtensionsInit.getExtensionsFiltered(); assertThat(extensions.length).isEqualTo(2); assertThat(extensions[0].getName()).isEqualTo("mods"); assertThat(extensions[1].getName()).isEqualTo("mods2"); From 161a4f58b9f31ac37c1016e9ea0df1e85c09f468 Mon Sep 17 00:00:00 2001 From: Dima Date: Fri, 17 Jan 2025 13:18:50 +0300 Subject: [PATCH 02/23] mv syntaxCheck to separate class, add publish to allure --- resources/globalConfiguration.json | 5 +- resources/schema.json | 10 +- .../configuration/SyntaxCheckOptions.groovy | 20 ++-- .../jenkins/library/steps/SyntaxCheck.groovy | 96 +++++++++++++++++++ vars/pipeline1C.groovy | 16 +++- vars/syntaxCheck.groovy | 58 +---------- 6 files changed, 135 insertions(+), 70 deletions(-) create mode 100644 src/ru/pulsar/jenkins/library/steps/SyntaxCheck.groovy diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index 7e0e6e0..82688c9 100644 --- a/resources/globalConfiguration.json +++ b/resources/globalConfiguration.json @@ -64,7 +64,6 @@ }, "syntaxCheck": { "groupErrorsByMetadata": true, - "pathToJUnitReport": "./build/out/jUnit/syntax.xml", "exceptionFile": "./tools/syntax-check-exception-file.txt", "checkModes": [ "-ThinClient", @@ -79,7 +78,9 @@ "-CheckUseSynchronousCalls", "-DistributiveModules" ], - "vrunnerSettings": "./tools/vrunner.json" + "vrunnerSettings": "./tools/vrunner.json", + "publishToAllureReport": false, + "publishToJUnitReport": true }, "smoke": { "vrunnerSettings": "./tools/vrunner.json", diff --git a/resources/schema.json b/resources/schema.json index 5e03b5d..9158b85 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -378,9 +378,13 @@ "type" : "boolean", "description" : "Группировать выявленные ошибки по объектам метаданных.\n По умолчанию включено.\n " }, - "pathToJUnitReport" : { - "type" : "string", - "description" : "Путь к файлу отчета jUnit\n По умолчанию содержит значение \"./build/out/jUnit/syntax.xml\"\n " + "publishToAllureReport" : { + "type" : "boolean", + "description" : "Выполнять публикацию результатов в отчет Allure.\n По умолчанию выключено.\n " + }, + "publishToJUnitReport" : { + "type" : "boolean", + "description" : "Выполнять публикацию результатов в отчет JUnit.\n По умолчанию включено.\n " }, "vrunnerSettings" : { "type" : "string", diff --git a/src/ru/pulsar/jenkins/library/configuration/SyntaxCheckOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/SyntaxCheckOptions.groovy index ded2357..acd8425 100644 --- a/src/ru/pulsar/jenkins/library/configuration/SyntaxCheckOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/SyntaxCheckOptions.groovy @@ -7,11 +7,6 @@ import com.fasterxml.jackson.annotation.JsonPropertyDescription @JsonIgnoreProperties(ignoreUnknown = true) class SyntaxCheckOptions implements Serializable { - @JsonPropertyDescription("""Путь к файлу отчета jUnit - По умолчанию содержит значение "./build/out/jUnit/syntax.xml" - """) - String pathToJUnitReport = "./build/out/jUnit/syntax.xml" - @JsonPropertyDescription("""Группировать выявленные ошибки по объектам метаданных. По умолчанию включено. """) @@ -31,14 +26,25 @@ class SyntaxCheckOptions implements Serializable { """) String vrunnerSettings = "./tools/vrunner.json" + @JsonPropertyDescription("""Выполнять публикацию результатов в отчет Allure. + По умолчанию выключено. + """) + boolean publishToAllureReport + + @JsonPropertyDescription("""Выполнять публикацию результатов в отчет JUnit. + По умолчанию включено. + """) + boolean publishToJUnitReport + @Override @NonCPS String toString() { return "SyntaxCheckOptions{" + - "pathToJUnitReport='" + pathToJUnitReport + '\'' + ", groupErrorsByMetadata=" + groupErrorsByMetadata + ", checkModes=" + checkModes + ", vrunnerSettings=" + vrunnerSettings + - '}'; + ", publishToAllureReport=" + publishToAllureReport + + ", publishToJUnitReport=" + publishToJUnitReport + + '}' } } diff --git a/src/ru/pulsar/jenkins/library/steps/SyntaxCheck.groovy b/src/ru/pulsar/jenkins/library/steps/SyntaxCheck.groovy new file mode 100644 index 0000000..7b82084 --- /dev/null +++ b/src/ru/pulsar/jenkins/library/steps/SyntaxCheck.groovy @@ -0,0 +1,96 @@ +package ru.pulsar.jenkins.library.steps + +import hudson.FilePath +import ru.pulsar.jenkins.library.IStepExecutor +import ru.pulsar.jenkins.library.configuration.JobConfiguration +import ru.pulsar.jenkins.library.ioc.ContextRegistry +import ru.pulsar.jenkins.library.utils.FileUtils +import ru.pulsar.jenkins.library.utils.Logger +import ru.pulsar.jenkins.library.utils.VRunner + +class SyntaxCheck { + + public static final String ALLURE_STASH = 'syntax-check-allure' + + private final JobConfiguration config + + SyntaxCheck(JobConfiguration config) { + this.config = config + } + + def run() { + IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() + + Logger.printLocation() + + if (!config.stageFlags.syntaxCheck) { + Logger.println("Syntax-check step is disabled") + return + } + + def env = steps.env() + + def options = config.syntaxCheckOptions + + List logosConfig = ["LOGOS_CONFIG=$config.logosConfig"] + steps.withEnv(logosConfig) { + steps.installLocalDependencies() + + String junitReport = "build/out/jUnit/syntax-check/syntax-check.xml" + FilePath pathToJUnitReport = FileUtils.getFilePath("$env.WORKSPACE/$junitReport") + String junitReportDir = FileUtils.getLocalPath(pathToJUnitReport.getParent()) + + String allureReport = "build/out/allure/syntax-check/allure.xml" + FilePath pathToAllureReport = FileUtils.getFilePath("$env.WORKSPACE/$allureReport") + String allureReportDir = FileUtils.getLocalPath(pathToAllureReport.getParent()) + + String vrunnerPath = VRunner.getVRunnerPath() + String command = "$vrunnerPath syntax-check --ibconnection \"/F./build/ib\"" + + // Временно убрал передачу параметра. + // См. https://github.com/vanessa-opensource/vanessa-runner/issues/361 + // command += " --workspace $env.WORKSPACE" + + if (options.groupErrorsByMetadata) { + command += ' --groupbymetadata' + } + + if (options.publishToJUnitReport) { + steps.createDir(junitReportDir) + command += " --junitpath $pathToJUnitReport" + } + + if (options.publishToAllureReport) { + steps.createDir(allureReportDir) + command += " --allure-results2 $allureReportDir" + } + + FilePath vrunnerSettings = FileUtils.getFilePath("$env.WORKSPACE/$options.vrunnerSettings") + if (vrunnerSettings.exists()) { + command += " --settings $vrunnerSettings" + } + + if (!options.exceptionFile.empty && steps.fileExists(options.exceptionFile)) { + command += " --exception-file $options.exceptionFile" + } + + if (options.checkModes.length > 0) { + def checkModes = options.checkModes.join(" ") + command += " --mode $checkModes" + } + + // Запуск синтакс-проверки + VRunner.exec(command, true) + + if (options.publishToAllureReport) { + steps.stash(ALLURE_STASH, "$allureReportDir/**", true) + steps.archiveArtifacts("$allureReportDir/**") + } + + if (options.publishToJUnitReport) { + steps.junit("$junitReportDir/*.xml", true) + steps.archiveArtifacts("$junitReportDir/**") + } + } + } +} \ No newline at end of file diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index 867e383..fbd5444 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -248,9 +248,19 @@ void call() { beforeAgent true expression { config.stageFlags.syntaxCheck } } - steps { - timeout(time: config.timeoutOptions.syntaxCheck, unit: TimeUnit.MINUTES) { - syntaxCheck config + stages { + stage('Распаковка ИБ') { + steps { + unzipInfobase() + } + } + + stage('Выполнение синтаксического контроля') { + steps { + timeout(time: config.timeoutOptions.syntaxCheck, unit: TimeUnit.MINUTES) { + syntaxCheck config + } + } } } } diff --git a/vars/syntaxCheck.groovy b/vars/syntaxCheck.groovy index b879fdb..9d65085 100644 --- a/vars/syntaxCheck.groovy +++ b/vars/syntaxCheck.groovy @@ -1,64 +1,12 @@ -import hudson.FilePath import ru.pulsar.jenkins.library.configuration.JobConfiguration import ru.pulsar.jenkins.library.ioc.ContextRegistry -import ru.pulsar.jenkins.library.utils.FileUtils -import ru.pulsar.jenkins.library.utils.VRunner +import ru.pulsar.jenkins.library.steps.SyntaxCheck def call(JobConfiguration config) { ContextRegistry.registerDefaultContext(this) - // TODO: Вынести в отдельный класс по аналогии с SonarScanner + def syntaxCheck = new SyntaxCheck(config) + syntaxCheck.run() - printLocation() - - if (!config.stageFlags.syntaxCheck) { - echo("Syntax-check step is disabled") - return - } - - def options = config.syntaxCheckOptions - - installLocalDependencies() - - unzipInfobase() - - FilePath pathToJUnitReport = FileUtils.getFilePath("$env.WORKSPACE/$options.pathToJUnitReport") - - String outPath = pathToJUnitReport.getParent() - createDir(outPath) - - String vrunnerPath = VRunner.getVRunnerPath(); - String command = "$vrunnerPath syntax-check --ibconnection \"/F./build/ib\"" - - // Временно убрал передачу параметра. - // См. https://github.com/vanessa-opensource/vanessa-runner/issues/361 - // command += " --workspace $env.WORKSPACE" - - if (options.groupErrorsByMetadata) { - command += ' --groupbymetadata' - } - - command += " --junitpath $pathToJUnitReport"; - - FilePath vrunnerSettings = FileUtils.getFilePath("$env.WORKSPACE/$options.vrunnerSettings") - if (vrunnerSettings.exists()) { - command += " --settings $vrunnerSettings"; - } - - if (!options.exceptionFile.empty && fileExists(options.exceptionFile)) { - command += " --exception-file $options.exceptionFile" - } - - if (options.checkModes.length > 0) { - def checkModes = options.checkModes.join(" ") - command += " --mode $checkModes" - } - - // Запуск синтакс-проверки - VRunner.exec(command, true) - - junit allowEmptyResults: true, testResults: FileUtils.getLocalPath(pathToJUnitReport) - - archiveArtifacts FileUtils.getLocalPath(pathToJUnitReport) } From dc6a16050bb3c5c22dd282b676958795231262ad Mon Sep 17 00:00:00 2001 From: Dima Date: Fri, 17 Jan 2025 13:39:49 +0300 Subject: [PATCH 03/23] add unstash --- src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy b/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy index 40a58d6..638a6cb 100644 --- a/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy +++ b/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy @@ -39,6 +39,9 @@ class PublishAllure implements Serializable { if (config.stageFlags.smoke && config.smokeTestOptions.publishToAllureReport) { safeUnstash(SmokeTest.ALLURE_STASH) } + if (config.stageFlags.syntaxCheck && config.syntaxCheckOptions.publishToAllureReport) { + safeUnstash(SyntaxCheck.ALLURE_STASH) + } def env = steps.env() From 17020efcb7918bb38e23ae89488159bfdc8d0259 Mon Sep 17 00:00:00 2001 From: Dima Date: Fri, 17 Jan 2025 14:57:29 +0300 Subject: [PATCH 04/23] bump deps, add defaults, fix schema --- build.gradle.kts | 2 +- resources/schema.json | 20 +++++++++---------- .../configuration/SyntaxCheckOptions.groovy | 8 ++++++-- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 3f5ed77..b79790a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -36,7 +36,7 @@ val junitVersion = "5.11.0" val spockVersion = "1.3-groovy-2.4" val groovyVersion = "2.4.21" val slf4jVersion = "2.0.16" -val jsonschemaVersion = "4.36.0" +val jsonschemaVersion = "4.37.0" dependencies { implementation("org.codehaus.groovy", "groovy-all", groovyVersion) diff --git a/resources/schema.json b/resources/schema.json index 9158b85..3ab6f51 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -30,13 +30,11 @@ "properties" : { "coverage" : { "type" : "boolean", - "description" : "Выполнять замер покрытия", - "default" : "false" + "description" : "Выполнять замер покрытия" }, "dbgsPort" : { "type" : "integer", - "description" : "Порт, на котором будет запущен сервер отладки для замера покрытия", - "default" : "1550" + "description" : "Порт, на котором будет запущен сервер отладки для замера покрытия" }, "vrunnerSteps" : { "description" : "Шаги, запускаемые через vrunner.\n В каждой строке передается отдельная команда \n vrunner и ее аргументы (например, \"vanessa --settings ./tools/vrunner.json\").\n По умолчанию содержит одну команду \"vanessa --settings ./tools/vrunner.json\".\n ", @@ -250,12 +248,12 @@ "coverage" : { "type" : "boolean", "description" : "Выполнять замер покрытия", - "default" : "false" + "default" : false }, "dbgsPort" : { "type" : "integer", "description" : "Порт, на котором будет запущен сервер отладки для замера покрытия", - "default" : "1550" + "default" : 1550 }, "publishToAllureReport" : { "type" : "boolean", @@ -380,11 +378,13 @@ }, "publishToAllureReport" : { "type" : "boolean", - "description" : "Выполнять публикацию результатов в отчет Allure.\n По умолчанию выключено.\n " + "description" : "Выполнять публикацию результатов в отчет Allure.\n По умолчанию выключено.\n ", + "default": false }, "publishToJUnitReport" : { "type" : "boolean", - "description" : "Выполнять публикацию результатов в отчет JUnit.\n По умолчанию включено.\n " + "description" : "Выполнять публикацию результатов в отчет JUnit.\n По умолчанию включено.\n ", + "default": true }, "vrunnerSettings" : { "type" : "string", @@ -473,12 +473,12 @@ "coverage" : { "type" : "boolean", "description" : "Выполнять замер покрытия", - "default" : "false" + "default" : false }, "dbgsPort" : { "type" : "integer", "description" : "Порт, на котором будет запущен сервер отладки для замера покрытия", - "default" : "1550" + "default" : 1550 }, "publishToAllureReport" : { "type" : "boolean", diff --git a/src/ru/pulsar/jenkins/library/configuration/SyntaxCheckOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/SyntaxCheckOptions.groovy index acd8425..79c0d9f 100644 --- a/src/ru/pulsar/jenkins/library/configuration/SyntaxCheckOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/SyntaxCheckOptions.groovy @@ -2,6 +2,8 @@ package ru.pulsar.jenkins.library.configuration import com.cloudbees.groovy.cps.NonCPS import com.fasterxml.jackson.annotation.JsonIgnoreProperties +import com.fasterxml.jackson.annotation.JsonInclude +import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonPropertyDescription @JsonIgnoreProperties(ignoreUnknown = true) @@ -29,12 +31,14 @@ class SyntaxCheckOptions implements Serializable { @JsonPropertyDescription("""Выполнять публикацию результатов в отчет Allure. По умолчанию выключено. """) - boolean publishToAllureReport + @JsonProperty(defaultValue = "false") + boolean publishToAllureReport = false @JsonPropertyDescription("""Выполнять публикацию результатов в отчет JUnit. По умолчанию включено. """) - boolean publishToJUnitReport + @JsonProperty(defaultValue = "true") + boolean publishToJUnitReport = true @Override @NonCPS From b2347a317b81293a19f4fe33a163f36b9d3d62d2 Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Fri, 17 Jan 2025 21:59:02 +0100 Subject: [PATCH 05/23] Apply suggestions from code review --- resources/schema.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/resources/schema.json b/resources/schema.json index 3ab6f51..678c6a4 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -30,11 +30,13 @@ "properties" : { "coverage" : { "type" : "boolean", - "description" : "Выполнять замер покрытия" + "description" : "Выполнять замер покрытия", + "default" : false }, "dbgsPort" : { "type" : "integer", - "description" : "Порт, на котором будет запущен сервер отладки для замера покрытия" + "description" : "Порт, на котором будет запущен сервер отладки для замера покрытия", + "default" : 1550 }, "vrunnerSteps" : { "description" : "Шаги, запускаемые через vrunner.\n В каждой строке передается отдельная команда \n vrunner и ее аргументы (например, \"vanessa --settings ./tools/vrunner.json\").\n По умолчанию содержит одну команду \"vanessa --settings ./tools/vrunner.json\".\n ", From 2cb2dc6329a4c405dba8d4ade339b344fea75eea Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Fri, 17 Jan 2025 21:59:31 +0100 Subject: [PATCH 06/23] Update resources/schema.json --- resources/schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/schema.json b/resources/schema.json index 678c6a4..cae865f 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -36,7 +36,7 @@ "dbgsPort" : { "type" : "integer", "description" : "Порт, на котором будет запущен сервер отладки для замера покрытия", - "default" : 1550 + "default" : 1550 }, "vrunnerSteps" : { "description" : "Шаги, запускаемые через vrunner.\n В каждой строке передается отдельная команда \n vrunner и ее аргументы (например, \"vanessa --settings ./tools/vrunner.json\").\n По умолчанию содержит одну команду \"vanessa --settings ./tools/vrunner.json\".\n ", From 5660e0c4bf84c6d00de7202a26c31468a14a3cde Mon Sep 17 00:00:00 2001 From: Dima Date: Sun, 22 Dec 2024 14:38:22 +0300 Subject: [PATCH 07/23] add archiveInfobase --- resources/globalConfiguration.json | 1 + resources/schema.json | 4 ++++ .../pulsar/jenkins/library/IStepExecutor.groovy | 2 ++ src/ru/pulsar/jenkins/library/StepExecutor.groovy | 5 +++++ .../configuration/InitInfoBaseOptions.groovy | 6 ++++++ vars/pipeline1C.groovy | 2 +- vars/zipInfobase.groovy | 15 +++++++++------ 7 files changed, 28 insertions(+), 7 deletions(-) diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index 82688c9..83cfe2d 100644 --- a/resources/globalConfiguration.json +++ b/resources/globalConfiguration.json @@ -45,6 +45,7 @@ "additionalInitializationSteps": [], "templateDBPath": "", "vrunnerSettings": "./tools/vrunner.json", + "archiveInfobase": false, "extensions": [] }, "bdd": { diff --git a/resources/schema.json b/resources/schema.json index cae865f..99a9fc0 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -119,6 +119,10 @@ "type" : "boolean", "description" : "Запустить миграцию ИБ" }, + "archiveInfobase" : { + "type" : "boolean", + "description" : "\n Сохранить базу после выполнения всех шагов инициализации\n " + }, "templateDBPath" : { "type" : "string", "description" : "\n Путь к файлу эталонной базы данных.\n * По умолчанию не заполнен;\n * Указывается путь к файлу *.dt или *.1CD.\n " diff --git a/src/ru/pulsar/jenkins/library/IStepExecutor.groovy b/src/ru/pulsar/jenkins/library/IStepExecutor.groovy index 8a2f6e8..d0f6598 100644 --- a/src/ru/pulsar/jenkins/library/IStepExecutor.groovy +++ b/src/ru/pulsar/jenkins/library/IStepExecutor.groovy @@ -89,6 +89,8 @@ interface IStepExecutor { @SuppressWarnings('unused') def zip(String dir, String zipFile, String glob) + def zip(String dir, String zipFile, String glob, boolean archive) + def unzip(String dir, String zipFile) @SuppressWarnings('unused') diff --git a/src/ru/pulsar/jenkins/library/StepExecutor.groovy b/src/ru/pulsar/jenkins/library/StepExecutor.groovy index d02bbfc..b5ec920 100644 --- a/src/ru/pulsar/jenkins/library/StepExecutor.groovy +++ b/src/ru/pulsar/jenkins/library/StepExecutor.groovy @@ -196,6 +196,11 @@ class StepExecutor implements IStepExecutor { steps.zip dir: dir, zipFile: zipFile, glob: glob, overwrite: true } + @Override + def zip(String dir, String zipFile, String glob = '', boolean archive) { + steps.zip dir: dir, zipFile: zipFile, glob: glob, overwrite: true, archive: archive + } + @Override def unzip(String dir, String zipFile, quiet = true) { steps.unzip dir: dir, zipFile: zipFile, quiet: quiet diff --git a/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy index 32f7ca9..aaaa8ed 100644 --- a/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy @@ -40,6 +40,11 @@ class InitInfoBaseOptions implements Serializable { """) String templateDBPath + @JsonPropertyDescription(""" + Сохранить базу после выполнения всех шагов инициализации + """) + Boolean archiveInfobase + @JsonPropertyDescription("Массив расширений для загрузки в конфигурацию.") Extension[] extensions @@ -80,6 +85,7 @@ class InitInfoBaseOptions implements Serializable { ", vrunnerSettings=" + vrunnerSettings + ", templateDBPath=" + templateDBPath + ", additionalInitializationSteps=" + additionalInitializationSteps + + ", archiveInfobase=" + archiveInfobase + ", extensions=" + extensions + '}' } diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index fbd5444..da95889 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -144,7 +144,7 @@ void call() { timeout(time: config.timeoutOptions.zipInfoBase, unit: TimeUnit.MINUTES) { printLocation() - zipInfobase() + zipInfobase(config) } } } diff --git a/vars/zipInfobase.groovy b/vars/zipInfobase.groovy index 14bc94a..0f91871 100644 --- a/vars/zipInfobase.groovy +++ b/vars/zipInfobase.groovy @@ -1,7 +1,10 @@ -def call() { - if (fileExists('1Cv8.1CD.zip')) { - fileOperations([fileDeleteOperation(includes: '1Cv8.1CD.zip')]) - } - zip dir: 'build/ib', glob: '1Cv8.1CD', zipFile: '1Cv8.1CD.zip' - stash name: "1Cv8.1CD.zip", includes: "1Cv8.1CD.zip", allowEmpty: false +import ru.pulsar.jenkins.library.configuration.JobConfiguration + +def call(JobConfiguration config) { + + def archiveName = '1Cv8.1CD.zip' + + zip dir: 'build/ib', glob: '1Cv8.1CD', zipFile: archiveName, archive: config.initInfoBaseOptions.archiveInfobase + stash name: archiveName, includes: archiveName, allowEmpty: false + } From ca6b1b44784adec84eff985fe4da1e5606750491 Mon Sep 17 00:00:00 2001 From: Dima Date: Fri, 17 Jan 2025 18:35:30 +0300 Subject: [PATCH 08/23] rename yaxunit allure file for consistency --- src/ru/pulsar/jenkins/library/steps/Yaxunit.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ru/pulsar/jenkins/library/steps/Yaxunit.groovy b/src/ru/pulsar/jenkins/library/steps/Yaxunit.groovy index 317059e..7bffcc1 100644 --- a/src/ru/pulsar/jenkins/library/steps/Yaxunit.groovy +++ b/src/ru/pulsar/jenkins/library/steps/Yaxunit.groovy @@ -82,7 +82,7 @@ class Yaxunit implements Serializable, Coverable { } if (options.publishToAllureReport) { - String allureReport = "./build/out/allure/yaxunit/junit.xml" + String allureReport = "./build/out/allure/yaxunit/allure.xml" FilePath pathToAllureReport = FileUtils.getFilePath("$env.WORKSPACE/$allureReport") String allureReportDir = FileUtils.getLocalPath(pathToAllureReport.getParent()) From b92c12eae494fa2a05ca1f1720893ae0f983e07f Mon Sep 17 00:00:00 2001 From: Dima Date: Sat, 18 Jan 2025 16:03:42 +0300 Subject: [PATCH 09/23] =?UTF-8?q?=D0=BFgeneralize=20archive=20infobase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/globalConfiguration.json | 15 ++++- resources/schema.json | 55 +++++++++++++++---- src/JobConfigurationSchemaGenerator.java | 3 +- .../ArchiveInfobaseOptions.groovy | 31 +++++++++++ .../library/configuration/BddOptions.groovy | 5 ++ .../configuration/InitInfoBaseOptions.groovy | 5 +- .../jenkins/library/steps/ZipInfobase.groovy | 41 ++++++++++++++ vars/pipeline1C.groovy | 2 +- vars/zipInfobase.groovy | 12 ++-- 9 files changed, 144 insertions(+), 25 deletions(-) create mode 100644 src/ru/pulsar/jenkins/library/configuration/ArchiveInfobaseOptions.groovy create mode 100644 src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index 83cfe2d..b4708d5 100644 --- a/resources/globalConfiguration.json +++ b/resources/globalConfiguration.json @@ -45,13 +45,24 @@ "additionalInitializationSteps": [], "templateDBPath": "", "vrunnerSettings": "./tools/vrunner.json", - "archiveInfobase": false, + "archiveInfobase": { + "onAlways": false, + "onFailure": true, + "onUnstable": false, + "onSuccess": false + }, "extensions": [] }, "bdd": { "vrunnerSteps": [ "vanessa --settings ./tools/vrunner.json" ], + "archiveInfobase": { + "onAlways": false, + "onFailure": true, + "onUnstable": false, + "onSuccess": false + }, "coverage": false, "dbgsPort": 1550 }, @@ -59,7 +70,7 @@ "sonarQubeInstallation": "", "useSonarScannerFromPath": true, "sonarScannerToolName": "sonar-scanner", - "infoBaseUpdateModuleName" : "", + "infoBaseUpdateModuleName": "", "branchAnalysisConfiguration": "fromEnv", "waitForQualityGate": false }, diff --git a/resources/schema.json b/resources/schema.json index 99a9fc0..b4bbec0 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -1,6 +1,27 @@ { "$schema" : "http://json-schema.org/draft-07/schema#", "definitions" : { + "ArchiveInfobaseOptions" : { + "type" : "object", + "properties" : { + "onAlways" : { + "type" : "boolean", + "description" : "Сохранять всегда" + }, + "onFailure" : { + "type" : "boolean", + "description" : "Сохранять при падении сборки" + }, + "onSuccess" : { + "type" : "boolean", + "description" : "Сохранять при успешной сборке" + }, + "onUnstable" : { + "type" : "boolean", + "description" : "Сохранять при нестабильной сборке" + } + } + }, "EmailExtConfiguration" : { "type" : "object", "properties" : { @@ -28,15 +49,22 @@ "bdd" : { "type" : "object", "properties" : { + "archiveInfobase" : { + "allOf" : [ { + "$ref" : "#/definitions/ArchiveInfobaseOptions" + }, { + "description" : "Настройки сохранения базы после выполнения всех шагов\n " + } ] + }, "coverage" : { "type" : "boolean", "description" : "Выполнять замер покрытия", - "default" : false + "default" : "false" }, "dbgsPort" : { "type" : "integer", "description" : "Порт, на котором будет запущен сервер отладки для замера покрытия", - "default" : 1550 + "default" : "1550" }, "vrunnerSteps" : { "description" : "Шаги, запускаемые через vrunner.\n В каждой строке передается отдельная команда \n vrunner и ее аргументы (например, \"vanessa --settings ./tools/vrunner.json\").\n По умолчанию содержит одну команду \"vanessa --settings ./tools/vrunner.json\".\n ", @@ -80,6 +108,13 @@ "type" : "string" } }, + "archiveInfobase" : { + "allOf" : [ { + "$ref" : "#/definitions/ArchiveInfobaseOptions" + }, { + "description" : "Настройки сохранения базы после выполнения всех шагов\n " + } ] + }, "extensions" : { "description" : "Массив расширений для загрузки в конфигурацию.", "type" : "array", @@ -119,10 +154,6 @@ "type" : "boolean", "description" : "Запустить миграцию ИБ" }, - "archiveInfobase" : { - "type" : "boolean", - "description" : "\n Сохранить базу после выполнения всех шагов инициализации\n " - }, "templateDBPath" : { "type" : "string", "description" : "\n Путь к файлу эталонной базы данных.\n * По умолчанию не заполнен;\n * Указывается путь к файлу *.dt или *.1CD.\n " @@ -254,12 +285,12 @@ "coverage" : { "type" : "boolean", "description" : "Выполнять замер покрытия", - "default" : false + "default" : "false" }, "dbgsPort" : { "type" : "integer", "description" : "Порт, на котором будет запущен сервер отладки для замера покрытия", - "default" : 1550 + "default" : "1550" }, "publishToAllureReport" : { "type" : "boolean", @@ -385,12 +416,12 @@ "publishToAllureReport" : { "type" : "boolean", "description" : "Выполнять публикацию результатов в отчет Allure.\n По умолчанию выключено.\n ", - "default": false + "default" : "false" }, "publishToJUnitReport" : { "type" : "boolean", "description" : "Выполнять публикацию результатов в отчет JUnit.\n По умолчанию включено.\n ", - "default": true + "default" : "true" }, "vrunnerSettings" : { "type" : "string", @@ -479,12 +510,12 @@ "coverage" : { "type" : "boolean", "description" : "Выполнять замер покрытия", - "default" : false + "default" : "false" }, "dbgsPort" : { "type" : "integer", "description" : "Порт, на котором будет запущен сервер отладки для замера покрытия", - "default" : 1550 + "default" : "1550" }, "publishToAllureReport" : { "type" : "boolean", diff --git a/src/JobConfigurationSchemaGenerator.java b/src/JobConfigurationSchemaGenerator.java index 8a7246e..4fa0be1 100644 --- a/src/JobConfigurationSchemaGenerator.java +++ b/src/JobConfigurationSchemaGenerator.java @@ -33,7 +33,8 @@ public class JobConfigurationSchemaGenerator { writer.write(jsonSchema.toPrettyString()); System.out.println(jsonSchema.toPrettyString()); } catch (IOException e) { - e.printStackTrace(); + //noinspection CallToPrintStackTrace + e.printStackTrace(); } } diff --git a/src/ru/pulsar/jenkins/library/configuration/ArchiveInfobaseOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/ArchiveInfobaseOptions.groovy new file mode 100644 index 0000000..00b8da1 --- /dev/null +++ b/src/ru/pulsar/jenkins/library/configuration/ArchiveInfobaseOptions.groovy @@ -0,0 +1,31 @@ +package ru.pulsar.jenkins.library.configuration + +import com.cloudbees.groovy.cps.NonCPS +import com.fasterxml.jackson.annotation.JsonIgnoreProperties +import com.fasterxml.jackson.annotation.JsonPropertyDescription + +@JsonIgnoreProperties(ignoreUnknown = true) +class ArchiveInfobaseOptions implements Serializable { + + @JsonPropertyDescription("Сохранять всегда") + Boolean onAlways = false + @JsonPropertyDescription("Сохранять при успешной сборке") + Boolean onSuccess = false + @JsonPropertyDescription("Сохранять при падении сборки") + Boolean onFailure = false + @JsonPropertyDescription("Сохранять при нестабильной сборке") + Boolean onUnstable = false + + @Override + @NonCPS + String toString() { + return "ArchiveInfobaseOptions{" + + "onAlways=" + onAlways + + ", onSuccess=" + onSuccess + + ", onFailure=" + onFailure + + ", onUnstable=" + onUnstable + + '}'; + } +} + + diff --git a/src/ru/pulsar/jenkins/library/configuration/BddOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/BddOptions.groovy index d82a178..0f3687f 100644 --- a/src/ru/pulsar/jenkins/library/configuration/BddOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/BddOptions.groovy @@ -16,11 +16,16 @@ class BddOptions extends StepCoverageOptions implements Serializable { 'vanessa --settings ./tools/vrunner.json' ] + @JsonPropertyDescription("""Настройки сохранения базы после выполнения всех шагов + """) + ArchiveInfobaseOptions archiveInfobase + @Override @NonCPS String toString() { return "BddOptions{" + "vrunnerSteps=" + vrunnerSteps + + "archiveInfobase=" + archiveInfobase + "coverage=" + coverage + "dbgsPort=" + dbgsPort + '}' diff --git a/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy index aaaa8ed..3d8c0e5 100644 --- a/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy @@ -40,10 +40,9 @@ class InitInfoBaseOptions implements Serializable { """) String templateDBPath - @JsonPropertyDescription(""" - Сохранить базу после выполнения всех шагов инициализации + @JsonPropertyDescription("""Настройки сохранения базы после выполнения всех шагов """) - Boolean archiveInfobase + ArchiveInfobaseOptions archiveInfobase @JsonPropertyDescription("Массив расширений для загрузки в конфигурацию.") Extension[] extensions diff --git a/src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy b/src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy new file mode 100644 index 0000000..692c4f2 --- /dev/null +++ b/src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy @@ -0,0 +1,41 @@ +package ru.pulsar.jenkins.library.steps + +import hudson.model.Result +import ru.pulsar.jenkins.library.IStepExecutor +import ru.pulsar.jenkins.library.configuration.JobConfiguration +import ru.pulsar.jenkins.library.ioc.ContextRegistry +import ru.pulsar.jenkins.library.utils.Logger + +class ZipInfobase implements Serializable { + + private final JobConfiguration config + private final String stage + + ZipInfobase(JobConfiguration config, String stage) { + this.config = config + this.stage = stage + } + + def run() { + IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() + + Logger.printLocation() + + def currentBuild = steps.currentBuild() + def currentResult = Result.fromString(currentBuild.getCurrentResult()) + + def archiveInfobaseOptions = options.archiveInfobase + + def archiveInfobase = false + if (archiveInfobaseOptions.onAlways + || (archiveInfobaseOptions.onFailure && (currentResult == Result.FAILURE || currentResult == Result.ABORTED)) + || (archiveInfobaseOptions.onUnstable && currentResult == Result.UNSTABLE) + || (archiveInfobaseOptions.onSuccess && currentResult == Result.SUCCESS)) { + archiveInfobase = true + } + + def archiveName = "1Cv8.1CD.${stage}.zip" + steps.zip('build/ib', '1Cv8.1CD', archiveName, archiveInfobase) + steps.stash(archiveName, archiveName, false) + } +} diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index da95889..09a0964 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -144,7 +144,7 @@ void call() { timeout(time: config.timeoutOptions.zipInfoBase, unit: TimeUnit.MINUTES) { printLocation() - zipInfobase(config) + zipInfobase config, 'initInfobase' } } } diff --git a/vars/zipInfobase.groovy b/vars/zipInfobase.groovy index 0f91871..7c6faa1 100644 --- a/vars/zipInfobase.groovy +++ b/vars/zipInfobase.groovy @@ -1,10 +1,10 @@ import ru.pulsar.jenkins.library.configuration.JobConfiguration +import ru.pulsar.jenkins.library.ioc.ContextRegistry +import ru.pulsar.jenkins.library.steps.ZipInfobase -def call(JobConfiguration config) { - - def archiveName = '1Cv8.1CD.zip' - - zip dir: 'build/ib', glob: '1Cv8.1CD', zipFile: archiveName, archive: config.initInfoBaseOptions.archiveInfobase - stash name: archiveName, includes: archiveName, allowEmpty: false +def call(JobConfiguration config, String stageName) { + ContextRegistry.registerDefaultContext(this) + def zipInfobase = new ZipInfobase(config, stageName) + zipInfobase.run() } From 35110eaa40e397578ad414dba1af6e703fbb4449 Mon Sep 17 00:00:00 2001 From: Dima Date: Sat, 18 Jan 2025 16:26:35 +0300 Subject: [PATCH 10/23] fix merge configuration, add test --- .../jenkins/library/configuration/ConfigurationReader.groovy | 2 ++ .../library/configuration/ConfigurationReaderTest.java | 2 +- test/unit/resources/jobConfiguration.json | 5 ++++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy index 477fbfa..8588974 100644 --- a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy @@ -69,6 +69,7 @@ class ConfigurationReader implements Serializable { "yaxunitOptions", "syntaxCheckOptions", "resultsTransformOptions", + "archiveInfobase", "notificationsOptions", "emailNotificationOptions", "alwaysEmailOptions", @@ -83,6 +84,7 @@ class ConfigurationReader implements Serializable { mergeInitInfoBaseOptions(baseConfiguration.initInfoBaseOptions, configurationToMerge.initInfoBaseOptions) mergeBddOptions(baseConfiguration.bddOptions, configurationToMerge.bddOptions) mergeSyntaxCheckOptions(baseConfiguration.syntaxCheckOptions, configurationToMerge.syntaxCheckOptions) +// mergeArchiveInfobaseOptions(baseConfiguration.archiveInfobaseOptions, configurationToMerge.archiveInfobaseOptions) mergeNotificationsOptions(baseConfiguration.notificationsOptions, configurationToMerge.notificationsOptions) return baseConfiguration 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 07e5c37..27a56c4 100644 --- a/test/unit/groovy/ru/pulsar/jenkins/library/configuration/ConfigurationReaderTest.java +++ b/test/unit/groovy/ru/pulsar/jenkins/library/configuration/ConfigurationReaderTest.java @@ -2,7 +2,6 @@ package ru.pulsar.jenkins.library.configuration; import org.apache.commons.io.IOUtils; 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; @@ -66,6 +65,7 @@ class ConfigurationReaderTest { assertThat(jobConfiguration.getYaxunitOptions().getDbgsPort()).isEqualTo(1550); assertThat(jobConfiguration.getInitInfoBaseOptions().getRunMigration()).isFalse(); + assertThat(jobConfiguration.getInitInfoBaseOptions().getArchiveInfobase().getOnAlways()).isTrue(); assertThat(jobConfiguration.getInitInfoBaseOptions().getAdditionalInitializationSteps()).contains("vanessa --settings ./tools/vrunner.first.json"); assertThat(jobConfiguration.getBddOptions().getVrunnerSteps()).contains("vanessa --settings ./tools/vrunner.json"); diff --git a/test/unit/resources/jobConfiguration.json b/test/unit/resources/jobConfiguration.json index 48dfb6f..ef17112 100644 --- a/test/unit/resources/jobConfiguration.json +++ b/test/unit/resources/jobConfiguration.json @@ -48,7 +48,10 @@ "initInfoBase" ] } - ] + ], + "archiveInfobase": { + "onAlways": true + } }, "sonarqube": { "sonarQubeInstallation": "qa", From 34dca070264b3a0753aa820a26630e5afd81587f Mon Sep 17 00:00:00 2001 From: Dima Date: Sat, 18 Jan 2025 19:18:48 +0300 Subject: [PATCH 11/23] fix options --- .../jenkins/library/steps/ZipInfobase.groovy | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy b/src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy index 692c4f2..2f63f11 100644 --- a/src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy +++ b/src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy @@ -2,6 +2,7 @@ package ru.pulsar.jenkins.library.steps import hudson.model.Result import ru.pulsar.jenkins.library.IStepExecutor +import ru.pulsar.jenkins.library.configuration.ArchiveInfobaseOptions import ru.pulsar.jenkins.library.configuration.JobConfiguration import ru.pulsar.jenkins.library.ioc.ContextRegistry import ru.pulsar.jenkins.library.utils.Logger @@ -24,7 +25,7 @@ class ZipInfobase implements Serializable { def currentBuild = steps.currentBuild() def currentResult = Result.fromString(currentBuild.getCurrentResult()) - def archiveInfobaseOptions = options.archiveInfobase + def archiveInfobaseOptions = getArchiveInfobaseOptionsForStage(config, stage) def archiveInfobase = false if (archiveInfobaseOptions.onAlways @@ -38,4 +39,19 @@ class ZipInfobase implements Serializable { steps.zip('build/ib', '1Cv8.1CD', archiveName, archiveInfobase) steps.stash(archiveName, archiveName, false) } + + private static ArchiveInfobaseOptions getArchiveInfobaseOptionsForStage(JobConfiguration config, String stageName) { + + def defaultOptions = new ArchiveInfobaseOptions() + if (!stageName) { + return defaultOptions + } + + try { + return config."${stageName}Options".archiveInfobase + } catch(Exception e) { + Logger.println(e.message) + return defaultOptions + } + } } From 738a38e52dffb8b54edde89403f4274d123e869a Mon Sep 17 00:00:00 2001 From: Dima Date: Sat, 18 Jan 2025 20:35:52 +0300 Subject: [PATCH 12/23] fix case --- vars/pipeline1C.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index 09a0964..2e39db2 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -144,7 +144,7 @@ void call() { timeout(time: config.timeoutOptions.zipInfoBase, unit: TimeUnit.MINUTES) { printLocation() - zipInfobase config, 'initInfobase' + zipInfobase config, 'initInfoBase' } } } From 412a4c96704cf89ae066239bc25c83b03c609b8e Mon Sep 17 00:00:00 2001 From: Dima Date: Sat, 18 Jan 2025 21:44:55 +0300 Subject: [PATCH 13/23] fix params --- src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy b/src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy index 2f63f11..09eec1c 100644 --- a/src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy +++ b/src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy @@ -36,7 +36,7 @@ class ZipInfobase implements Serializable { } def archiveName = "1Cv8.1CD.${stage}.zip" - steps.zip('build/ib', '1Cv8.1CD', archiveName, archiveInfobase) + steps.zip('build/ib', archiveName, '1Cv8.1CD', archiveInfobase) steps.stash(archiveName, archiveName, false) } From 7a9ccaf28aecfcc844e7cb5e5f73ff241ce538bf Mon Sep 17 00:00:00 2001 From: Dima Date: Sun, 19 Jan 2025 11:53:31 +0300 Subject: [PATCH 14/23] fix default param --- src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy | 7 ++++++- vars/pipeline1C.groovy | 2 +- vars/zipInfobase.groovy | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy b/src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy index 09eec1c..a47f67f 100644 --- a/src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy +++ b/src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy @@ -35,7 +35,12 @@ class ZipInfobase implements Serializable { archiveInfobase = true } - def archiveName = "1Cv8.1CD.${stage}.zip" + def archiveName + if (!stage) { + archiveName = "1Cv8.1CD.zip" + } else { + archiveName = "1Cv8.1CD.${stage}.zip" + } steps.zip('build/ib', archiveName, '1Cv8.1CD', archiveInfobase) steps.stash(archiveName, archiveName, false) } diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index 2e39db2..7ddb4f0 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -144,7 +144,7 @@ void call() { timeout(time: config.timeoutOptions.zipInfoBase, unit: TimeUnit.MINUTES) { printLocation() - zipInfobase config, 'initInfoBase' + zipInfobase config } } } diff --git a/vars/zipInfobase.groovy b/vars/zipInfobase.groovy index 7c6faa1..db9d9fc 100644 --- a/vars/zipInfobase.groovy +++ b/vars/zipInfobase.groovy @@ -2,7 +2,7 @@ import ru.pulsar.jenkins.library.configuration.JobConfiguration import ru.pulsar.jenkins.library.ioc.ContextRegistry import ru.pulsar.jenkins.library.steps.ZipInfobase -def call(JobConfiguration config, String stageName) { +def call(JobConfiguration config, String stageName = '') { ContextRegistry.registerDefaultContext(this) def zipInfobase = new ZipInfobase(config, stageName) From f77ac272c242e5ed0eaab79a06cbc4d629e58a5d Mon Sep 17 00:00:00 2001 From: Dima Date: Sun, 19 Jan 2025 12:14:10 +0300 Subject: [PATCH 15/23] fix conditions, add bdd --- .../jenkins/library/steps/ZipInfobase.groovy | 14 ++++++++------ vars/pipeline1C.groovy | 12 +++++++++++- vars/zipInfobase.groovy | 2 +- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy b/src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy index a47f67f..4b585ee 100644 --- a/src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy +++ b/src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy @@ -27,6 +27,14 @@ class ZipInfobase implements Serializable { def archiveInfobaseOptions = getArchiveInfobaseOptionsForStage(config, stage) + def archiveName + if (stage == 'initInfoBase') { + archiveName = "1Cv8.1CD.zip" + } else { + archiveName = "1Cv8.1CD.${stage}.zip" + } + + // опция отвечает только за то, будет ли файл сохранен в виде артефакта def archiveInfobase = false if (archiveInfobaseOptions.onAlways || (archiveInfobaseOptions.onFailure && (currentResult == Result.FAILURE || currentResult == Result.ABORTED)) @@ -35,12 +43,6 @@ class ZipInfobase implements Serializable { archiveInfobase = true } - def archiveName - if (!stage) { - archiveName = "1Cv8.1CD.zip" - } else { - archiveName = "1Cv8.1CD.${stage}.zip" - } steps.zip('build/ib', archiveName, '1Cv8.1CD', archiveInfobase) steps.stash(archiveName, archiveName, false) } diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index 7ddb4f0..70d4013 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -144,7 +144,7 @@ void call() { timeout(time: config.timeoutOptions.zipInfoBase, unit: TimeUnit.MINUTES) { printLocation() - zipInfobase config + zipInfobase config, 'initInfoBase' } } } @@ -237,6 +237,16 @@ void call() { } } } + + stage('Архивация ИБ') { + steps { + timeout(time: config.timeoutOptions.zipInfoBase, unit: TimeUnit.MINUTES) { + printLocation() + + zipInfobase config, 'bdd' + } + } + } } } diff --git a/vars/zipInfobase.groovy b/vars/zipInfobase.groovy index db9d9fc..7c6faa1 100644 --- a/vars/zipInfobase.groovy +++ b/vars/zipInfobase.groovy @@ -2,7 +2,7 @@ import ru.pulsar.jenkins.library.configuration.JobConfiguration import ru.pulsar.jenkins.library.ioc.ContextRegistry import ru.pulsar.jenkins.library.steps.ZipInfobase -def call(JobConfiguration config, String stageName = '') { +def call(JobConfiguration config, String stageName) { ContextRegistry.registerDefaultContext(this) def zipInfobase = new ZipInfobase(config, stageName) From f5384e87bcb31da1f4a85c5c514aeab3b95d1df9 Mon Sep 17 00:00:00 2001 From: Dima Date: Mon, 20 Jan 2025 11:17:29 +0300 Subject: [PATCH 16/23] fix schema, rm commented code --- resources/schema.json | 12 ++++++------ .../library/configuration/ConfigurationReader.groovy | 1 - 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/resources/schema.json b/resources/schema.json index b4bbec0..3f7f39f 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -59,12 +59,12 @@ "coverage" : { "type" : "boolean", "description" : "Выполнять замер покрытия", - "default" : "false" + "default" : false }, "dbgsPort" : { "type" : "integer", "description" : "Порт, на котором будет запущен сервер отладки для замера покрытия", - "default" : "1550" + "default" : 1550 }, "vrunnerSteps" : { "description" : "Шаги, запускаемые через vrunner.\n В каждой строке передается отдельная команда \n vrunner и ее аргументы (например, \"vanessa --settings ./tools/vrunner.json\").\n По умолчанию содержит одну команду \"vanessa --settings ./tools/vrunner.json\".\n ", @@ -285,12 +285,12 @@ "coverage" : { "type" : "boolean", "description" : "Выполнять замер покрытия", - "default" : "false" + "default" : false }, "dbgsPort" : { "type" : "integer", "description" : "Порт, на котором будет запущен сервер отладки для замера покрытия", - "default" : "1550" + "default" : 1550 }, "publishToAllureReport" : { "type" : "boolean", @@ -510,12 +510,12 @@ "coverage" : { "type" : "boolean", "description" : "Выполнять замер покрытия", - "default" : "false" + "default" : false }, "dbgsPort" : { "type" : "integer", "description" : "Порт, на котором будет запущен сервер отладки для замера покрытия", - "default" : "1550" + "default" : 1550 }, "publishToAllureReport" : { "type" : "boolean", diff --git a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy index 8588974..c113fd7 100644 --- a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy @@ -84,7 +84,6 @@ class ConfigurationReader implements Serializable { mergeInitInfoBaseOptions(baseConfiguration.initInfoBaseOptions, configurationToMerge.initInfoBaseOptions) mergeBddOptions(baseConfiguration.bddOptions, configurationToMerge.bddOptions) mergeSyntaxCheckOptions(baseConfiguration.syntaxCheckOptions, configurationToMerge.syntaxCheckOptions) -// mergeArchiveInfobaseOptions(baseConfiguration.archiveInfobaseOptions, configurationToMerge.archiveInfobaseOptions) mergeNotificationsOptions(baseConfiguration.notificationsOptions, configurationToMerge.notificationsOptions) return baseConfiguration From 5b09027f936707c29313a0b5320bc1ce711f0c9d Mon Sep 17 00:00:00 2001 From: Dima Date: Mon, 20 Jan 2025 14:14:13 +0300 Subject: [PATCH 17/23] upd README.md --- README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 450818e..4e24a5b 100644 --- a/README.md +++ b/README.md @@ -46,12 +46,12 @@ 1. Запуск юнит-тестов с помощью фреймворка YAXUnit с сохранением результатов в формате jUnit и Allure. 1. Запуск синтаксического контроля средствами конфигуратора и сохранение результатов в виде отчета jUnit. 1. Валидация проекта средствами EDT и трансформация отчета EDT в формат BSL LS с помощью `edt-ripper` или Generic Issue с помощью `stebi`. - 1. Запуск статического анализа для SonarQube. 1. Публикация результатов junit и Allure в интерфейс Jenkins. 1. Рассылка результатов сборки на почту и в Telegram. 1. Конфигурирование логгера запускаемых oscript-приложений. 1. Замер покрытия при выполнении тестов. +1. Возможность сохранить информационную базу в виде артефакта сборки после выполнения шагов инициализации и\или после выполнения сценарных тестов. ## Подключение @@ -312,3 +312,12 @@ jobConfiguration.json * При изменении портов отладки в jobConfiguration.json не забывайте менять порты в настройках соответствующих шагов (и наоборот) * Настоятельно рекомендуется использовать не "постоянные" агенты Jenkins, а контейнеры docker. При выполнении билдов в контейнерах можно использовать исключительно стандартный порт 1550. + +## Сохранение ИБ в виде артефакта сборки + +Параметры `initInfobase` -> `archiveInfobase` и `bdd` -> `archiveInfobase` отвечают за сохранение информационной базы в виде артефакта сборки после выполнения соответствующих этапов. +Можно управлять тем, при каких статусах сборки ИБ будет сохранена, см. `onAlways`, `onFailure`, `onUnstable`, `onSuccess`. + +Имя файла формируется следующим образом: +* для шага `initInfoBase`: '1Cv8.1CD.zip' +* для шага `bdd`: '1Cv8.1CD.bdd.zip' From 2469669695217bd3c5bc969b1bf8ba59c2941734 Mon Sep 17 00:00:00 2001 From: Dima Date: Mon, 20 Jan 2025 14:16:14 +0300 Subject: [PATCH 18/23] add file rm if exists --- src/ru/pulsar/jenkins/library/IStepExecutor.groovy | 6 ++++++ src/ru/pulsar/jenkins/library/StepExecutor.groovy | 11 +++++++++++ .../pulsar/jenkins/library/steps/ZipInfobase.groovy | 3 +++ 3 files changed, 20 insertions(+) diff --git a/src/ru/pulsar/jenkins/library/IStepExecutor.groovy b/src/ru/pulsar/jenkins/library/IStepExecutor.groovy index d0f6598..9fdd8a7 100644 --- a/src/ru/pulsar/jenkins/library/IStepExecutor.groovy +++ b/src/ru/pulsar/jenkins/library/IStepExecutor.groovy @@ -10,6 +10,7 @@ import org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper import ru.pulsar.jenkins.library.configuration.JobConfiguration import ru.pulsar.jenkins.library.configuration.StepCoverageOptions import ru.pulsar.jenkins.library.steps.Coverable +import sp.sd.fileoperations.FileOperation interface IStepExecutor { @@ -34,6 +35,10 @@ interface IStepExecutor { boolean fileExists(String file) + void fileOperations(List fileOperations) + + void fileDeleteOperation(String includes) + void echo(message) def cmd(String script, boolean returnStatus, boolean returnStdout) @@ -122,4 +127,5 @@ interface IStepExecutor { def brokenTestsSuspects() RunWrapper currentBuild() + } \ No newline at end of file diff --git a/src/ru/pulsar/jenkins/library/StepExecutor.groovy b/src/ru/pulsar/jenkins/library/StepExecutor.groovy index b5ec920..50372f8 100644 --- a/src/ru/pulsar/jenkins/library/StepExecutor.groovy +++ b/src/ru/pulsar/jenkins/library/StepExecutor.groovy @@ -11,6 +11,7 @@ import ru.pulsar.jenkins.library.configuration.JobConfiguration import ru.pulsar.jenkins.library.configuration.StepCoverageOptions import ru.pulsar.jenkins.library.steps.Coverable import ru.yandex.qatools.allure.jenkins.config.ResultsConfig +import sp.sd.fileoperations.FileOperation class StepExecutor implements IStepExecutor { @@ -55,6 +56,16 @@ class StepExecutor implements IStepExecutor { steps.fileExists file } + @Override + void fileOperations(List fileOperations) { + steps.fileOperations fileOperations + } + + @Override + void fileDeleteOperation(String includes) { + steps.fileDeleteOperation includes: includes, excludes: '', useDefaultExcludes: true + } + @Override FileWrapper[] findFiles(String glob, String excludes = '') { steps.findFiles glob: glob, excludes: excludes diff --git a/src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy b/src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy index 4b585ee..1d39909 100644 --- a/src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy +++ b/src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy @@ -43,6 +43,9 @@ class ZipInfobase implements Serializable { archiveInfobase = true } + if (steps.fileExists(archiveName)) { + steps.fileOperations([steps.fileDeleteOperation(archiveName)]) + } steps.zip('build/ib', archiveName, '1Cv8.1CD', archiveInfobase) steps.stash(archiveName, archiveName, false) } From 845e70ff3f67010ed7f0e810a81caf633f7d1ea1 Mon Sep 17 00:00:00 2001 From: Dima Date: Mon, 20 Jan 2025 15:05:40 +0300 Subject: [PATCH 19/23] fix defaults --- README.md | 2 ++ resources/globalConfiguration.json | 4 ++-- src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4e24a5b..3c69682 100644 --- a/README.md +++ b/README.md @@ -168,6 +168,8 @@ pipeline1C() * Если разработка ведется с использованием подсистемы [БСП "Обновление версии ИБ"](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`. +* Сохранение ИБ в виде артефакта: + * На этапах `initInfobase` и `bdd` база сохраняется в виде артефакта при статусе `UNSTABLE` и `FAILURE` * Рассылка уведомлений: * Электронная почта: * Для отправки используется плагин [`email-ext`](https://plugins.jenkins.io/email-ext). Шаблоны сообщений конфигурируются в настройках плагина. diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index b4708d5..4057488 100644 --- a/resources/globalConfiguration.json +++ b/resources/globalConfiguration.json @@ -48,7 +48,7 @@ "archiveInfobase": { "onAlways": false, "onFailure": true, - "onUnstable": false, + "onUnstable": true, "onSuccess": false }, "extensions": [] @@ -60,7 +60,7 @@ "archiveInfobase": { "onAlways": false, "onFailure": true, - "onUnstable": false, + "onUnstable": true, "onSuccess": false }, "coverage": false, diff --git a/src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy b/src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy index 1d39909..34ba465 100644 --- a/src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy +++ b/src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy @@ -61,7 +61,7 @@ class ZipInfobase implements Serializable { return config."${stageName}Options".archiveInfobase } catch(Exception e) { Logger.println(e.message) - return defaultOptions + return defaultOptions } } } From 1eafa081299a00bc933e8ff7447d5081d045c9fd Mon Sep 17 00:00:00 2001 From: Dima Date: Mon, 20 Jan 2025 15:10:03 +0300 Subject: [PATCH 20/23] improve exceptions --- src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy b/src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy index 34ba465..26535c1 100644 --- a/src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy +++ b/src/ru/pulsar/jenkins/library/steps/ZipInfobase.groovy @@ -59,8 +59,9 @@ class ZipInfobase implements Serializable { try { return config."${stageName}Options".archiveInfobase - } catch(Exception e) { - Logger.println(e.message) + } catch(MissingPropertyException | NullPointerException e) { + Logger.println("Ошибка при получении настроек архивации для этапа ${stageName}: ${e.message}") + Logger.println(e.toString()) return defaultOptions } } From 296660e2a83062147e01ecba4edeb6c6f8f61176 Mon Sep 17 00:00:00 2001 From: Dima Date: Tue, 21 Jan 2025 10:26:32 +0300 Subject: [PATCH 21/23] fix defaults --- resources/globalConfiguration.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index 4057488..5c5fdc7 100644 --- a/resources/globalConfiguration.json +++ b/resources/globalConfiguration.json @@ -47,8 +47,8 @@ "vrunnerSettings": "./tools/vrunner.json", "archiveInfobase": { "onAlways": false, - "onFailure": true, - "onUnstable": true, + "onFailure": false, + "onUnstable": false, "onSuccess": false }, "extensions": [] @@ -59,8 +59,8 @@ ], "archiveInfobase": { "onAlways": false, - "onFailure": true, - "onUnstable": true, + "onFailure": false, + "onUnstable": false, "onSuccess": false }, "coverage": false, From 385bf6a7c8050f5399ae086e83c53923a4c4db78 Mon Sep 17 00:00:00 2001 From: Dima Date: Tue, 21 Jan 2025 10:27:26 +0300 Subject: [PATCH 22/23] upd README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 3c69682..51bceea 100644 --- a/README.md +++ b/README.md @@ -168,8 +168,7 @@ pipeline1C() * Если разработка ведется с использованием подсистемы [БСП "Обновление версии ИБ"](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`. -* Сохранение ИБ в виде артефакта: - * На этапах `initInfobase` и `bdd` база сохраняется в виде артефакта при статусе `UNSTABLE` и `FAILURE` +* Информационная база по умолчанию не сохраняется в виде артефакта сборки. * Рассылка уведомлений: * Электронная почта: * Для отправки используется плагин [`email-ext`](https://plugins.jenkins.io/email-ext). Шаблоны сообщений конфигурируются в настройках плагина. From a6aad1b622e22ec7bddd17824b6a3bc23ffd2372 Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Fri, 24 Jan 2025 09:19:10 +0100 Subject: [PATCH 23/23] Apply suggestions from code review --- resources/schema.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/schema.json b/resources/schema.json index 3f7f39f..ab93555 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -416,12 +416,12 @@ "publishToAllureReport" : { "type" : "boolean", "description" : "Выполнять публикацию результатов в отчет Allure.\n По умолчанию выключено.\n ", - "default" : "false" + "default" : false }, "publishToJUnitReport" : { "type" : "boolean", "description" : "Выполнять публикацию результатов в отчет JUnit.\n По умолчанию включено.\n ", - "default" : "true" + "default" : true }, "vrunnerSettings" : { "type" : "string",