From 5660e0c4bf84c6d00de7202a26c31468a14a3cde Mon Sep 17 00:00:00 2001 From: Dima Date: Sun, 22 Dec 2024 14:38:22 +0300 Subject: [PATCH 01/16] 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 82688c94..83cfe2db 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 cae865f1..99a9fc03 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 8a2f6e8c..d0f6598a 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 d02bbfc9..b5ec9208 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 32f7ca9f..aaaa8ed4 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 fbd54449..da958890 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 14bc94ae..0f918713 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 02/16] 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 317059e0..7bffcc1b 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 03/16] =?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 83cfe2db..b4708d51 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 99a9fc03..b4bbec04 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 8a7246e8..4fa0be19 100644 --- a/src/JobConfigurationSchemaGenerator.java +++ b/src/JobConfigurationSchemaGenerator.java @@ -33,7 +33,8 @@ public static void main(String[] args) { 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 00000000..00b8da1f --- /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 d82a1788..0f3687f2 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 aaaa8ed4..3d8c0e50 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 00000000..692c4f2b --- /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 da958890..09a09648 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 0f918713..7c6faa1a 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 04/16] 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 477fbfa3..8588974f 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 07e5c37a..27a56c4c 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 @@ 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 @@ void testCreateJobConfigurationObject() throws IOException { 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 48dfb6fd..ef17112d 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 05/16] 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 692c4f2b..2f63f11a 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 06/16] fix case --- vars/pipeline1C.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index 09a09648..2e39db25 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 07/16] 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 2f63f11a..09eec1c9 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 08/16] 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 09eec1c9..a47f67ff 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 2e39db25..7ddb4f06 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 7c6faa1a..db9d9fc9 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 09/16] 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 a47f67ff..4b585ee5 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 7ddb4f06..70d40138 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 db9d9fc9..7c6faa1a 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 10/16] 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 b4bbec04..3f7f39f6 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 8588974f..c113fd70 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 11/16] upd README.md --- README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 450818e3..4e24a5b6 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 12/16] 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 d0f6598a..9fdd8a76 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 b5ec9208..50372f85 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 4b585ee5..1d399096 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 13/16] 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 4e24a5b6..3c696826 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 b4708d51..40574880 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 1d399096..34ba4654 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 14/16] 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 34ba4654..26535c15 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 15/16] fix defaults --- resources/globalConfiguration.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index 40574880..5c5fdc7d 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 16/16] upd README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 3c696826..51bceea3 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). Шаблоны сообщений конфигурируются в настройках плагина.