From 1a116ee66e694ce84ebe78fcf7872576e5621a38 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Thu, 15 Oct 2020 14:51:58 +0300 Subject: [PATCH 01/44] =?UTF-8?q?=D0=A8=D0=B0=D0=B3=20=D0=B8=D0=BD=D0=B8?= =?UTF-8?q?=D1=86=D0=B8=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=BE?= =?UTF-8?q?=D0=BD=D0=BD=D0=BE=D0=B9=20=D0=B1=D0=B0=D0=B7=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/globalConfiguration.json | 5 +++ resources/schema.json | 22 ++++++++++ .../configuration/ConfigurationReader.groovy | 7 ++++ .../configuration/InitInfobaseOptions.groovy | 27 +++++++++++++ .../configuration/JobConfiguration.groovy | 5 +++ .../library/configuration/StageFlags.groovy | 6 ++- .../jenkins/library/steps/InitInfobase.groovy | 40 +++++++++++++++++++ .../ConfigurationReaderTest.java | 9 ++++- test/unit/resources/jobConfiguration.json | 6 +++ vars/initInfobase.groovy | 10 +++++ vars/pipeline1C.groovy | 39 ++++++++++++++---- 11 files changed, 167 insertions(+), 9 deletions(-) create mode 100644 src/ru/pulsar/jenkins/library/configuration/InitInfobaseOptions.groovy create mode 100644 src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy create mode 100644 vars/initInfobase.groovy diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index 332119d..cf5a9c6 100644 --- a/resources/globalConfiguration.json +++ b/resources/globalConfiguration.json @@ -6,11 +6,16 @@ "storage": "UNKNOWN_ID" }, "stages": { + "initSteps": false, "sonarqube": false, "syntaxCheck": false, "edtValidate": false, "smoke": false }, + "initInfobase": { + "runMigration": true, + "additionalMigrationSteps": [] + }, "sonarqube": { "sonarQubeInstallation": "", "useSonarScannerFromPath": true, diff --git a/resources/schema.json b/resources/schema.json index 40bcd1c..df6a028 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -45,6 +45,28 @@ "smoke" : { "type" : "boolean", "description" : "Дымовые тесты включены" + }, + "initSteps" : { + "type" : "boolean", + "description" : "Предварительные шаги инициализации включены" + } + } + }, + "initInfobase" : { + "type" : "object", + "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:InitInfobaseOptions", + "description" : "Настройки шага инициализации ИБ", + "properties" : { + "runMigration" : { + "type" : "boolean", + "description" : "Запустить миграцию ИБ" + }, + "additionalMigrationSteps" : { + "type" : "array", + "description" : "Дополнительные шаги, запускаемые через vrunner.\n В каждой строке передается отдельная команда \n vrunner и ее аргументы (например, \"vanessa --settings ./tools/vrunner.first.json\")\n ", + "items" : { + "type" : "string" + } } } }, diff --git a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy index d17ddf5..1e2bcca 100644 --- a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy @@ -41,12 +41,14 @@ class ConfigurationReader implements Serializable { def nonMergeableSettings = Arrays.asList( "secrets", "stageFlags", + "initInfobaseOptions", "sonarQubeOptions", "syntaxCheckOptions", "resultsTransformOptions" ).toSet() mergeObjects(baseConfiguration, configurationToMerge, nonMergeableSettings) + mergeInitInfobaseOptions(baseConfiguration.initInfobaseOptions, configurationToMerge.initInfobaseOptions); return baseConfiguration; } @@ -70,4 +72,9 @@ class ConfigurationReader implements Serializable { ) }) } + + @NonCPS + private static void mergeInitInfobaseOptions(InitInfobaseOptions baseObject, InitInfobaseOptions objectToMerge) { + baseObject.additionalMigrationSteps = objectToMerge.additionalMigrationSteps.clone() + } } diff --git a/src/ru/pulsar/jenkins/library/configuration/InitInfobaseOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/InitInfobaseOptions.groovy new file mode 100644 index 0000000..80f6b66 --- /dev/null +++ b/src/ru/pulsar/jenkins/library/configuration/InitInfobaseOptions.groovy @@ -0,0 +1,27 @@ +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 InitInfobaseOptions implements Serializable { + + @JsonPropertyDescription("Запустить миграцию ИБ") + boolean runMigration = true + + @JsonPropertyDescription("""Дополнительные шаги, запускаемые через vrunner. + В каждой строке передается отдельная команда + vrunner и ее аргументы (например, "vanessa --settings ./tools/vrunner.first.json") + """) + String[] additionalMigrationSteps + + @Override + @NonCPS + String toString() { + return "InitInfobaseOptions{" + + "runMigration=" + runMigration + + ", additionalMigrationSteps=" + additionalMigrationSteps + + '}'; + } +} diff --git a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy index 3368d8e..87e23b3 100644 --- a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy @@ -20,6 +20,10 @@ class JobConfiguration implements Serializable { @JsonPropertyDescription("Идентификаторы сохраненных секретов") Secrets secrets; + @JsonProperty("initInfobase") + @JsonPropertyDescription("Настройки шага инициализации ИБ") + InitInfobaseOptions initInfobaseOptions; + @JsonProperty("sonarqube") @JsonPropertyDescription("Настройки анализа SonarQube") SonarQubeOptions sonarQubeOptions; @@ -40,6 +44,7 @@ class JobConfiguration implements Serializable { ", srcDir='" + srcDir + '\'' + ", stageFlags=" + stageFlags + ", secrets=" + secrets + + ", initInfobaseOptions=" + initInfobaseOptions + ", sonarQubeOptions=" + sonarQubeOptions + ", syntaxCheckOptions=" + syntaxCheckOptions + ", resultsTransformOptions=" + resultsTransformOptions + diff --git a/src/ru/pulsar/jenkins/library/configuration/StageFlags.groovy b/src/ru/pulsar/jenkins/library/configuration/StageFlags.groovy index c73a158..042aab2 100644 --- a/src/ru/pulsar/jenkins/library/configuration/StageFlags.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/StageFlags.groovy @@ -18,6 +18,9 @@ class StageFlags implements Serializable { @JsonPropertyDescription("Дымовые тесты включены") boolean smoke + @JsonPropertyDescription("Предварительные шаги инициализации включены") + boolean initSteps + @Override @NonCPS String toString() { @@ -26,10 +29,11 @@ class StageFlags implements Serializable { ", syntaxCheck=" + syntaxCheck + ", edtValidate=" + edtValidate + ", smoke=" + smoke + + ", initSteps=" + initSteps + '}'; } boolean needInfobase() { - return smoke || syntaxCheck + return smoke || syntaxCheck || initSteps } } diff --git a/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy new file mode 100644 index 0000000..09e1a43 --- /dev/null +++ b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy @@ -0,0 +1,40 @@ +package ru.pulsar.jenkins.library.steps + +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 InitInfobase implements Serializable { + + private final JobConfiguration config; + + InitInfobase(JobConfiguration config) { + this.config = config + } + + def run() { + IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() + + Logger.printLocation() + + if (!config.stageFlags.initSteps) { + Logger.println("Init step is disabled") + return + } + + if (config.initInfobaseOptions.runMigration) { + Logger.println("Запуск миграции ИБ") + + // Запуск миграции + steps.cmd("oscript_modules/bin/vrunner run --command \"ЗапуститьОбновлениеИнформационнойБазы;ЗавершитьРаботуСистемы;\" --execute \$runnerRoot/epf/ЗакрытьПредприятие.epf --ibconnection \"/F./build/ib\"") + } else { + Logger.println("Шаг миграции ИБ выключен") + } + + config.initInfobaseOptions.additionalMigrationSteps.each { + Logger.println("Первичная инициализация командой ${it}") + steps.cmd("oscript_modules/bin/vrunner ${it}") + } + } +} 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 01e4edc..d0be9f1 100644 --- a/test/unit/groovy/ru/pulsar/jenkins/library/configuration/ConfigurationReaderTest.java +++ b/test/unit/groovy/ru/pulsar/jenkins/library/configuration/ConfigurationReaderTest.java @@ -31,14 +31,21 @@ class ConfigurationReaderTest { // then assertThat(jobConfiguration.getV8version()).isEqualTo("8.3.14.1944"); + assertThat(jobConfiguration.getSonarQubeOptions().getSonarScannerToolName()).isEqualTo("sonar-scanner"); + assertThat(jobConfiguration.getSecrets()) .hasFieldOrPropertyWithValue("storage", "1234") .hasFieldOrPropertyWithValue("storagePath", "UNKNOWN_ID") ; + assertThat(jobConfiguration.getSyntaxCheckOptions().getCheckModes()).hasSize(1); + assertThat(jobConfiguration.getResultsTransformOptions().isRemoveSupport()).isTrue(); - assertThat(jobConfiguration.getResultsTransformOptions().getSupportLevel()).isEqualTo(0); + assertThat(jobConfiguration.getResultsTransformOptions().getSupportLevel()).isZero(); + + assertThat(jobConfiguration.getInitInfobaseOptions().getRunMigration()).isFalse(); + assertThat(jobConfiguration.getInitInfobaseOptions().getAdditionalMigrationSteps()).contains("vanessa --settings ./tools/vrunner.first.json"); } } \ No newline at end of file diff --git a/test/unit/resources/jobConfiguration.json b/test/unit/resources/jobConfiguration.json index 2cd66f2..173d261 100644 --- a/test/unit/resources/jobConfiguration.json +++ b/test/unit/resources/jobConfiguration.json @@ -6,6 +6,12 @@ "stages": { "syntaxCheck": true }, + "initInfobase": { + "runMigration": false, + "additionalMigrationSteps": [ + "vanessa --settings ./tools/vrunner.first.json" + ] + }, "syntaxCheck": { "checkModes": ["-ThinClient"] }, diff --git a/vars/initInfobase.groovy b/vars/initInfobase.groovy new file mode 100644 index 0000000..7eabdcb --- /dev/null +++ b/vars/initInfobase.groovy @@ -0,0 +1,10 @@ +import ru.pulsar.jenkins.library.configuration.JobConfiguration +import ru.pulsar.jenkins.library.ioc.ContextRegistry +import ru.pulsar.jenkins.library.steps.InitInfobase + +def call(JobConfiguration config) { + ContextRegistry.registerDefaultContext(this) + + def initInfobase = new InitInfobase(config) + initInfobase.run() +} \ No newline at end of file diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index d07006f..e04064f 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -46,18 +46,43 @@ void call() { expression { config.stageFlags.needInfobase() } } - steps { - printLocation() + stages { + stage('Создание ИБ') { + steps { + printLocation() - installLocalDependencies() + installLocalDependencies() - dir("build/out") { echo '' } + dir("build/out") { echo '' } - // Создание базы загрузкой конфигурации из хранилища - initFromStorage config + // Создание базы загрузкой конфигурации из хранилища + initFromStorage config + } + } - zipInfobase() + stage('Инициализация ИБ') { + when { + beforeAgent true + expression { config.stageFlags.initSteps } + } + steps { + printLocation() + + // Инициализация и первичная миграция + initInfobase config + } + } + + stage('Архивация ИБ') { + steps { + printLocation() + + zipInfobase() + } + + } } + } stage('Трансформация в формат EDT') { From 5ea554b948ee85f326f6de1ac4123573207f4fcb Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Thu, 15 Oct 2020 16:23:05 +0300 Subject: [PATCH 02/44] =?UTF-8?q?=D0=98=D1=81=D0=BF=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=BA=D0=B8=20=D0=B2=20=D0=BE=D0=B4=D0=B8=D0=BD=D0=BE?= =?UTF-8?q?=D1=87=D0=BD=D1=8B=D1=85=20=D0=BA=D0=B0=D0=B2=D1=8B=D1=87=D0=BA?= =?UTF-8?q?=D0=B0=D1=85=20=D0=B4=D0=BB=D1=8F=20=D1=8D=D0=BA=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20$?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy index 09e1a43..593d246 100644 --- a/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy +++ b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy @@ -27,7 +27,7 @@ class InitInfobase implements Serializable { Logger.println("Запуск миграции ИБ") // Запуск миграции - steps.cmd("oscript_modules/bin/vrunner run --command \"ЗапуститьОбновлениеИнформационнойБазы;ЗавершитьРаботуСистемы;\" --execute \$runnerRoot/epf/ЗакрытьПредприятие.epf --ibconnection \"/F./build/ib\"") + steps.cmd('oscript_modules/bin/vrunner run --command "ЗапуститьОбновлениеИнформационнойБазы;ЗавершитьРаботуСистемы;" --execute \$runnerRoot/epf/ЗакрытьПредприятие.epf') } else { Logger.println("Шаг миграции ИБ выключен") } From 07637c3cd16b47be4fc11d5b31c17a4184ae7217 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Thu, 15 Oct 2020 16:23:14 +0300 Subject: [PATCH 03/44] =?UTF-8?q?=D0=A4=D0=BE=D1=80=D0=BC=D0=B0=D1=82?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jenkins/library/configuration/InitInfobaseOptions.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ru/pulsar/jenkins/library/configuration/InitInfobaseOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/InitInfobaseOptions.groovy index 80f6b66..0e717a8 100644 --- a/src/ru/pulsar/jenkins/library/configuration/InitInfobaseOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/InitInfobaseOptions.groovy @@ -11,8 +11,8 @@ class InitInfobaseOptions implements Serializable { boolean runMigration = true @JsonPropertyDescription("""Дополнительные шаги, запускаемые через vrunner. - В каждой строке передается отдельная команда - vrunner и ее аргументы (например, "vanessa --settings ./tools/vrunner.first.json") + В каждой строке передается отдельная команда + vrunner и ее аргументы (например, "vanessa --settings ./tools/vrunner.first.json") """) String[] additionalMigrationSteps From 2f33a37c410785c23f0b3bf59cc7b0dcc617d0cb Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Thu, 15 Oct 2020 16:38:16 +0300 Subject: [PATCH 04/44] =?UTF-8?q?=D0=9F=D1=80=D0=B8=D0=BD=D1=83=D0=B4?= =?UTF-8?q?=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=B0=D1=8F=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B4=D0=B0=D1=87=D0=B0=20ibconnection?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy index 593d246..9de5a73 100644 --- a/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy +++ b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy @@ -27,14 +27,14 @@ class InitInfobase implements Serializable { Logger.println("Запуск миграции ИБ") // Запуск миграции - steps.cmd('oscript_modules/bin/vrunner run --command "ЗапуститьОбновлениеИнформационнойБазы;ЗавершитьРаботуСистемы;" --execute \$runnerRoot/epf/ЗакрытьПредприятие.epf') + steps.cmd('oscript_modules/bin/vrunner run --command "ЗапуститьОбновлениеИнформационнойБазы;ЗавершитьРаботуСистемы;" --execute \$runnerRoot/epf/ЗакрытьПредприятие.epf --ibconnection "/F./build/ib"') } else { Logger.println("Шаг миграции ИБ выключен") } config.initInfobaseOptions.additionalMigrationSteps.each { Logger.println("Первичная инициализация командой ${it}") - steps.cmd("oscript_modules/bin/vrunner ${it}") + steps.cmd("oscript_modules/bin/vrunner ${it} --ibconnection \"/F./build/ib\"") } } } From 45d8a3d71913dd5a3106be1ad3c9c988e2e7880d Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Thu, 15 Oct 2020 17:09:06 +0300 Subject: [PATCH 05/44] =?UTF-8?q?=D0=AD=D0=BA=D1=80=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20$?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy index 9de5a73..f5940a9 100644 --- a/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy +++ b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy @@ -27,7 +27,7 @@ class InitInfobase implements Serializable { Logger.println("Запуск миграции ИБ") // Запуск миграции - steps.cmd('oscript_modules/bin/vrunner run --command "ЗапуститьОбновлениеИнформационнойБазы;ЗавершитьРаботуСистемы;" --execute \$runnerRoot/epf/ЗакрытьПредприятие.epf --ibconnection "/F./build/ib"') + steps.cmd('oscript_modules/bin/vrunner run --command "ЗапуститьОбновлениеИнформационнойБазы;ЗавершитьРаботуСистемы;" --execute \\$runnerRoot/epf/ЗакрытьПредприятие.epf --ibconnection "/F./build/ib"') } else { Logger.println("Шаг миграции ИБ выключен") } From 3350eb8e7002bcf9e667e8c2d18aaefee9532d2b Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Thu, 15 Oct 2020 17:54:55 +0300 Subject: [PATCH 06/44] =?UTF-8?q?=D0=A1=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BA=D0=B0=D1=82=D0=B0=D0=BB=D0=BE=D0=B3=D0=B0?= =?UTF-8?q?=20=D1=81=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy | 2 ++ vars/pipeline1C.groovy | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy index f5940a9..df3c59d 100644 --- a/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy +++ b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy @@ -18,6 +18,8 @@ class InitInfobase implements Serializable { Logger.printLocation() + steps.createDir('build/out') + if (!config.stageFlags.initSteps) { Logger.println("Init step is disabled") return diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index e04064f..d9a1363 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -53,7 +53,7 @@ void call() { installLocalDependencies() - dir("build/out") { echo '' } + createDir('build/out') // Создание базы загрузкой конфигурации из хранилища initFromStorage config From 9ca255f4fdcfb7710bcdb9410b326724459f9ec3 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Mon, 19 Oct 2020 14:24:46 +0300 Subject: [PATCH 07/44] =?UTF-8?q?=D0=A1=D0=BA=D0=B0=D1=87=D0=B8=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=BD=D0=BE=D0=B9=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B8=20VAS?= =?UTF-8?q?=20=D1=81=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=D0=BC=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=B4=20linux?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ru/pulsar/jenkins/library/IStepExecutor.groovy | 4 ++++ src/ru/pulsar/jenkins/library/StepExecutor.groovy | 5 +++++ src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy | 6 ++++++ 3 files changed, 15 insertions(+) diff --git a/src/ru/pulsar/jenkins/library/IStepExecutor.groovy b/src/ru/pulsar/jenkins/library/IStepExecutor.groovy index 8942a1c..a7b76c2 100644 --- a/src/ru/pulsar/jenkins/library/IStepExecutor.groovy +++ b/src/ru/pulsar/jenkins/library/IStepExecutor.groovy @@ -45,4 +45,8 @@ interface IStepExecutor { def unzip(String dir, String zipFile, quiet) def catchError(Closure body) + + def httpRequest(String url, String outputFile) + + def httpRequest(String url, String outputFile, String responseHandle, boolean wrapAsMultipart) } \ 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 2b425a5..f784971 100644 --- a/src/ru/pulsar/jenkins/library/StepExecutor.groovy +++ b/src/ru/pulsar/jenkins/library/StepExecutor.groovy @@ -103,4 +103,9 @@ class StepExecutor implements IStepExecutor { def catchError(Closure body) { steps.catchError body } + + @Override + def httpRequest(String url, String outputFile, String responseHandle = 'NONE', boolean wrapAsMultipart = false) { + steps.httpRequest responseHandle: responseHandle, outputFile: outputFile, url: url, wrapAsMultipart: wrapAsMultipart + } } diff --git a/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy index df3c59d..87727c5 100644 --- a/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy +++ b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy @@ -34,6 +34,12 @@ class InitInfobase implements Serializable { Logger.println("Шаг миграции ИБ выключен") } + // TODO: удалить после выхода VAS 1.0.35 + steps.httpRequest( + 'https://cloud.svc.pulsar.ru/index.php/s/WKwmqpFXSjfYjAH', + 'oscript_modules/vanessa-automation-single/vanessa-automation-single.epf' + ) + config.initInfobaseOptions.additionalMigrationSteps.each { Logger.println("Первичная инициализация командой ${it}") steps.cmd("oscript_modules/bin/vrunner ${it} --ibconnection \"/F./build/ib\"") From 3a41d48d01e578d837a296d5fb6fc9cb8de77c2a Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Mon, 19 Oct 2020 15:48:58 +0300 Subject: [PATCH 08/44] =?UTF-8?q?=D0=A1=D0=BE=D1=85=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C?= =?UTF-8?q?=D1=82=D0=B0=D1=82=D0=BE=D0=B2=20=D0=B0=D0=BB=D0=BB=D1=8E=D1=80?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ru/pulsar/jenkins/library/IStepExecutor.groovy | 4 ++++ src/ru/pulsar/jenkins/library/StepExecutor.groovy | 9 +++++++-- src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy | 3 +++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/ru/pulsar/jenkins/library/IStepExecutor.groovy b/src/ru/pulsar/jenkins/library/IStepExecutor.groovy index a7b76c2..3691b78 100644 --- a/src/ru/pulsar/jenkins/library/IStepExecutor.groovy +++ b/src/ru/pulsar/jenkins/library/IStepExecutor.groovy @@ -34,6 +34,8 @@ interface IStepExecutor { def stash(String name, String includes) + def stash(String name, String includes, boolean allowEmpty) + def unstash(String name) def zip(String dir, String zipFile) @@ -49,4 +51,6 @@ interface IStepExecutor { def httpRequest(String url, String outputFile) def httpRequest(String url, String outputFile, String responseHandle, boolean wrapAsMultipart) + + def error(String errorMessage) } \ 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 f784971..17a7aca 100644 --- a/src/ru/pulsar/jenkins/library/StepExecutor.groovy +++ b/src/ru/pulsar/jenkins/library/StepExecutor.groovy @@ -80,8 +80,8 @@ class StepExecutor implements IStepExecutor { } @Override - def stash(String name, String includes) { - steps.stash name: name, includes: includes + def stash(String name, String includes, boolean allowEmpty = false) { + steps.stash name: name, includes: includes, allowEmpty: allowEmpty } @Override @@ -108,4 +108,9 @@ class StepExecutor implements IStepExecutor { def httpRequest(String url, String outputFile, String responseHandle = 'NONE', boolean wrapAsMultipart = false) { steps.httpRequest responseHandle: responseHandle, outputFile: outputFile, url: url, wrapAsMultipart: wrapAsMultipart } + + @Override + def error(String errorMessage) { + steps.error errorMessage + } } diff --git a/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy index 87727c5..0dabc30 100644 --- a/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy +++ b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy @@ -44,5 +44,8 @@ class InitInfobase implements Serializable { Logger.println("Первичная инициализация командой ${it}") steps.cmd("oscript_modules/bin/vrunner ${it} --ibconnection \"/F./build/ib\"") } + + steps.stash('init-allure', 'build/out/allure/*', true) + steps.stash('init-cucumber', 'build/out/cucumber/*', true) } } From 2f05b088a75a18173c39a1333b7530e817a4c139 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Mon, 19 Oct 2020 16:48:07 +0300 Subject: [PATCH 09/44] =?UTF-8?q?=D0=A1=D0=BE=D1=85=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20allure?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jenkins/library/IStepExecutor.groovy | 4 +- .../jenkins/library/StepExecutor.groovy | 12 +++++ .../jenkins/library/steps/InitInfobase.groovy | 12 +++-- .../library/steps/PublishAllure.groovy | 45 +++++++++++++++++++ .../jenkins/library/utils/FileUtils.groovy | 27 +++++++++++ vars/pipeline1C.groovy | 10 ++++- vars/saveResults.groovy | 32 +++++++++++++ 7 files changed, 134 insertions(+), 8 deletions(-) create mode 100644 src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy create mode 100644 src/ru/pulsar/jenkins/library/utils/FileUtils.groovy create mode 100644 vars/saveResults.groovy diff --git a/src/ru/pulsar/jenkins/library/IStepExecutor.groovy b/src/ru/pulsar/jenkins/library/IStepExecutor.groovy index 3691b78..d706d6b 100644 --- a/src/ru/pulsar/jenkins/library/IStepExecutor.groovy +++ b/src/ru/pulsar/jenkins/library/IStepExecutor.groovy @@ -48,9 +48,9 @@ interface IStepExecutor { def catchError(Closure body) - def httpRequest(String url, String outputFile) - def httpRequest(String url, String outputFile, String responseHandle, boolean wrapAsMultipart) def error(String errorMessage) + + def allure(List results) } \ 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 17a7aca..0745577 100644 --- a/src/ru/pulsar/jenkins/library/StepExecutor.groovy +++ b/src/ru/pulsar/jenkins/library/StepExecutor.groovy @@ -113,4 +113,16 @@ class StepExecutor implements IStepExecutor { def error(String errorMessage) { steps.error errorMessage } + + @Override + def allure(List results) { + steps.allure([ + commandline: 'allure', + includeProperties: false, + jdk: '', + properties: [], + reportBuildPolicy: 'ALWAYS', + results: results + ]) + } } diff --git a/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy index 0dabc30..8e65587 100644 --- a/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy +++ b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy @@ -29,7 +29,9 @@ class InitInfobase implements Serializable { Logger.println("Запуск миграции ИБ") // Запуск миграции - steps.cmd('oscript_modules/bin/vrunner run --command "ЗапуститьОбновлениеИнформационнойБазы;ЗавершитьРаботуСистемы;" --execute \\$runnerRoot/epf/ЗакрытьПредприятие.epf --ibconnection "/F./build/ib"') + steps.catchError { + steps.cmd('oscript_modules/bin/vrunner run --command "ЗапуститьОбновлениеИнформационнойБазы;ЗавершитьРаботуСистемы;" --execute \\$runnerRoot/epf/ЗакрытьПредприятие.epf --ibconnection "/F./build/ib"') + } } else { Logger.println("Шаг миграции ИБ выключен") } @@ -40,9 +42,11 @@ class InitInfobase implements Serializable { 'oscript_modules/vanessa-automation-single/vanessa-automation-single.epf' ) - config.initInfobaseOptions.additionalMigrationSteps.each { - Logger.println("Первичная инициализация командой ${it}") - steps.cmd("oscript_modules/bin/vrunner ${it} --ibconnection \"/F./build/ib\"") + steps.catchError { + config.initInfobaseOptions.additionalMigrationSteps.each { + Logger.println("Первичная инициализация командой ${it}") + steps.cmd("oscript_modules/bin/vrunner ${it} --ibconnection \"/F./build/ib\"") + } } steps.stash('init-allure', 'build/out/allure/*', true) diff --git a/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy b/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy new file mode 100644 index 0000000..5375e81 --- /dev/null +++ b/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy @@ -0,0 +1,45 @@ +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 + +class PublishAllure implements Serializable { + + private final JobConfiguration config; + + PublishAllure(JobConfiguration config) { + this.config = config + } + + def run() { + IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() + + Logger.printLocation() + + steps.unstash('init-allure') + + FilePath allurePath = FileUtils.getFilePath('build/out/allure') + if (!allurePath.exists()) { + Logger.println("Отсутствуют результаты allure для публикации") + } + + List results = new ArrayList<>(); + + def allureSubDirs = allurePath.listDirectories() + if (allureSubDirs.size() > 0) { + allureSubDirs.forEach({ filePath -> results.add(getPath(filePath)) }) + } else { + results.add(getPath(allurePath)) + } + + steps.allure(results) + } + + private static String getPath(FilePath filePath) { + filePath.getBaseName() + File.separator + filePath.getName() + } +} diff --git a/src/ru/pulsar/jenkins/library/utils/FileUtils.groovy b/src/ru/pulsar/jenkins/library/utils/FileUtils.groovy new file mode 100644 index 0000000..eadf463 --- /dev/null +++ b/src/ru/pulsar/jenkins/library/utils/FileUtils.groovy @@ -0,0 +1,27 @@ +package ru.pulsar.jenkins.library.utils + +import hudson.FilePath +import jenkins.model.Jenkins +import ru.pulsar.jenkins.library.IStepExecutor +import ru.pulsar.jenkins.library.ioc.ContextRegistry + +class FileUtils { + + static FilePath getFilePath(String path) { + + IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() + + def env = steps.env(); + + String nodeName = env.NODE_NAME; + if (nodeName == null) { + steps.error 'Переменная среды NODE_NAME не задана. Запуск вне node или без agent?' + } + + if (nodeName == "master") { + return new FilePath(new File(path)); + } else { + return new FilePath(Jenkins.getInstanceOrNull().getComputer(nodeName).getChannel(), path); + } + } +} diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index d9a1363..ae8652e 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -66,8 +66,6 @@ void call() { expression { config.stageFlags.initSteps } } steps { - printLocation() - // Инициализация и первичная миграция initInfobase config } @@ -169,6 +167,14 @@ void call() { } } } + + post('post-stage') { + always { + node('agent') { + saveResults config + } + } + } } } diff --git a/vars/saveResults.groovy b/vars/saveResults.groovy new file mode 100644 index 0000000..c142b28 --- /dev/null +++ b/vars/saveResults.groovy @@ -0,0 +1,32 @@ +import ru.pulsar.jenkins.library.configuration.JobConfiguration +import ru.pulsar.jenkins.library.ioc.ContextRegistry +import ru.pulsar.jenkins.library.steps.PublishAllure + +def call(JobConfiguration config) { + ContextRegistry.registerDefaultContext(this) + + def publishAllure = new PublishAllure(config) + publishAllure.run() + +// step([ +// $class: 'CucumberReportPublisher', +// fileIncludePattern: '*.json', +// jsonReportDirectory: 'build/out/cucumber' +// ]) +// +// step([ +// $class: 'CukedoctorPublisher', +// featuresDir: 'build/out/cucumber', +// format: 'HTML', +// hideFeaturesSection: false, +// hideScenarioKeyword: false, +// hideStepTime: false, +// hideSummary: false, +// hideTags: false, +// numbered: true, +// sectAnchors: true, +// title: 'Living Documentation', +// toc: 'LEFT' +// ]) + +} \ No newline at end of file From 086cd4b8046cf8a2069343c3c986b96779d67044 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Mon, 19 Oct 2020 17:23:35 +0300 Subject: [PATCH 10/44] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=B2=D0=BE=D0=B7=D0=B2=D1=80=D0=B0=D1=82=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=20=D0=BE=D1=82=D1=81=D1=83=D1=82=D1=81=D1=82?= =?UTF-8?q?=D0=B2=D0=B8=D0=B8=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82?= =?UTF-8?q?=D0=B0=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy b/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy index 5375e81..f6c404d 100644 --- a/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy +++ b/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy @@ -25,6 +25,7 @@ class PublishAllure implements Serializable { FilePath allurePath = FileUtils.getFilePath('build/out/allure') if (!allurePath.exists()) { Logger.println("Отсутствуют результаты allure для публикации") + return } List results = new ArrayList<>(); From 6cb20ba70735de7dff466d38782901969a9b1b70 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Mon, 19 Oct 2020 18:19:25 +0300 Subject: [PATCH 11/44] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=BD=D0=B0=20=D1=81=D0=BA=D0=B0=D1=87=D0=B8=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20VAS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy index 8e65587..6c72477 100644 --- a/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy +++ b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy @@ -38,7 +38,7 @@ class InitInfobase implements Serializable { // TODO: удалить после выхода VAS 1.0.35 steps.httpRequest( - 'https://cloud.svc.pulsar.ru/index.php/s/WKwmqpFXSjfYjAH', + 'https://cloud.svc.pulsar.ru/index.php/s/WKwmqpFXSjfYjAH/download', 'oscript_modules/vanessa-automation-single/vanessa-automation-single.epf' ) From 2d3423067086c34f2d2b4660af88f3a7573d21f1 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Tue, 20 Oct 2020 09:55:52 +0300 Subject: [PATCH 12/44] =?UTF-8?q?includeAll=20=D0=B2=20=D1=81=D1=82=D1=8D?= =?UTF-8?q?=D1=88=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy index 6c72477..deb5ec7 100644 --- a/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy +++ b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy @@ -49,7 +49,7 @@ class InitInfobase implements Serializable { } } - steps.stash('init-allure', 'build/out/allure/*', true) - steps.stash('init-cucumber', 'build/out/cucumber/*', true) + steps.stash('init-allure', 'build/out/allure/**', true) + steps.stash('init-cucumber', 'build/out/cucumber/**', true) } } From bdcfd87a471a33246bf8e921f8e0064abd155908 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Tue, 20 Oct 2020 11:41:31 +0300 Subject: [PATCH 13/44] =?UTF-8?q?=D0=9A=D0=BE=D1=80=D1=80=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=BD=D0=BE=D0=B5=20=D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BA=D0=B0=D1=82=D0=B0=D0=BB=D0=BE=D0=B3=D0=B0=20?= =?UTF-8?q?=D1=81=20=D0=B0=D0=BB=D0=BB=D1=8E=D1=80=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy b/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy index f6c404d..135c824 100644 --- a/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy +++ b/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy @@ -22,7 +22,9 @@ class PublishAllure implements Serializable { steps.unstash('init-allure') - FilePath allurePath = FileUtils.getFilePath('build/out/allure') + def env = steps.env(); + + FilePath allurePath = FileUtils.getFilePath("$env.WORKSPACE/build/out/allure") if (!allurePath.exists()) { Logger.println("Отсутствуют результаты allure для публикации") return From 533a24187f00f404a82e0137785ce4b19c7055af Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Tue, 20 Oct 2020 11:59:42 +0300 Subject: [PATCH 14/44] =?UTF-8?q?=D0=A3=D0=BA=D0=B0=D0=B7=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BF=D0=BE=D0=BB=D0=BD=D0=BE=D0=B3=D0=BE=20?= =?UTF-8?q?=D0=BF=D1=83=D1=82=D0=B8=20=D0=BD=D0=B0=20=D1=83=D0=B4=D0=B0?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=BD=D0=BE=D0=B9=20=D0=BC=D0=B0=D1=88=D0=B8?= =?UTF-8?q?=D0=BD=D0=B5=20=D0=B4=D0=BB=D1=8F=20results?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy b/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy index 135c824..9db5e24 100644 --- a/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy +++ b/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy @@ -34,15 +34,12 @@ class PublishAllure implements Serializable { def allureSubDirs = allurePath.listDirectories() if (allureSubDirs.size() > 0) { - allureSubDirs.forEach({ filePath -> results.add(getPath(filePath)) }) + allureSubDirs.forEach({ filePath -> results.add(filePath.getRemote()) }) } else { - results.add(getPath(allurePath)) + results.add(allurePath.getRemote()) } steps.allure(results) } - private static String getPath(FilePath filePath) { - filePath.getBaseName() + File.separator + filePath.getName() - } } From eb36297ab7557976fe0903b114ab9cee88046071 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Tue, 20 Oct 2020 16:17:57 +0300 Subject: [PATCH 15/44] =?UTF-8?q?=D0=9A=D0=BE=D0=BD=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D1=82=D0=B0=D1=86=D0=B8=D1=8F=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA?= =?UTF-8?q?=D0=B0=20=D1=81=D1=82=D1=80=D0=BE=D0=BA=20=D0=B2=20ResultsConfi?= =?UTF-8?q?g=20allure-=D1=88=D0=B0=D0=B3=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 1 + src/ru/pulsar/jenkins/library/StepExecutor.groovy | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 8e31f1f..7af7246 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -79,6 +79,7 @@ sharedLibrary { pluginDependencies { dependency("org.jenkins-ci.plugins", "pipeline-build-step", "2.12") dependency("org.6wind.jenkins", "lockable-resources", "2.7") + dependency("ru.yandex.qatools.allure", "allure-jenkins-plugin", "2.28.1") val declarativePluginsVersion = "1.6.0" dependency("org.jenkinsci.plugins", "pipeline-model-api", declarativePluginsVersion) dependency("org.jenkinsci.plugins", "pipeline-model-declarative-agent", "1.1.1") diff --git a/src/ru/pulsar/jenkins/library/StepExecutor.groovy b/src/ru/pulsar/jenkins/library/StepExecutor.groovy index 0745577..8c1a2b0 100644 --- a/src/ru/pulsar/jenkins/library/StepExecutor.groovy +++ b/src/ru/pulsar/jenkins/library/StepExecutor.groovy @@ -1,6 +1,7 @@ package ru.pulsar.jenkins.library import org.jenkinsci.plugins.workflow.support.actions.EnvironmentAction +import ru.yandex.qatools.allure.jenkins.config.ResultsConfig class StepExecutor implements IStepExecutor { @@ -122,7 +123,7 @@ class StepExecutor implements IStepExecutor { jdk: '', properties: [], reportBuildPolicy: 'ALWAYS', - results: results + results: ResultsConfig.convertPaths(results) ]) } } From 5dacc3242a7c3492f7b4aefd629b179ffbf09998 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Wed, 21 Oct 2020 11:33:02 +0300 Subject: [PATCH 16/44] forEach -> each --- src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy b/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy index 9db5e24..de76c22 100644 --- a/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy +++ b/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy @@ -32,10 +32,10 @@ class PublishAllure implements Serializable { List results = new ArrayList<>(); - def allureSubDirs = allurePath.listDirectories() - if (allureSubDirs.size() > 0) { - allureSubDirs.forEach({ filePath -> results.add(filePath.getRemote()) }) - } else { + allurePath.listDirectories().each { FilePath filePath -> + results.add(filePath.getRemote()) + } + if (results.isEmpty()) { results.add(allurePath.getRemote()) } From 9e1f393f3eaf8ae966481caf82dc59b2f1fb1831 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Wed, 21 Oct 2020 12:17:07 +0300 Subject: [PATCH 17/44] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD?= =?UTF-8?q?=D0=BE=D0=B5=20=D0=BB=D0=BE=D0=B3=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20?= =?UTF-8?q?=D1=88=D0=B0=D0=B3=D0=B0=20=D0=B0=D0=BB=D0=BB=D1=8E=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ru/pulsar/jenkins/library/StepExecutor.groovy | 2 ++ src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/src/ru/pulsar/jenkins/library/StepExecutor.groovy b/src/ru/pulsar/jenkins/library/StepExecutor.groovy index 8c1a2b0..df33b21 100644 --- a/src/ru/pulsar/jenkins/library/StepExecutor.groovy +++ b/src/ru/pulsar/jenkins/library/StepExecutor.groovy @@ -1,6 +1,7 @@ package ru.pulsar.jenkins.library import org.jenkinsci.plugins.workflow.support.actions.EnvironmentAction +import ru.pulsar.jenkins.library.utils.Logger import ru.yandex.qatools.allure.jenkins.config.ResultsConfig class StepExecutor implements IStepExecutor { @@ -117,6 +118,7 @@ class StepExecutor implements IStepExecutor { @Override def allure(List results) { + Logger.println(ResultsConfig.convertPaths(results)) steps.allure([ commandline: 'allure', includeProperties: false, diff --git a/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy b/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy index de76c22..09d7569 100644 --- a/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy +++ b/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy @@ -32,6 +32,9 @@ class PublishAllure implements Serializable { List results = new ArrayList<>(); + Logger.println(allurePath.toString()) + Logger.println(allurePath.listDirectories().toString()) + allurePath.listDirectories().each { FilePath filePath -> results.add(filePath.getRemote()) } @@ -39,6 +42,8 @@ class PublishAllure implements Serializable { results.add(allurePath.getRemote()) } + Logger.println(results.toString()) + steps.allure(results) } From ebba59644657cfd470a8dfe1860bb1234ea0c883 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Wed, 21 Oct 2020 12:27:51 +0300 Subject: [PATCH 18/44] =?UTF-8?q?BDD=20=D1=88=D0=B0=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/globalConfiguration.json | 6 +++ resources/schema.json | 20 +++++++- .../jenkins/library/IStepExecutor.groovy | 2 + .../jenkins/library/StepExecutor.groovy | 5 ++ .../library/configuration/BddOptions.groovy | 26 +++++++++++ .../configuration/ConfigurationReader.groovy | 17 ++++++- .../configuration/JobConfiguration.groovy | 5 ++ .../library/configuration/StageFlags.groovy | 6 ++- .../pulsar/jenkins/library/steps/Bdd.groovy | 46 +++++++++++++++++++ .../ConfigurationReaderTest.java | 2 + vars/bdd.groovy | 10 ++++ vars/pipeline1C.groovy | 11 +++++ 12 files changed, 153 insertions(+), 3 deletions(-) create mode 100644 src/ru/pulsar/jenkins/library/configuration/BddOptions.groovy create mode 100644 src/ru/pulsar/jenkins/library/steps/Bdd.groovy create mode 100644 vars/bdd.groovy diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index cf5a9c6..25b5e5a 100644 --- a/resources/globalConfiguration.json +++ b/resources/globalConfiguration.json @@ -8,6 +8,7 @@ "stages": { "initSteps": false, "sonarqube": false, + "bdd": false, "syntaxCheck": false, "edtValidate": false, "smoke": false @@ -16,6 +17,11 @@ "runMigration": true, "additionalMigrationSteps": [] }, + "bddOptions": { + "vrunnerSteps": [ + "vanessa --settings ./tools/vrunner.json" + ] + }, "sonarqube": { "sonarQubeInstallation": "", "useSonarScannerFromPath": true, diff --git a/resources/schema.json b/resources/schema.json index df6a028..75512e8 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -49,6 +49,10 @@ "initSteps" : { "type" : "boolean", "description" : "Предварительные шаги инициализации включены" + }, + "bdd" : { + "type" : "boolean", + "description" : "Запуск BDD сценариев включен" } } }, @@ -63,7 +67,21 @@ }, "additionalMigrationSteps" : { "type" : "array", - "description" : "Дополнительные шаги, запускаемые через vrunner.\n В каждой строке передается отдельная команда \n vrunner и ее аргументы (например, \"vanessa --settings ./tools/vrunner.first.json\")\n ", + "description" : "Дополнительные шаги, запускаемые через vrunner.\n В каждой строке передается отдельная команда \n vrunner и ее аргументы (например, \"vanessa --settings ./tools/vrunner.first.json\")\n ", + "items" : { + "type" : "string" + } + } + } + }, + "bddOptions" : { + "type" : "object", + "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:BddOptions", + "description" : "Настройки шага запуска BDD сценариев", + "properties" : { + "vrunnerSteps" : { + "type" : "array", + "description" : "Шаги, запускаемые через vrunner.\n В каждой строке передается отдельная команда \n vrunner и ее аргументы (например, \"vanessa --settings ./tools/vrunner.json\").\n По умолчанию содержит одну команду \"vanessa --settings ./tools/vrunner.json\".\n ", "items" : { "type" : "string" } diff --git a/src/ru/pulsar/jenkins/library/IStepExecutor.groovy b/src/ru/pulsar/jenkins/library/IStepExecutor.groovy index d706d6b..54d57af 100644 --- a/src/ru/pulsar/jenkins/library/IStepExecutor.groovy +++ b/src/ru/pulsar/jenkins/library/IStepExecutor.groovy @@ -53,4 +53,6 @@ interface IStepExecutor { def error(String errorMessage) def allure(List results) + + def installLocalDependencies() } \ 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 df33b21..1bc06a0 100644 --- a/src/ru/pulsar/jenkins/library/StepExecutor.groovy +++ b/src/ru/pulsar/jenkins/library/StepExecutor.groovy @@ -128,4 +128,9 @@ class StepExecutor implements IStepExecutor { results: ResultsConfig.convertPaths(results) ]) } + + @Override + def installLocalDependencies() { + steps.installLocalDependencies() + } } diff --git a/src/ru/pulsar/jenkins/library/configuration/BddOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/BddOptions.groovy new file mode 100644 index 0000000..95e7458 --- /dev/null +++ b/src/ru/pulsar/jenkins/library/configuration/BddOptions.groovy @@ -0,0 +1,26 @@ +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 BddOptions implements Serializable { + + @JsonPropertyDescription("""Шаги, запускаемые через vrunner. + В каждой строке передается отдельная команда + vrunner и ее аргументы (например, "vanessa --settings ./tools/vrunner.json"). + По умолчанию содержит одну команду "vanessa --settings ./tools/vrunner.json". + """) + String[] vrunnerSteps = [ + 'vanessa --settings ./tools/vrunner.json' + ] + + @Override + @NonCPS + String toString() { + return "BddOptions{" + + "vrunnerSteps=" + vrunnerSteps + + '}'; + } +} diff --git a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy index 1e2bcca..1065790 100644 --- a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy @@ -7,6 +7,8 @@ import org.apache.commons.beanutils.BeanUtils import ru.pulsar.jenkins.library.IStepExecutor import ru.pulsar.jenkins.library.ioc.ContextRegistry +import javax.annotation.CheckForNull + class ConfigurationReader implements Serializable { private static ObjectMapper mapper @@ -42,6 +44,7 @@ class ConfigurationReader implements Serializable { "secrets", "stageFlags", "initInfobaseOptions", + "bddOptions", "sonarQubeOptions", "syntaxCheckOptions", "resultsTransformOptions" @@ -49,6 +52,7 @@ class ConfigurationReader implements Serializable { mergeObjects(baseConfiguration, configurationToMerge, nonMergeableSettings) mergeInitInfobaseOptions(baseConfiguration.initInfobaseOptions, configurationToMerge.initInfobaseOptions); + mergeBddOptions(baseConfiguration.bddOptions, configurationToMerge.bddOptions); return baseConfiguration; } @@ -74,7 +78,18 @@ class ConfigurationReader implements Serializable { } @NonCPS - private static void mergeInitInfobaseOptions(InitInfobaseOptions baseObject, InitInfobaseOptions objectToMerge) { + private static void mergeInitInfobaseOptions(InitInfobaseOptions baseObject, @CheckForNull InitInfobaseOptions objectToMerge) { + if (objectToMerge == null || objectToMerge.additionalMigrationSteps == null) { + return + } baseObject.additionalMigrationSteps = objectToMerge.additionalMigrationSteps.clone() } + + @NonCPS + private static void mergeBddOptions(BddOptions baseObject, @CheckForNull BddOptions objectToMerge) { + if (objectToMerge == null || objectToMerge.vrunnerSteps == null) { + return + } + baseObject.vrunnerSteps = objectToMerge.vrunnerSteps.clone() + } } diff --git a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy index 87e23b3..2ff51f8 100644 --- a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy @@ -24,6 +24,10 @@ class JobConfiguration implements Serializable { @JsonPropertyDescription("Настройки шага инициализации ИБ") InitInfobaseOptions initInfobaseOptions; + @JsonProperty("bddOptions") + @JsonPropertyDescription("Настройки шага запуска BDD сценариев") + BddOptions bddOptions; + @JsonProperty("sonarqube") @JsonPropertyDescription("Настройки анализа SonarQube") SonarQubeOptions sonarQubeOptions; @@ -45,6 +49,7 @@ class JobConfiguration implements Serializable { ", stageFlags=" + stageFlags + ", secrets=" + secrets + ", initInfobaseOptions=" + initInfobaseOptions + + ", bddOptions=" + bddOptions + ", sonarQubeOptions=" + sonarQubeOptions + ", syntaxCheckOptions=" + syntaxCheckOptions + ", resultsTransformOptions=" + resultsTransformOptions + diff --git a/src/ru/pulsar/jenkins/library/configuration/StageFlags.groovy b/src/ru/pulsar/jenkins/library/configuration/StageFlags.groovy index 042aab2..2fdcbe7 100644 --- a/src/ru/pulsar/jenkins/library/configuration/StageFlags.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/StageFlags.groovy @@ -21,6 +21,9 @@ class StageFlags implements Serializable { @JsonPropertyDescription("Предварительные шаги инициализации включены") boolean initSteps + @JsonPropertyDescription("Запуск BDD сценариев включен") + boolean bdd + @Override @NonCPS String toString() { @@ -30,10 +33,11 @@ class StageFlags implements Serializable { ", edtValidate=" + edtValidate + ", smoke=" + smoke + ", initSteps=" + initSteps + + ", bdd=" + bdd + '}'; } boolean needInfobase() { - return smoke || syntaxCheck || initSteps + return smoke || syntaxCheck || initSteps || bdd } } diff --git a/src/ru/pulsar/jenkins/library/steps/Bdd.groovy b/src/ru/pulsar/jenkins/library/steps/Bdd.groovy new file mode 100644 index 0000000..6a1e9cb --- /dev/null +++ b/src/ru/pulsar/jenkins/library/steps/Bdd.groovy @@ -0,0 +1,46 @@ +package ru.pulsar.jenkins.library.steps + +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 Bdd implements Serializable { + + private final JobConfiguration config; + + Bdd(JobConfiguration config) { + this.config = config + } + + def run() { + IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() + + Logger.printLocation() + + if (!config.stageFlags.bdd) { + Logger.println("BDD step is disabled") + return + } + + steps.installLocalDependencies() + + steps.createDir('build/out') + + // TODO: удалить после выхода VAS 1.0.35 + steps.httpRequest( + 'https://cloud.svc.pulsar.ru/index.php/s/WKwmqpFXSjfYjAH/download', + 'oscript_modules/vanessa-automation-single/vanessa-automation-single.epf' + ) + + steps.catchError { + config.bddOptions.vrunnerSteps.each { + Logger.println("Шаг запуска сценариев командой ${it}") + steps.cmd("oscript_modules/bin/vrunner ${it} --ibconnection \"/F./build/ib\"") + } + } + + steps.stash('bdd-allure', 'build/out/allure/**', true) + steps.stash('bdd-cucumber', 'build/out/cucumber/**', true) + } +} 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 d0be9f1..b547510 100644 --- a/test/unit/groovy/ru/pulsar/jenkins/library/configuration/ConfigurationReaderTest.java +++ b/test/unit/groovy/ru/pulsar/jenkins/library/configuration/ConfigurationReaderTest.java @@ -46,6 +46,8 @@ class ConfigurationReaderTest { assertThat(jobConfiguration.getInitInfobaseOptions().getRunMigration()).isFalse(); assertThat(jobConfiguration.getInitInfobaseOptions().getAdditionalMigrationSteps()).contains("vanessa --settings ./tools/vrunner.first.json"); + + assertThat(jobConfiguration.getBddOptions().getVrunnerSteps()).contains("vanessa --settings ./tools/vrunner.json"); } } \ No newline at end of file diff --git a/vars/bdd.groovy b/vars/bdd.groovy new file mode 100644 index 0000000..13d045a --- /dev/null +++ b/vars/bdd.groovy @@ -0,0 +1,10 @@ +import ru.pulsar.jenkins.library.configuration.JobConfiguration +import ru.pulsar.jenkins.library.ioc.ContextRegistry +import ru.pulsar.jenkins.library.steps.Bdd + +def call(JobConfiguration config) { + ContextRegistry.registerDefaultContext(this) + + def bdd = new Bdd(config) + bdd.run() +} \ No newline at end of file diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index ae8652e..6ad9808 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -113,6 +113,17 @@ void call() { } } + stage('BDD сценарии') { + when { + beforeAgent true + expression { config.stageFlags.bdd } + } + steps { + // Инициализация и первичная миграция + bdd config + } + } + stage('Синтаксический контроль') { agent { label agent1C From c40c9d1f613d7a4e7df3b6de6ec4274ebab276e9 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Wed, 21 Oct 2020 14:20:38 +0300 Subject: [PATCH 19/44] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B4=D0=B0?= =?UTF-8?q?=D1=87=D0=B0=20=D0=B2=20=D0=B0=D0=BB=D0=BB=D1=8E=D1=80=20=D0=BE?= =?UTF-8?q?=D1=82=D0=BD=D0=BE=D1=81=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20=D0=BF=D1=83=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy | 4 ++-- src/ru/pulsar/jenkins/library/utils/FileUtils.groovy | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy b/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy index 09d7569..36f1237 100644 --- a/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy +++ b/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy @@ -36,10 +36,10 @@ class PublishAllure implements Serializable { Logger.println(allurePath.listDirectories().toString()) allurePath.listDirectories().each { FilePath filePath -> - results.add(filePath.getRemote()) + results.add(FileUtils.getLocalPath(filePath)) } if (results.isEmpty()) { - results.add(allurePath.getRemote()) + results.add(FileUtils.getLocalPath(allurePath)) } Logger.println(results.toString()) diff --git a/src/ru/pulsar/jenkins/library/utils/FileUtils.groovy b/src/ru/pulsar/jenkins/library/utils/FileUtils.groovy index eadf463..43d475b 100644 --- a/src/ru/pulsar/jenkins/library/utils/FileUtils.groovy +++ b/src/ru/pulsar/jenkins/library/utils/FileUtils.groovy @@ -24,4 +24,12 @@ class FileUtils { return new FilePath(Jenkins.getInstanceOrNull().getComputer(nodeName).getChannel(), path); } } + + static String getLocalPath(FilePath filePath) { + IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() + + def env = steps.env(); + + return filePath.getRemote().replaceAll("^$env.WORKSPACE/", "").toString() + } } From 37064740009aa68c2cc97d0466ff4fd21fcaf1bb Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Wed, 21 Oct 2020 14:52:13 +0300 Subject: [PATCH 20/44] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=20=D0=BB?= =?UTF-8?q?=D0=B8=D1=88=D0=BD=D0=B8=D0=B5=20=D0=BB=D0=BE=D0=B3=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ru/pulsar/jenkins/library/StepExecutor.groovy | 2 -- src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy | 5 ----- 2 files changed, 7 deletions(-) diff --git a/src/ru/pulsar/jenkins/library/StepExecutor.groovy b/src/ru/pulsar/jenkins/library/StepExecutor.groovy index 1bc06a0..facf839 100644 --- a/src/ru/pulsar/jenkins/library/StepExecutor.groovy +++ b/src/ru/pulsar/jenkins/library/StepExecutor.groovy @@ -1,7 +1,6 @@ package ru.pulsar.jenkins.library import org.jenkinsci.plugins.workflow.support.actions.EnvironmentAction -import ru.pulsar.jenkins.library.utils.Logger import ru.yandex.qatools.allure.jenkins.config.ResultsConfig class StepExecutor implements IStepExecutor { @@ -118,7 +117,6 @@ class StepExecutor implements IStepExecutor { @Override def allure(List results) { - Logger.println(ResultsConfig.convertPaths(results)) steps.allure([ commandline: 'allure', includeProperties: false, diff --git a/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy b/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy index 36f1237..c1c00cb 100644 --- a/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy +++ b/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy @@ -32,9 +32,6 @@ class PublishAllure implements Serializable { List results = new ArrayList<>(); - Logger.println(allurePath.toString()) - Logger.println(allurePath.listDirectories().toString()) - allurePath.listDirectories().each { FilePath filePath -> results.add(FileUtils.getLocalPath(filePath)) } @@ -42,8 +39,6 @@ class PublishAllure implements Serializable { results.add(FileUtils.getLocalPath(allurePath)) } - Logger.println(results.toString()) - steps.allure(results) } From fa6f9eadfcfb593312a7894516cec2ac83f07ccf Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Wed, 21 Oct 2020 16:12:45 +0300 Subject: [PATCH 21/44] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D1=81=D0=B5=D0=BA=D1=86=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D0=B0=20=D0=B2=20=D0=B1=D0=B4?= =?UTF-8?q?=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vars/pipeline1C.groovy | 3 +++ 1 file changed, 3 insertions(+) diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index 6ad9808..8cdc1a9 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -114,6 +114,9 @@ void call() { } stage('BDD сценарии') { + agent { + label agent1C + } when { beforeAgent true expression { config.stageFlags.bdd } From 6e620f3336d16a1e75371fc62e8eb514d333b67d Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Wed, 21 Oct 2020 16:34:56 +0300 Subject: [PATCH 22/44] =?UTF-8?q?=D0=91=D0=B5=D0=B7=D0=BE=D0=BF=D0=B0?= =?UTF-8?q?=D1=81=D0=BD=D1=8B=D0=B9=20unstash=20=D1=80=D0=B5=D0=B7=D1=83?= =?UTF-8?q?=D0=BB=D1=8C=D1=82=D0=B0=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jenkins/library/steps/PublishAllure.groovy | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy b/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy index c1c00cb..2c6360d 100644 --- a/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy +++ b/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy @@ -10,17 +10,19 @@ import ru.pulsar.jenkins.library.utils.Logger class PublishAllure implements Serializable { private final JobConfiguration config; + private IStepExecutor steps; PublishAllure(JobConfiguration config) { this.config = config } def run() { - IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() + steps = ContextRegistry.getContext().getStepExecutor() Logger.printLocation() - steps.unstash('init-allure') + safeUnstash('init-allure') + safeUnstash('bdd-allure') def env = steps.env(); @@ -42,4 +44,11 @@ class PublishAllure implements Serializable { steps.allure(results) } + private void safeUnstash(String stashName) { + try { + steps.unstash(stashName) + } catch (Exception ex) { + Logger.println("Can't unstash $stashName") + } + } } From 095db60db37a34a8189c544dcac36106e69f6505 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Wed, 21 Oct 2020 17:43:39 +0300 Subject: [PATCH 23/44] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B8=D0=BC=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=20=D1=81=D0=B2=D0=BE=D0=B9=D1=81=D1=82=D0=B2=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/globalConfiguration.json | 2 +- resources/schema.json | 2 +- .../jenkins/library/configuration/JobConfiguration.groovy | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index 25b5e5a..d7bd1ae 100644 --- a/resources/globalConfiguration.json +++ b/resources/globalConfiguration.json @@ -17,7 +17,7 @@ "runMigration": true, "additionalMigrationSteps": [] }, - "bddOptions": { + "bdd": { "vrunnerSteps": [ "vanessa --settings ./tools/vrunner.json" ] diff --git a/resources/schema.json b/resources/schema.json index 75512e8..2e05d48 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -74,7 +74,7 @@ } } }, - "bddOptions" : { + "bdd" : { "type" : "object", "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:BddOptions", "description" : "Настройки шага запуска BDD сценариев", diff --git a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy index 2ff51f8..352308f 100644 --- a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy @@ -24,7 +24,7 @@ class JobConfiguration implements Serializable { @JsonPropertyDescription("Настройки шага инициализации ИБ") InitInfobaseOptions initInfobaseOptions; - @JsonProperty("bddOptions") + @JsonProperty("bdd") @JsonPropertyDescription("Настройки шага запуска BDD сценариев") BddOptions bddOptions; From 5ad71d7d45a598f55306eef9448b4d59e7626292 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Wed, 21 Oct 2020 18:07:33 +0300 Subject: [PATCH 24/44] =?UTF-8?q?=D0=92=D1=80=D0=B5=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=BD=D0=B0=D1=8F=20=D1=83=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BE=D1=82=D0=BB=D0=B0=D0=B4=D0=BE=D1=87=D0=BD?= =?UTF-8?q?=D1=8B=D1=85=20=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vars/pipeline1C.groovy | 3 +++ 1 file changed, 3 insertions(+) diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index 8cdc1a9..879d48e 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -117,6 +117,9 @@ void call() { agent { label agent1C } + environment { + LOGOS_LEVEL = 'DEBUG' + } when { beforeAgent true expression { config.stageFlags.bdd } From 280d548ca3f7ceeaaa4725633ce09af1fa4ad3ae Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Wed, 21 Oct 2020 18:43:08 +0300 Subject: [PATCH 25/44] =?UTF-8?q?=D0=A0=D0=B0=D0=B7=D0=B0=D1=80=D1=85?= =?UTF-8?q?=D0=B8=D0=B2=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=98=D0=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vars/pipeline1C.groovy | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index 879d48e..5f46749 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -125,7 +125,9 @@ void call() { expression { config.stageFlags.bdd } } steps { - // Инициализация и первичная миграция + + unzipInfobase() + bdd config } } From 91ecb8a7213449d6dc7e186aab51e515aafbd367 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Mon, 26 Oct 2020 17:54:59 +0300 Subject: [PATCH 26/44] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BE=D0=BF?= =?UTF-8?q?=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D0=BE=D0=B2=20git=20?= =?UTF-8?q?lfs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 1 + resources/globalConfiguration.json | 7 +- resources/schema.json | 18 +++++ .../jenkins/library/IStepExecutor.groovy | 6 ++ .../jenkins/library/StepExecutor.groovy | 12 ++++ .../configuration/ConfigurationReader.groovy | 3 +- .../configuration/GitSCMOptions.groovy | 23 +++++++ .../configuration/JobConfiguration.groovy | 5 ++ .../library/configuration/Secrets.groovy | 4 ++ .../jenkins/library/steps/EdtTransform.groovy | 66 +++++++++++++++++++ .../library/steps/GitSCMExtension.groovy | 16 +++++ 11 files changed, 159 insertions(+), 2 deletions(-) create mode 100644 src/ru/pulsar/jenkins/library/configuration/GitSCMOptions.groovy create mode 100644 src/ru/pulsar/jenkins/library/steps/GitSCMExtension.groovy diff --git a/build.gradle.kts b/build.gradle.kts index 7af7246..643a9db 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -78,6 +78,7 @@ sharedLibrary { // TODO: retrieve downloaded plugin resource pluginDependencies { dependency("org.jenkins-ci.plugins", "pipeline-build-step", "2.12") + dependency("org.jenkins-ci.plugins", "git", "4.4.4") dependency("org.6wind.jenkins", "lockable-resources", "2.7") dependency("ru.yandex.qatools.allure", "allure-jenkins-plugin", "2.28.1") val declarativePluginsVersion = "1.6.0" diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index d7bd1ae..8841a10 100644 --- a/resources/globalConfiguration.json +++ b/resources/globalConfiguration.json @@ -3,7 +3,8 @@ "srcDir": "src/cf", "secrets": { "storagePath": "UNKNOWN_ID", - "storage": "UNKNOWN_ID" + "storage": "UNKNOWN_ID", + "lfs": "UNKNOWN_ID" }, "stages": { "initSteps": false, @@ -47,5 +48,9 @@ "resultsTransform": { "removeSupport": false, "supportLevel": 0 + }, + "git": { + "lfsPull": false, + "lfsURI": "" } } diff --git a/resources/schema.json b/resources/schema.json index 2e05d48..8534a7e 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -22,6 +22,10 @@ "storage" : { "type" : "string", "description" : "Данные авторизации в хранилище конфигурации" + }, + "lfs" : { + "type" : "string", + "description" : "Данные авторизации для работы с LFS" } } }, @@ -143,6 +147,20 @@ "description" : "Настройка фильтрации замечаний по уровню поддержки.\n 0 - удалить файлы на замке;\n 1 - удалить файлы на замке и на поддержке;\n 2 - удалить файлы на замке, на поддержке и снятые с поддержки.\n " } } + }, + "git" : { + "type" : "object", + "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:GitSCMOptions", + "description" : "Настройки git-репозитория", + "properties" : { + "lfsPull" : { + "type" : "boolean", + "description" : "Дополнительно выполнить git lfs pull" + }, + "lfsURI" : { + "type" : "string" + } + } } } } \ No newline at end of file diff --git a/src/ru/pulsar/jenkins/library/IStepExecutor.groovy b/src/ru/pulsar/jenkins/library/IStepExecutor.groovy index 54d57af..5d9d8a8 100644 --- a/src/ru/pulsar/jenkins/library/IStepExecutor.groovy +++ b/src/ru/pulsar/jenkins/library/IStepExecutor.groovy @@ -1,5 +1,7 @@ package ru.pulsar.jenkins.library +import hudson.plugins.git.GitSCM +import hudson.scm.SCM import org.jenkinsci.plugins.workflow.support.actions.EnvironmentAction interface IStepExecutor { @@ -26,6 +28,10 @@ interface IStepExecutor { EnvironmentAction env() + GitSCM scm() + + void checkout(SCM scm) + void createDir(String path) def withEnv(List strings, Closure body) diff --git a/src/ru/pulsar/jenkins/library/StepExecutor.groovy b/src/ru/pulsar/jenkins/library/StepExecutor.groovy index facf839..c297dfa 100644 --- a/src/ru/pulsar/jenkins/library/StepExecutor.groovy +++ b/src/ru/pulsar/jenkins/library/StepExecutor.groovy @@ -1,5 +1,7 @@ package ru.pulsar.jenkins.library +import hudson.plugins.git.GitSCM +import hudson.scm.SCM import org.jenkinsci.plugins.workflow.support.actions.EnvironmentAction import ru.yandex.qatools.allure.jenkins.config.ResultsConfig @@ -63,6 +65,16 @@ class StepExecutor implements IStepExecutor { return steps.env } + @Override + GitSCM scm() { + return steps.scm + } + + @Override + void checkout(SCM scm) { + steps.checkout(scm) + } + @Override void createDir(String path) { steps.createDir(path) diff --git a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy index 1065790..8388096 100644 --- a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy @@ -47,7 +47,8 @@ class ConfigurationReader implements Serializable { "bddOptions", "sonarQubeOptions", "syntaxCheckOptions", - "resultsTransformOptions" + "resultsTransformOptions", + "gitSCMOptions" ).toSet() mergeObjects(baseConfiguration, configurationToMerge, nonMergeableSettings) diff --git a/src/ru/pulsar/jenkins/library/configuration/GitSCMOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/GitSCMOptions.groovy new file mode 100644 index 0000000..e47a71e --- /dev/null +++ b/src/ru/pulsar/jenkins/library/configuration/GitSCMOptions.groovy @@ -0,0 +1,23 @@ +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 GitSCMOptions implements Serializable { + + @JsonPropertyDescription("Дополнительно выполнить git lfs pull") + boolean lfsPull + + String lfsURI = "" + + @Override + @NonCPS + String toString() { + return "GitSCMOptions{" + + "lfsPull=" + lfsPull + + "lfsURI=" + lfsURI + + '}'; + } +} diff --git a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy index 352308f..babde5a 100644 --- a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy @@ -40,6 +40,10 @@ class JobConfiguration implements Serializable { @JsonPropertyDescription("Настройки трансформации результатов анализа") ResultsTransformOptions resultsTransformOptions; + @JsonProperty("git") + @JsonPropertyDescription("Настройки git-репозитория") + GitSCMOptions gitSCMOptions; + @Override @NonCPS String toString() { @@ -53,6 +57,7 @@ class JobConfiguration implements Serializable { ", sonarQubeOptions=" + sonarQubeOptions + ", syntaxCheckOptions=" + syntaxCheckOptions + ", resultsTransformOptions=" + resultsTransformOptions + + ", gitSCMOptions=" + gitSCMOptions + '}'; } } \ No newline at end of file diff --git a/src/ru/pulsar/jenkins/library/configuration/Secrets.groovy b/src/ru/pulsar/jenkins/library/configuration/Secrets.groovy index 0ee17f0..b27d418 100644 --- a/src/ru/pulsar/jenkins/library/configuration/Secrets.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/Secrets.groovy @@ -13,12 +13,16 @@ class Secrets implements Serializable { @JsonPropertyDescription("Данные авторизации в хранилище конфигурации") String storage + @JsonPropertyDescription("Данные авторизации для работы с LFS") + String lfs + @Override @NonCPS String toString() { return "Secrets{" + "storagePath='" + storagePath + '\'' + ", storage='" + storage + '\'' + + ", lfs='" + lfs + '\'' + '}'; } } diff --git a/src/ru/pulsar/jenkins/library/steps/EdtTransform.groovy b/src/ru/pulsar/jenkins/library/steps/EdtTransform.groovy index 4b2a065..c8e8102 100644 --- a/src/ru/pulsar/jenkins/library/steps/EdtTransform.groovy +++ b/src/ru/pulsar/jenkins/library/steps/EdtTransform.groovy @@ -1,5 +1,9 @@ package ru.pulsar.jenkins.library.steps + +import hudson.plugins.git.GitSCM +import hudson.plugins.git.UserRemoteConfig +import hudson.plugins.git.extensions.impl.GitLFSPull import ru.pulsar.jenkins.library.IStepExecutor import ru.pulsar.jenkins.library.configuration.JobConfiguration import ru.pulsar.jenkins.library.ioc.ContextRegistry @@ -28,6 +32,8 @@ class EdtTransform implements Serializable { return } + doSCM() + def env = steps.env(); def workspaceDir = "$env.WORKSPACE/$WORKSPACE" @@ -47,4 +53,64 @@ class EdtTransform implements Serializable { steps.zip(WORKSPACE, WORKSPACE_ZIP) steps.stash(WORKSPACE_ZIP_STASH, WORKSPACE_ZIP) } + + private void doSCM() { + + def gitSCMOptions = config.gitSCMOptions + + if (!gitSCMOptions.lfsPull) { + return + } + + IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() + + def scm = steps.scm() + + boolean needToCheckout = false + needToCheckout = addLFS(scm, needToCheckout) + scm = addLFSRemoteConfig(scm) + + if (needToCheckout) { + steps.checkout(scm) + } + } + + private boolean addLFS(GitSCM scm, boolean needToCheckout) { + GitLFSPull gitLFS = new GitLFSPull(); + def extensions = scm.getExtensions() + if (!extensions.contains(gitLFS)) { + needToCheckout = true + extensions.add(gitLFS) + } + needToCheckout + } + + private GitSCM addLFSRemoteConfig(GitSCM scm) { + def gitSCMOptions = config.gitSCMOptions + + if (gitSCMOptions.lfsURI.isEmpty()) { + return scm + } + + List userRemoteConfigs = new ArrayList<>(scm.getUserRemoteConfigs()) + + def userRemoteConfig = userRemoteConfigs.find { it.url == gitSCMOptions.lfsURI } + if (userRemoteConfig == null) { + def credentialsId = config.secrets.lfs.isEmpty() ? null : config.secrets.lfs + userRemoteConfig = new UserRemoteConfig(config.gitSCMOptions.lfsURI, null, null, credentialsId) + userRemoteConfigs.add(0, userRemoteConfig) + + scm = new GitSCM( + userRemoteConfigs, + scm.branches, + scm.doGenerateSubmoduleConfigurations, + scm.submoduleCfg, + scm.browser, + scm.gitTool, + scm.extensions + ) + } + + return scm + } } diff --git a/src/ru/pulsar/jenkins/library/steps/GitSCMExtension.groovy b/src/ru/pulsar/jenkins/library/steps/GitSCMExtension.groovy new file mode 100644 index 0000000..af387cc --- /dev/null +++ b/src/ru/pulsar/jenkins/library/steps/GitSCMExtension.groovy @@ -0,0 +1,16 @@ +package ru.pulsar.jenkins.library.steps + +import ru.pulsar.jenkins.library.configuration.JobConfiguration + +class GitSCMExtension implements Serializable { + + private final JobConfiguration config; + + GitSCMExtension(JobConfiguration config) { + this.config = config + } + + def run() { + + } +} From e824b24f65fe75928445b408a98caeb95b2e4b9b Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Thu, 29 Oct 2020 14:01:48 +0300 Subject: [PATCH 27/44] =?UTF-8?q?=D0=A0=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D0=B0=D1=8F=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8=D0=B3?= =?UTF-8?q?=D1=83=D1=80=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B4=D0=BB=D1=8F=20lfs?= =?UTF-8?q?Uri=20=D0=B8=20lfsRepoUri?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/globalConfiguration.json | 3 +- resources/schema.json | 7 +++- .../configuration/GitSCMOptions.groovy | 5 +++ .../jenkins/library/steps/EdtTransform.groovy | 34 +++++++++++++++++-- 4 files changed, 44 insertions(+), 5 deletions(-) diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index 8841a10..0d5a3b9 100644 --- a/resources/globalConfiguration.json +++ b/resources/globalConfiguration.json @@ -51,6 +51,7 @@ }, "git": { "lfsPull": false, - "lfsURI": "" + "lfsURI": "", + "lfsRepoURI": "" } } diff --git a/resources/schema.json b/resources/schema.json index 8534a7e..46022fd 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -158,7 +158,12 @@ "description" : "Дополнительно выполнить git lfs pull" }, "lfsURI" : { - "type" : "string" + "type" : "string", + "description" : "Адрес для получения данных LFS" + }, + "lfsRepoURI" : { + "type" : "string", + "description" : "Адрес удаленного репозитория для авторизации на LFS" } } } diff --git a/src/ru/pulsar/jenkins/library/configuration/GitSCMOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/GitSCMOptions.groovy index e47a71e..9b98d15 100644 --- a/src/ru/pulsar/jenkins/library/configuration/GitSCMOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/GitSCMOptions.groovy @@ -10,14 +10,19 @@ class GitSCMOptions implements Serializable { @JsonPropertyDescription("Дополнительно выполнить git lfs pull") boolean lfsPull + @JsonPropertyDescription("Адрес для получения данных LFS") String lfsURI = "" + @JsonPropertyDescription("Адрес удаленного репозитория для авторизации на LFS") + String lfsRepoURI = "" + @Override @NonCPS String toString() { return "GitSCMOptions{" + "lfsPull=" + lfsPull + "lfsURI=" + lfsURI + + "lfsRepoURI=" + lfsRepoURI + '}'; } } diff --git a/src/ru/pulsar/jenkins/library/steps/EdtTransform.groovy b/src/ru/pulsar/jenkins/library/steps/EdtTransform.groovy index c8e8102..739d57d 100644 --- a/src/ru/pulsar/jenkins/library/steps/EdtTransform.groovy +++ b/src/ru/pulsar/jenkins/library/steps/EdtTransform.groovy @@ -92,14 +92,42 @@ class EdtTransform implements Serializable { return scm } + IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() + + // TODO: get git.exe path from scm settings + steps.cmd("git config -f .lfsconfig lfs.url $gitSCMOptions.lfsURI") + List userRemoteConfigs = new ArrayList<>(scm.getUserRemoteConfigs()) - def userRemoteConfig = userRemoteConfigs.find { it.url == gitSCMOptions.lfsURI } + def userRemoteConfig = userRemoteConfigs.find { it.url == gitSCMOptions.lfsRepoURI } + boolean needToUpdateUserRemoteConfigs if (userRemoteConfig == null) { def credentialsId = config.secrets.lfs.isEmpty() ? null : config.secrets.lfs - userRemoteConfig = new UserRemoteConfig(config.gitSCMOptions.lfsURI, null, null, credentialsId) - userRemoteConfigs.add(0, userRemoteConfig) + userRemoteConfig = new UserRemoteConfig( + config.gitSCMOptions.lfsRepoURI, + null, + null, + credentialsId + ) + needToUpdateUserRemoteConfigs = true + } else { + def credentialsId = config.secrets.lfs.isEmpty() ? userRemoteConfig.credentialsId : config.secrets.lfs + + if (userRemoteConfig.credentialsId != credentialsId) { + userRemoteConfig = new UserRemoteConfig( + userRemoteConfig.url, + null, + userRemoteConfig.refspec, + credentialsId + ) + + needToUpdateUserRemoteConfigs = true + } + } + + if (needToUpdateUserRemoteConfigs) { + userRemoteConfigs.add(0, userRemoteConfig) scm = new GitSCM( userRemoteConfigs, scm.branches, From 3cdbaa62171df624e5a7abdf5474a553d99c47fc Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Fri, 30 Oct 2020 09:48:24 +0300 Subject: [PATCH 28/44] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BE=D0=BF?= =?UTF-8?q?=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B4?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20=D0=B4=D0=BB=D1=8F=20=D0=BF?= =?UTF-8?q?=D1=83=D0=BB=D0=B8=D0=BD=D0=B3=D0=B0=20=D1=82=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=BA=D0=BE=20=D0=B5=D1=81=D0=BB=D0=B8=20=D0=B7=D0=B0=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=20lfsRepoUri?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ru/pulsar/jenkins/library/steps/EdtTransform.groovy | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ru/pulsar/jenkins/library/steps/EdtTransform.groovy b/src/ru/pulsar/jenkins/library/steps/EdtTransform.groovy index 739d57d..3ff8e48 100644 --- a/src/ru/pulsar/jenkins/library/steps/EdtTransform.groovy +++ b/src/ru/pulsar/jenkins/library/steps/EdtTransform.groovy @@ -99,6 +99,10 @@ class EdtTransform implements Serializable { List userRemoteConfigs = new ArrayList<>(scm.getUserRemoteConfigs()) + if (gitSCMOptions.lfsRepoURI.isEmpty()) { + return scm + } + def userRemoteConfig = userRemoteConfigs.find { it.url == gitSCMOptions.lfsRepoURI } boolean needToUpdateUserRemoteConfigs if (userRemoteConfig == null) { From e464e716987746d10a11b41765e78b438cf2f33c Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Fri, 30 Oct 2020 10:01:15 +0300 Subject: [PATCH 29/44] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=D0=BE=20?= =?UTF-8?q?=D0=BE=D1=82=D0=BB=D0=B0=D0=B4=D0=BE=D1=87=D0=BD=D0=BE=D0=B5=20?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vars/pipeline1C.groovy | 3 --- 1 file changed, 3 deletions(-) diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index 5f46749..d7a8037 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -117,9 +117,6 @@ void call() { agent { label agent1C } - environment { - LOGOS_LEVEL = 'DEBUG' - } when { beforeAgent true expression { config.stageFlags.bdd } From 7b81ee559db9a86c1a9d2990200b63399b79e140 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Fri, 30 Oct 2020 16:37:12 +0300 Subject: [PATCH 30/44] =?UTF-8?q?=D0=92=D1=8B=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20LFS=20=D0=BF=D0=BE=20=D1=83=D0=BC?= =?UTF-8?q?=D0=BE=D0=BB=D1=87=D0=B0=D0=BD=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vars/pipeline1C.groovy | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index d7a8037..5b38171 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -21,6 +21,10 @@ void call() { timestamps() } + environment { + GIT_LFS_SKIP_SMUDGE = '1' + } + stages { stage('pre-stage') { From d9023dcc38579207e8eef59718eec190861ab9cb Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Fri, 30 Oct 2020 17:02:16 +0300 Subject: [PATCH 31/44] =?UTF-8?q?=D0=9E=D1=82=D0=BB=D0=BE=D0=B6=D0=B5?= =?UTF-8?q?=D0=BD=D0=BD=D0=B0=D1=8F=20=D0=B8=D0=BD=D0=B8=D1=86=D0=B8=D0=B0?= =?UTF-8?q?=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vars/pipeline1C.groovy | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index 5b38171..4dbf8c6 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -19,10 +19,7 @@ void call() { buildDiscarder(logRotator(numToKeepStr: '30')) timeout(time: 2, unit: TimeUnit.HOURS) timestamps() - } - - environment { - GIT_LFS_SKIP_SMUDGE = '1' + skipDefaultCheckout(true) } stages { @@ -31,7 +28,14 @@ void call() { agent { label 'agent' } + + environment { + GIT_LFS_SKIP_SMUDGE=1 + } + steps { + echo "test" + checkout scm script { config = jobConfiguration() as JobConfiguration agent1C = config.v8version @@ -55,6 +59,8 @@ void call() { steps { printLocation() + checkout scm + installLocalDependencies() createDir('build/out') @@ -96,6 +102,7 @@ void call() { expression { config.stageFlags.edtValidate } } steps { + checkout scm edtTransform config } } @@ -113,6 +120,7 @@ void call() { expression { config.stageFlags.edtValidate } } steps { + checkout scm edtValidate config } } @@ -126,7 +134,7 @@ void call() { expression { config.stageFlags.bdd } } steps { - + checkout scm unzipInfobase() bdd config @@ -142,6 +150,7 @@ void call() { expression { config.stageFlags.syntaxCheck } } steps { + checkout scm syntaxCheck config } } @@ -155,6 +164,7 @@ void call() { expression { config.stageFlags.smoke } } steps { + checkout scm smoke config } } @@ -170,6 +180,7 @@ void call() { expression { config.stageFlags.edtValidate } } steps { + checkout scm transform config } } @@ -183,6 +194,7 @@ void call() { expression { config.stageFlags.sonarqube } } steps { + checkout scm sonarScanner config } } From 6cfc76ae8d46c776bdd72d8b5e46a39742ae5733 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Tue, 3 Nov 2020 11:50:41 +0300 Subject: [PATCH 32/44] =?UTF-8?q?=D0=92=D1=8B=D0=BD=D0=BE=D1=81=20scm-?= =?UTF-8?q?=D1=88=D0=B0=D0=B3=D0=B0=20=D0=B2=20=D0=BE=D1=82=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jenkins/library/steps/Checkout.groovy | 97 +++++++++++++++++++ .../jenkins/library/steps/EdtTransform.groovy | 94 ------------------ vars/customCheckout.groovy | 10 ++ vars/pipeline1C.groovy | 21 ++-- 4 files changed, 119 insertions(+), 103 deletions(-) create mode 100644 src/ru/pulsar/jenkins/library/steps/Checkout.groovy create mode 100644 vars/customCheckout.groovy diff --git a/src/ru/pulsar/jenkins/library/steps/Checkout.groovy b/src/ru/pulsar/jenkins/library/steps/Checkout.groovy new file mode 100644 index 0000000..8414b4f --- /dev/null +++ b/src/ru/pulsar/jenkins/library/steps/Checkout.groovy @@ -0,0 +1,97 @@ +package ru.pulsar.jenkins.library.steps + +import hudson.plugins.git.GitSCM +import hudson.plugins.git.UserRemoteConfig +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 Checkout implements Serializable { + + private final JobConfiguration config; + + Checkout(JobConfiguration config) { + this.config = config + } + + def run() { + IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() + + Logger.printLocation() + + def gitSCMOptions = config.gitSCMOptions + + if (!gitSCMOptions.lfsPull) { + return + } + + def scm = steps.scm() + + scm = addLFSRemoteConfig(scm) + + steps.checkout(scm) + + } + + private GitSCM addLFSRemoteConfig(GitSCM scm) { + def gitSCMOptions = config.gitSCMOptions + + if (gitSCMOptions.lfsURI.isEmpty()) { + return scm + } + + IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() + + // TODO: get git.exe path from scm settings + steps.cmd("git config -f .lfsconfig lfs.url $gitSCMOptions.lfsURI") + + List userRemoteConfigs = new ArrayList<>(scm.getUserRemoteConfigs()) + + if (gitSCMOptions.lfsRepoURI.isEmpty()) { + return scm + } + + def userRemoteConfig = userRemoteConfigs.find { it.url == gitSCMOptions.lfsRepoURI } + boolean needToUpdateUserRemoteConfigs + if (userRemoteConfig == null) { + def credentialsId = config.secrets.lfs.isEmpty() ? null : config.secrets.lfs + userRemoteConfig = new UserRemoteConfig( + config.gitSCMOptions.lfsRepoURI, + null, + null, + credentialsId + ) + + needToUpdateUserRemoteConfigs = true + } else { + def credentialsId = config.secrets.lfs.isEmpty() ? userRemoteConfig.credentialsId : config.secrets.lfs + + if (userRemoteConfig.credentialsId != credentialsId) { + userRemoteConfig = new UserRemoteConfig( + userRemoteConfig.url, + null, + userRemoteConfig.refspec, + credentialsId + ) + + needToUpdateUserRemoteConfigs = true + } + } + + if (needToUpdateUserRemoteConfigs) { + userRemoteConfigs.add(0, userRemoteConfig) + scm = new GitSCM( + userRemoteConfigs, + scm.branches, + scm.doGenerateSubmoduleConfigurations, + scm.submoduleCfg, + scm.browser, + scm.gitTool, + scm.extensions + ) + } + + return scm + } +} diff --git a/src/ru/pulsar/jenkins/library/steps/EdtTransform.groovy b/src/ru/pulsar/jenkins/library/steps/EdtTransform.groovy index 3ff8e48..837108d 100644 --- a/src/ru/pulsar/jenkins/library/steps/EdtTransform.groovy +++ b/src/ru/pulsar/jenkins/library/steps/EdtTransform.groovy @@ -1,9 +1,6 @@ package ru.pulsar.jenkins.library.steps -import hudson.plugins.git.GitSCM -import hudson.plugins.git.UserRemoteConfig -import hudson.plugins.git.extensions.impl.GitLFSPull import ru.pulsar.jenkins.library.IStepExecutor import ru.pulsar.jenkins.library.configuration.JobConfiguration import ru.pulsar.jenkins.library.ioc.ContextRegistry @@ -54,95 +51,4 @@ class EdtTransform implements Serializable { steps.stash(WORKSPACE_ZIP_STASH, WORKSPACE_ZIP) } - private void doSCM() { - - def gitSCMOptions = config.gitSCMOptions - - if (!gitSCMOptions.lfsPull) { - return - } - - IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() - - def scm = steps.scm() - - boolean needToCheckout = false - needToCheckout = addLFS(scm, needToCheckout) - scm = addLFSRemoteConfig(scm) - - if (needToCheckout) { - steps.checkout(scm) - } - } - - private boolean addLFS(GitSCM scm, boolean needToCheckout) { - GitLFSPull gitLFS = new GitLFSPull(); - def extensions = scm.getExtensions() - if (!extensions.contains(gitLFS)) { - needToCheckout = true - extensions.add(gitLFS) - } - needToCheckout - } - - private GitSCM addLFSRemoteConfig(GitSCM scm) { - def gitSCMOptions = config.gitSCMOptions - - if (gitSCMOptions.lfsURI.isEmpty()) { - return scm - } - - IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() - - // TODO: get git.exe path from scm settings - steps.cmd("git config -f .lfsconfig lfs.url $gitSCMOptions.lfsURI") - - List userRemoteConfigs = new ArrayList<>(scm.getUserRemoteConfigs()) - - if (gitSCMOptions.lfsRepoURI.isEmpty()) { - return scm - } - - def userRemoteConfig = userRemoteConfigs.find { it.url == gitSCMOptions.lfsRepoURI } - boolean needToUpdateUserRemoteConfigs - if (userRemoteConfig == null) { - def credentialsId = config.secrets.lfs.isEmpty() ? null : config.secrets.lfs - userRemoteConfig = new UserRemoteConfig( - config.gitSCMOptions.lfsRepoURI, - null, - null, - credentialsId - ) - - needToUpdateUserRemoteConfigs = true - } else { - def credentialsId = config.secrets.lfs.isEmpty() ? userRemoteConfig.credentialsId : config.secrets.lfs - - if (userRemoteConfig.credentialsId != credentialsId) { - userRemoteConfig = new UserRemoteConfig( - userRemoteConfig.url, - null, - userRemoteConfig.refspec, - credentialsId - ) - - needToUpdateUserRemoteConfigs = true - } - } - - if (needToUpdateUserRemoteConfigs) { - userRemoteConfigs.add(0, userRemoteConfig) - scm = new GitSCM( - userRemoteConfigs, - scm.branches, - scm.doGenerateSubmoduleConfigurations, - scm.submoduleCfg, - scm.browser, - scm.gitTool, - scm.extensions - ) - } - - return scm - } } diff --git a/vars/customCheckout.groovy b/vars/customCheckout.groovy new file mode 100644 index 0000000..2056db9 --- /dev/null +++ b/vars/customCheckout.groovy @@ -0,0 +1,10 @@ +import ru.pulsar.jenkins.library.configuration.JobConfiguration +import ru.pulsar.jenkins.library.ioc.ContextRegistry +import ru.pulsar.jenkins.library.steps.Checkout + +void call(JobConfiguration config) { + ContextRegistry.registerDefaultContext(this) + + def checkout = new Checkout(config) + checkout.run() +} \ No newline at end of file diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index 4dbf8c6..cebaec1 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -29,13 +29,16 @@ void call() { label 'agent' } + options { + skipDefaultCheckout(false) + } + environment { GIT_LFS_SKIP_SMUDGE=1 } steps { echo "test" - checkout scm script { config = jobConfiguration() as JobConfiguration agent1C = config.v8version @@ -59,7 +62,7 @@ void call() { steps { printLocation() - checkout scm + customCheckout config installLocalDependencies() @@ -102,7 +105,7 @@ void call() { expression { config.stageFlags.edtValidate } } steps { - checkout scm + customCheckout config edtTransform config } } @@ -120,7 +123,7 @@ void call() { expression { config.stageFlags.edtValidate } } steps { - checkout scm + customCheckout config edtValidate config } } @@ -134,7 +137,7 @@ void call() { expression { config.stageFlags.bdd } } steps { - checkout scm + customCheckout config unzipInfobase() bdd config @@ -150,7 +153,7 @@ void call() { expression { config.stageFlags.syntaxCheck } } steps { - checkout scm + customCheckout config syntaxCheck config } } @@ -164,7 +167,7 @@ void call() { expression { config.stageFlags.smoke } } steps { - checkout scm + customCheckout config smoke config } } @@ -180,7 +183,7 @@ void call() { expression { config.stageFlags.edtValidate } } steps { - checkout scm + customCheckout config transform config } } @@ -194,7 +197,7 @@ void call() { expression { config.stageFlags.sonarqube } } steps { - checkout scm + customCheckout config sonarScanner config } } From 9950412e4746de808c9fb1fdb2d96cd7bd37ae3d Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Tue, 3 Nov 2020 11:53:01 +0300 Subject: [PATCH 33/44] =?UTF-8?q?=D0=BE=D1=82=D0=BB=D0=B0=D0=B4=D0=BA?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vars/pipeline1C.groovy | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index cebaec1..79a224f 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -30,7 +30,7 @@ void call() { } options { - skipDefaultCheckout(false) + skipDefaultCheckout(true) } environment { @@ -39,6 +39,8 @@ void call() { steps { echo "test" + cmd "env" + checkout scm script { config = jobConfiguration() as JobConfiguration agent1C = config.v8version From 3fe07a6255f28c033c9f89104bfa9b123424765e Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Tue, 10 Nov 2020 10:23:50 +0300 Subject: [PATCH 34/44] =?UTF-8?q?=D0=9E=D1=82=D0=BA=D0=B0=D1=82=20=D0=B8?= =?UTF-8?q?=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20scm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jenkins/library/steps/EdtTransform.groovy | 2 -- vars/pipeline1C.groovy | 21 ------------------- 2 files changed, 23 deletions(-) diff --git a/src/ru/pulsar/jenkins/library/steps/EdtTransform.groovy b/src/ru/pulsar/jenkins/library/steps/EdtTransform.groovy index 837108d..68e53e6 100644 --- a/src/ru/pulsar/jenkins/library/steps/EdtTransform.groovy +++ b/src/ru/pulsar/jenkins/library/steps/EdtTransform.groovy @@ -29,8 +29,6 @@ class EdtTransform implements Serializable { return } - doSCM() - def env = steps.env(); def workspaceDir = "$env.WORKSPACE/$WORKSPACE" diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index 79a224f..04ee349 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -19,7 +19,6 @@ void call() { buildDiscarder(logRotator(numToKeepStr: '30')) timeout(time: 2, unit: TimeUnit.HOURS) timestamps() - skipDefaultCheckout(true) } stages { @@ -29,18 +28,7 @@ void call() { label 'agent' } - options { - skipDefaultCheckout(true) - } - - environment { - GIT_LFS_SKIP_SMUDGE=1 - } - steps { - echo "test" - cmd "env" - checkout scm script { config = jobConfiguration() as JobConfiguration agent1C = config.v8version @@ -64,8 +52,6 @@ void call() { steps { printLocation() - customCheckout config - installLocalDependencies() createDir('build/out') @@ -107,7 +93,6 @@ void call() { expression { config.stageFlags.edtValidate } } steps { - customCheckout config edtTransform config } } @@ -125,7 +110,6 @@ void call() { expression { config.stageFlags.edtValidate } } steps { - customCheckout config edtValidate config } } @@ -139,7 +123,6 @@ void call() { expression { config.stageFlags.bdd } } steps { - customCheckout config unzipInfobase() bdd config @@ -155,7 +138,6 @@ void call() { expression { config.stageFlags.syntaxCheck } } steps { - customCheckout config syntaxCheck config } } @@ -169,7 +151,6 @@ void call() { expression { config.stageFlags.smoke } } steps { - customCheckout config smoke config } } @@ -185,7 +166,6 @@ void call() { expression { config.stageFlags.edtValidate } } steps { - customCheckout config transform config } } @@ -199,7 +179,6 @@ void call() { expression { config.stageFlags.sonarqube } } steps { - customCheckout config sonarScanner config } } From 3bf8d5eea8dba9fe76a59fc2366b6731ee70246c Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Mon, 31 May 2021 17:35:32 +0300 Subject: [PATCH 35/44] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20=D1=84=D0=B8=D0=BA=D1=81=D0=B0=20VAS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ru/pulsar/jenkins/library/steps/Bdd.groovy | 6 ------ src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy | 6 ------ 2 files changed, 12 deletions(-) diff --git a/src/ru/pulsar/jenkins/library/steps/Bdd.groovy b/src/ru/pulsar/jenkins/library/steps/Bdd.groovy index 6a1e9cb..29be444 100644 --- a/src/ru/pulsar/jenkins/library/steps/Bdd.groovy +++ b/src/ru/pulsar/jenkins/library/steps/Bdd.groovy @@ -27,12 +27,6 @@ class Bdd implements Serializable { steps.createDir('build/out') - // TODO: удалить после выхода VAS 1.0.35 - steps.httpRequest( - 'https://cloud.svc.pulsar.ru/index.php/s/WKwmqpFXSjfYjAH/download', - 'oscript_modules/vanessa-automation-single/vanessa-automation-single.epf' - ) - steps.catchError { config.bddOptions.vrunnerSteps.each { Logger.println("Шаг запуска сценариев командой ${it}") diff --git a/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy index deb5ec7..65ffe18 100644 --- a/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy +++ b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy @@ -36,12 +36,6 @@ class InitInfobase implements Serializable { Logger.println("Шаг миграции ИБ выключен") } - // TODO: удалить после выхода VAS 1.0.35 - steps.httpRequest( - 'https://cloud.svc.pulsar.ru/index.php/s/WKwmqpFXSjfYjAH/download', - 'oscript_modules/vanessa-automation-single/vanessa-automation-single.epf' - ) - steps.catchError { config.initInfobaseOptions.additionalMigrationSteps.each { Logger.println("Первичная инициализация командой ${it}") From dbc75943a5c7a683eb9be7d6a253706651321510 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Mon, 31 May 2021 17:35:32 +0300 Subject: [PATCH 36/44] =?UTF-8?q?=D0=9D=D0=BE=D0=B2=D0=B0=D1=8F=20=D0=B2?= =?UTF-8?q?=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D0=B0=D1=8F=20VAS=20=D1=81?= =?UTF-8?q?=20=D1=82=D0=B8=D1=85=D0=BE=D0=B9=20=D1=83=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=BA=D0=BE=D0=B9=20Vanessa-Ext?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ru/pulsar/jenkins/library/steps/Bdd.groovy | 6 ++++++ src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/src/ru/pulsar/jenkins/library/steps/Bdd.groovy b/src/ru/pulsar/jenkins/library/steps/Bdd.groovy index 29be444..6a1e9cb 100644 --- a/src/ru/pulsar/jenkins/library/steps/Bdd.groovy +++ b/src/ru/pulsar/jenkins/library/steps/Bdd.groovy @@ -27,6 +27,12 @@ class Bdd implements Serializable { steps.createDir('build/out') + // TODO: удалить после выхода VAS 1.0.35 + steps.httpRequest( + 'https://cloud.svc.pulsar.ru/index.php/s/WKwmqpFXSjfYjAH/download', + 'oscript_modules/vanessa-automation-single/vanessa-automation-single.epf' + ) + steps.catchError { config.bddOptions.vrunnerSteps.each { Logger.println("Шаг запуска сценариев командой ${it}") diff --git a/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy index 65ffe18..deb5ec7 100644 --- a/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy +++ b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy @@ -36,6 +36,12 @@ class InitInfobase implements Serializable { Logger.println("Шаг миграции ИБ выключен") } + // TODO: удалить после выхода VAS 1.0.35 + steps.httpRequest( + 'https://cloud.svc.pulsar.ru/index.php/s/WKwmqpFXSjfYjAH/download', + 'oscript_modules/vanessa-automation-single/vanessa-automation-single.epf' + ) + steps.catchError { config.initInfobaseOptions.additionalMigrationSteps.each { Logger.println("Первичная инициализация командой ${it}") From 2819b31171bfa4c211131777242fc85a27f8d40c Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Wed, 2 Jun 2021 13:00:19 +0300 Subject: [PATCH 37/44] =?UTF-8?q?=D0=92=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6?= =?UTF-8?q?=D0=BD=D0=BE=D1=81=D1=82=D1=8C=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8?= =?UTF-8?q?=D0=B3=D1=83=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20logos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/globalConfiguration.json | 3 +- resources/schema.json | 4 +++ src/JobConfigurationSchemaGenerator.java | 2 +- .../configuration/JobConfiguration.groovy | 5 +++ .../pulsar/jenkins/library/steps/Bdd.groovy | 25 ++++++++------ .../jenkins/library/steps/InitInfobase.groovy | 34 +++++++++++-------- .../ConfigurationReaderTest.java | 2 ++ test/unit/resources/jobConfiguration.json | 3 +- 8 files changed, 49 insertions(+), 29 deletions(-) diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index 0d5a3b9..b25868f 100644 --- a/resources/globalConfiguration.json +++ b/resources/globalConfiguration.json @@ -53,5 +53,6 @@ "lfsPull": false, "lfsURI": "", "lfsRepoURI": "" - } + }, + "logosConfig": "" } diff --git a/resources/schema.json b/resources/schema.json index 46022fd..e964184 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -166,6 +166,10 @@ "description" : "Адрес удаленного репозитория для авторизации на LFS" } } + }, + "logosConfig" : { + "type" : "string", + "description" : "Конфигурация библиотеки logos. Применяется перед запуском каждой стадии сборки" } } } \ No newline at end of file diff --git a/src/JobConfigurationSchemaGenerator.java b/src/JobConfigurationSchemaGenerator.java index 68fe569..0a542b0 100644 --- a/src/JobConfigurationSchemaGenerator.java +++ b/src/JobConfigurationSchemaGenerator.java @@ -21,7 +21,7 @@ public class JobConfigurationSchemaGenerator { File jsonSchemaFile = new File("./resources/schema.json"); mapper.writeValue(jsonSchemaFile, jsonSchema); - System.out.println(json.toString()); + System.out.println(json); } } diff --git a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy index babde5a..fbb3e93 100644 --- a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy @@ -44,6 +44,10 @@ class JobConfiguration implements Serializable { @JsonPropertyDescription("Настройки git-репозитория") GitSCMOptions gitSCMOptions; + @JsonProperty("logosConfig") + @JsonPropertyDescription("Конфигурация библиотеки logos. Применяется перед запуском каждой стадии сборки") + String logosConfig; + @Override @NonCPS String toString() { @@ -58,6 +62,7 @@ class JobConfiguration implements Serializable { ", syntaxCheckOptions=" + syntaxCheckOptions + ", resultsTransformOptions=" + resultsTransformOptions + ", gitSCMOptions=" + gitSCMOptions + + ", logosConfig=" + logosConfig + '}'; } } \ No newline at end of file diff --git a/src/ru/pulsar/jenkins/library/steps/Bdd.groovy b/src/ru/pulsar/jenkins/library/steps/Bdd.groovy index 6a1e9cb..ebb8629 100644 --- a/src/ru/pulsar/jenkins/library/steps/Bdd.groovy +++ b/src/ru/pulsar/jenkins/library/steps/Bdd.groovy @@ -23,20 +23,23 @@ class Bdd implements Serializable { return } - steps.installLocalDependencies() + List logosConfig = ["LOGOS_CONFIG=$config.logosConfig"] + steps.withEnv(logosConfig) { + steps.installLocalDependencies() - steps.createDir('build/out') + steps.createDir('build/out') - // TODO: удалить после выхода VAS 1.0.35 - steps.httpRequest( - 'https://cloud.svc.pulsar.ru/index.php/s/WKwmqpFXSjfYjAH/download', - 'oscript_modules/vanessa-automation-single/vanessa-automation-single.epf' - ) + // TODO: удалить после выхода VAS 1.0.35 + steps.httpRequest( + 'https://cloud.svc.pulsar.ru/index.php/s/WKwmqpFXSjfYjAH/download', + 'oscript_modules/vanessa-automation-single/vanessa-automation-single.epf' + ) - steps.catchError { - config.bddOptions.vrunnerSteps.each { - Logger.println("Шаг запуска сценариев командой ${it}") - steps.cmd("oscript_modules/bin/vrunner ${it} --ibconnection \"/F./build/ib\"") + steps.catchError { + config.bddOptions.vrunnerSteps.each { + Logger.println("Шаг запуска сценариев командой ${it}") + steps.cmd("oscript_modules/bin/vrunner ${it} --ibconnection \"/F./build/ib\"") + } } } diff --git a/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy index deb5ec7..4cbb215 100644 --- a/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy +++ b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy @@ -25,27 +25,31 @@ class InitInfobase implements Serializable { return } - if (config.initInfobaseOptions.runMigration) { - Logger.println("Запуск миграции ИБ") - - // Запуск миграции - steps.catchError { - steps.cmd('oscript_modules/bin/vrunner run --command "ЗапуститьОбновлениеИнформационнойБазы;ЗавершитьРаботуСистемы;" --execute \\$runnerRoot/epf/ЗакрытьПредприятие.epf --ibconnection "/F./build/ib"') - } - } else { - Logger.println("Шаг миграции ИБ выключен") - } - // TODO: удалить после выхода VAS 1.0.35 steps.httpRequest( 'https://cloud.svc.pulsar.ru/index.php/s/WKwmqpFXSjfYjAH/download', 'oscript_modules/vanessa-automation-single/vanessa-automation-single.epf' ) - steps.catchError { - config.initInfobaseOptions.additionalMigrationSteps.each { - Logger.println("Первичная инициализация командой ${it}") - steps.cmd("oscript_modules/bin/vrunner ${it} --ibconnection \"/F./build/ib\"") + List logosConfig = ["LOGOS_CONFIG=$config.logosConfig"] + steps.withEnv(logosConfig) { + + if (config.initInfobaseOptions.runMigration) { + Logger.println("Запуск миграции ИБ") + + // Запуск миграции + steps.catchError { + steps.cmd('oscript_modules/bin/vrunner run --command "ЗапуститьОбновлениеИнформационнойБазы;ЗавершитьРаботуСистемы;" --execute \\$runnerRoot/epf/ЗакрытьПредприятие.epf --ibconnection "/F./build/ib"') + } + } else { + Logger.println("Шаг миграции ИБ выключен") + } + + steps.catchError { + config.initInfobaseOptions.additionalMigrationSteps.each { + Logger.println("Первичная инициализация командой ${it}") + steps.cmd("oscript_modules/bin/vrunner ${it} --ibconnection \"/F./build/ib\"") + } } } 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 b547510..90cdd26 100644 --- a/test/unit/groovy/ru/pulsar/jenkins/library/configuration/ConfigurationReaderTest.java +++ b/test/unit/groovy/ru/pulsar/jenkins/library/configuration/ConfigurationReaderTest.java @@ -48,6 +48,8 @@ class ConfigurationReaderTest { assertThat(jobConfiguration.getInitInfobaseOptions().getAdditionalMigrationSteps()).contains("vanessa --settings ./tools/vrunner.first.json"); assertThat(jobConfiguration.getBddOptions().getVrunnerSteps()).contains("vanessa --settings ./tools/vrunner.json"); + + assertThat(jobConfiguration.getLogosConfig()).isEqualTo("logger.rootLogger=DEBUG"); } } \ No newline at end of file diff --git a/test/unit/resources/jobConfiguration.json b/test/unit/resources/jobConfiguration.json index 173d261..f73b8bb 100644 --- a/test/unit/resources/jobConfiguration.json +++ b/test/unit/resources/jobConfiguration.json @@ -17,5 +17,6 @@ }, "resultsTransform": { "removeSupport": true - } + }, + "logosConfig": "logger.rootLogger=DEBUG" } \ No newline at end of file From e0bc1e94932f82f036878747128838735abaa58c Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Wed, 9 Jun 2021 22:14:24 +0300 Subject: [PATCH 38/44] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B4=D0=B0?= =?UTF-8?q?=D1=87=D0=B0=20vrunner.json=20=D0=B2=20syntax-check?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/globalConfiguration.json | 5 ++-- resources/schema.json | 6 ++++- .../configuration/SyntaxCheckOptions.groovy | 20 ++++++++++---- vars/syntaxCheck.groovy | 26 ++++++++++++++----- 4 files changed, 42 insertions(+), 15 deletions(-) diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index b25868f..d0e62b6 100644 --- a/resources/globalConfiguration.json +++ b/resources/globalConfiguration.json @@ -30,7 +30,7 @@ }, "syntaxCheck": { "groupErrorsByMetadata": true, - "pathToJUnitReport": "build/out/jUnit/syntax.xml", + "pathToJUnitReport": "./build/out/jUnit/syntax.xml", "checkModes": [ "-ThinClient", "-WebClient", @@ -43,7 +43,8 @@ "-CheckUseModality", "-CheckUseSynchronousCalls", "-DistributiveModules" - ] + ], + "vrunnerSettings": "./tools/vrunner.json" }, "resultsTransform": { "removeSupport": false, diff --git a/resources/schema.json b/resources/schema.json index e964184..669178d 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -118,7 +118,7 @@ "properties" : { "pathToJUnitReport" : { "type" : "string", - "description" : "Путь к файлу отчета jUnit" + "description" : "Путь к файлу отчета jUnit\n По умолчанию содержит значение \"./build/out/junitsyntax.xml\"\n " }, "groupErrorsByMetadata" : { "type" : "boolean", @@ -130,6 +130,10 @@ "items" : { "type" : "string" } + }, + "vrunnerSettings" : { + "type" : "string", + "description" : "Путь к конфигурационному файлу vanessa-runner.\n По умолчанию содержит значение \"./tools/vrunner.json\".\n " } } }, diff --git a/src/ru/pulsar/jenkins/library/configuration/SyntaxCheckOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/SyntaxCheckOptions.groovy index dc765f4..6edbf9b 100644 --- a/src/ru/pulsar/jenkins/library/configuration/SyntaxCheckOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/SyntaxCheckOptions.groovy @@ -7,14 +7,23 @@ import com.fasterxml.jackson.annotation.JsonPropertyDescription @JsonIgnoreProperties(ignoreUnknown = true) class SyntaxCheckOptions implements Serializable { - @JsonPropertyDescription("Путь к файлу отчета jUnit") - String pathToJUnitReport + @JsonPropertyDescription("""Путь к файлу отчета jUnit + По умолчанию содержит значение "./build/out/jUnit/syntax.xml" + """) + String pathToJUnitReport = "./build/out/jUnit/syntax.xml" - @JsonPropertyDescription("Группировать выявленные ошибки по объектам метаданных") - boolean groupErrorsByMetadata; + @JsonPropertyDescription("""Группировать выявленные ошибки по объектам метаданных. + По умолчанию включено. + """) + boolean groupErrorsByMetadata = true @JsonPropertyDescription("Режимы проверки конфигурации") - String[] checkModes; + String[] checkModes + + @JsonPropertyDescription("""Путь к конфигурационному файлу vanessa-runner. + По умолчанию содержит значение "./tools/vrunner.json". + """) + String vrunnerSettings = "./tools/vrunner.json" @Override @NonCPS @@ -23,6 +32,7 @@ class SyntaxCheckOptions implements Serializable { "pathToJUnitReport='" + pathToJUnitReport + '\'' + ", groupErrorsByMetadata=" + groupErrorsByMetadata + ", checkModes=" + checkModes + + ", vrunnerSettings=" + vrunnerSettings + '}'; } } diff --git a/vars/syntaxCheck.groovy b/vars/syntaxCheck.groovy index 3d36d25..048cb6f 100644 --- a/vars/syntaxCheck.groovy +++ b/vars/syntaxCheck.groovy @@ -1,5 +1,7 @@ +import hudson.FilePath import ru.pulsar.jenkins.library.configuration.JobConfiguration import ru.pulsar.jenkins.library.ioc.ContextRegistry +import ru.pulsar.jenkins.library.utils.FileUtils def call(JobConfiguration config) { @@ -20,27 +22,37 @@ def call(JobConfiguration config) { unzipInfobase() - def outPath = new File(options.pathToJUnitReport).getParent() + FilePath pathToJUnitReport = FileUtils.getFilePath("$env.WORKSPACE/$options.pathToJUnitReport") + + String outPath = pathToJUnitReport.getParent() createDir(outPath) - String command = "oscript_modules/bin/vrunner syntax-check --ibconnection \"/F./build/ib\"" + String command = 'oscript_modules/bin/vrunner 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 += ' --groupbymetadata' } - command += " --junitpath " + options.pathToJUnitReport; + command += " --junitpath $pathToJUnitReport"; - command += " --mode " + options.checkModes.join(" ") + FilePath vrunnerSettings = FileUtils.getFilePath("$env.WORKSPACE/$options.vrunnerSettings") + if (vrunnerSettings.exists()) { + command += " --settings $vrunnerSettings"; + } + + if (options.checkModes.length > 0) { + def checkModes = options.checkModes.join(" ") + command += " --mode $checkModes" + } // Запуск синтакс-проверки cmd(command, true) - junit allowEmptyResults: true, testResults: options.pathToJUnitReport + junit allowEmptyResults: true, testResults: FileUtils.getLocalPath(pathToJUnitReport) - archiveArtifacts options.pathToJUnitReport + archiveArtifacts FileUtils.getLocalPath(pathToJUnitReport) } From 6138fba5004fdc28dd539e8f923bf58b2314e455 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Fri, 11 Jun 2021 14:55:57 +0300 Subject: [PATCH 39/44] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=B0?= =?UTF-8?q?=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/globalConfiguration.json | 2 +- resources/schema.json | 6 +++--- .../library/configuration/ConfigurationReader.groovy | 4 ++-- .../library/configuration/InitInfobaseOptions.groovy | 4 ++-- src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index d0e62b6..e6ffa64 100644 --- a/resources/globalConfiguration.json +++ b/resources/globalConfiguration.json @@ -16,7 +16,7 @@ }, "initInfobase": { "runMigration": true, - "additionalMigrationSteps": [] + "additionalInitializationSteps": [] }, "bdd": { "vrunnerSteps": [ diff --git a/resources/schema.json b/resources/schema.json index 669178d..03b81de 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -69,7 +69,7 @@ "type" : "boolean", "description" : "Запустить миграцию ИБ" }, - "additionalMigrationSteps" : { + "additionalInitializationSteps" : { "type" : "array", "description" : "Дополнительные шаги, запускаемые через vrunner.\n В каждой строке передается отдельная команда \n vrunner и ее аргументы (например, \"vanessa --settings ./tools/vrunner.first.json\")\n ", "items" : { @@ -118,11 +118,11 @@ "properties" : { "pathToJUnitReport" : { "type" : "string", - "description" : "Путь к файлу отчета jUnit\n По умолчанию содержит значение \"./build/out/junitsyntax.xml\"\n " + "description" : "Путь к файлу отчета jUnit\n По умолчанию содержит значение \"./build/out/jUnit/syntax.xml\"\n " }, "groupErrorsByMetadata" : { "type" : "boolean", - "description" : "Группировать выявленные ошибки по объектам метаданных" + "description" : "Группировать выявленные ошибки по объектам метаданных.\n По умолчанию включено.\n " }, "checkModes" : { "type" : "array", diff --git a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy index 8388096..ea04ae4 100644 --- a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy @@ -80,10 +80,10 @@ class ConfigurationReader implements Serializable { @NonCPS private static void mergeInitInfobaseOptions(InitInfobaseOptions baseObject, @CheckForNull InitInfobaseOptions objectToMerge) { - if (objectToMerge == null || objectToMerge.additionalMigrationSteps == null) { + if (objectToMerge == null || objectToMerge.additionalInitializationSteps == null) { return } - baseObject.additionalMigrationSteps = objectToMerge.additionalMigrationSteps.clone() + baseObject.additionalInitializationSteps = objectToMerge.additionalInitializationSteps.clone() } @NonCPS diff --git a/src/ru/pulsar/jenkins/library/configuration/InitInfobaseOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/InitInfobaseOptions.groovy index 0e717a8..6350339 100644 --- a/src/ru/pulsar/jenkins/library/configuration/InitInfobaseOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/InitInfobaseOptions.groovy @@ -14,14 +14,14 @@ class InitInfobaseOptions implements Serializable { В каждой строке передается отдельная команда vrunner и ее аргументы (например, "vanessa --settings ./tools/vrunner.first.json") """) - String[] additionalMigrationSteps + String[] additionalInitializationSteps @Override @NonCPS String toString() { return "InitInfobaseOptions{" + "runMigration=" + runMigration + - ", additionalMigrationSteps=" + additionalMigrationSteps + + ", additionalInitializationSteps=" + additionalInitializationSteps + '}'; } } diff --git a/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy index 4cbb215..dce9133 100644 --- a/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy +++ b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy @@ -46,7 +46,7 @@ class InitInfobase implements Serializable { } steps.catchError { - config.initInfobaseOptions.additionalMigrationSteps.each { + config.initInfobaseOptions.additionalInitializationSteps.each { Logger.println("Первичная инициализация командой ${it}") steps.cmd("oscript_modules/bin/vrunner ${it} --ibconnection \"/F./build/ib\"") } From ee1d1be399db992020f781c44ff329a724d8aba6 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Fri, 11 Jun 2021 14:57:08 +0300 Subject: [PATCH 40/44] =?UTF-8?q?removeSupport=20=D0=BF=D0=BE=20=D1=83?= =?UTF-8?q?=D0=BC=D0=BE=D0=BB=D1=87=D0=B0=D0=BD=D0=B8=D1=8E=20=D0=B2=D0=BA?= =?UTF-8?q?=D0=BB=D1=8E=D1=87=D0=B5=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/globalConfiguration.json | 2 +- resources/schema.json | 2 +- .../library/configuration/ResultsTransformOptions.groovy | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index e6ffa64..d4e6cde 100644 --- a/resources/globalConfiguration.json +++ b/resources/globalConfiguration.json @@ -47,7 +47,7 @@ "vrunnerSettings": "./tools/vrunner.json" }, "resultsTransform": { - "removeSupport": false, + "removeSupport": true, "supportLevel": 0 }, "git": { diff --git a/resources/schema.json b/resources/schema.json index 03b81de..32fe1bc 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -144,7 +144,7 @@ "properties" : { "removeSupport" : { "type" : "boolean", - "description" : "Фильтровать замечания по уровню поддержки модуля" + "description" : "Фильтровать замечания по уровню поддержки модуля. По умолчанию включено." }, "supportLevel" : { "type" : "integer", diff --git a/src/ru/pulsar/jenkins/library/configuration/ResultsTransformOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/ResultsTransformOptions.groovy index c159fd2..08168fc 100644 --- a/src/ru/pulsar/jenkins/library/configuration/ResultsTransformOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/ResultsTransformOptions.groovy @@ -7,8 +7,8 @@ import com.fasterxml.jackson.annotation.JsonPropertyDescription @JsonIgnoreProperties(ignoreUnknown = true) class ResultsTransformOptions implements Serializable { - @JsonPropertyDescription("Фильтровать замечания по уровню поддержки модуля") - boolean removeSupport + @JsonPropertyDescription("Фильтровать замечания по уровню поддержки модуля. По умолчанию включено.") + boolean removeSupport = true @JsonPropertyDescription("""Настройка фильтрации замечаний по уровню поддержки. 0 - удалить файлы на замке; From ecc8f62e7ce4c0720da43659dda0a4b3a71bf9cc Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Fri, 11 Jun 2021 14:57:34 +0300 Subject: [PATCH 41/44] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 3c08c25..796647b 100644 --- a/README.md +++ b/README.md @@ -23,18 +23,23 @@ 1. Для запуска шага анализа SonarQube требуется агент с меткой `sonar`. 1. Для запуска шага валидации EDT требуется агент с меткой `edt` (для собственно валидации) и агент с меткой `oscript` (для трансформации результатов с помощью библиотеки [stebi](https://github.com/Stepa86/stebi)). 1. Для запуска шагов, работающих с 1С (подготовка, синтаксический контроль и т.д.) требуется агент с меткой, совпадающей со значением в поле `v8version` файла конфигурации. -1. В качестве ИБ используется файловая база, создаваемая в `./build/ib`, без данных авторизации. Переопределение "в следующих сериях". +1. В качестве ИБ используется файловая база, создаваемая в `./build/ib` на основании конфигурации из хранилища без пользователей. При необходимости вы можете создать пользователей на фазе инициализации ИБ. 1. Stage "Дымовые тесты" пока пустой. 1. Запуск `vrunner` на текущий момент происходит из локального каталога `oscript_modules`. Предполагается наличие в корне репозитория файла `packagedef`, в котором бы была указана зависимость от `vanessa-runner` ## Возможности 1. Все шаги можно запустить на базе docker-образов из форка репозитория onec-docker. См. [памятку по слоям и последовательности сборки](https://github.com/firstBitSemenovskaya/onec-docker/blob/feature/first-bit/Layers.md) -1. Трансформация кода из формата конфигуратора в формат EDT (только если включен шаг `edtValidate`). 1. Подготовка информационной базы по версии из хранилища конфигурации. +1. Запуск ИБ в режиме выполнения обработчиков обновления БСП. +1. Дополнительные шаги инициализации данных в ИБ. +1. Трансформация кода из формата конфигуратора в формат EDT (только если включен шаг `edtValidate`). +1. Запуск BDD сценариев с сохранением результатов в формате Allure. 1. Запуск синтаксического контроля средствами конфигуратора и сохранение результатов в виде отчета jUnit. 1. Запуск валидации проекта средствами EDT и конвертация отчета в формате generic issues. -1. Запуск статического анализа для SonarQube +1. Запуск статического анализа для SonarQube. +1. Публикация результатов junit и Allure в интерфейс Jenkins. +1. Конфигурирование логгера запускаемых oscript-приложений. ## Подключение @@ -60,7 +65,7 @@ pipeline1C() ## Внешний вид пайплайна в интерфейсе Blue Ocean -![image](https://user-images.githubusercontent.com/1132840/80956084-27b14400-8e09-11ea-9e92-683818a14503.png) +![image](https://user-images.githubusercontent.com/1132840/121659170-b67f9e00-caaa-11eb-91be-107a689e893d.png) ## Конфигурирование @@ -89,3 +94,26 @@ pipeline1C() } } ``` + +## Параметры по умолчанию + +В библиотеке применяется принцип "соглашения по конфигурации" (convention over configuration): конфигурационный файл +содержит ряд настроек "по умолчанию". При соблюдении определенных правил структуры репозитория можно сократить +количество переопределений конфигурационного файла до минимума. + +* Общее: + * Исходники конфигурации ожидаются в каталоге `src/cf`. + * TODO: Имена "секретов" (jenkins credentials) по умолчанию высчитываются как `GROUP_REPO_KEY`, где `GROUP` и `REPO` - это группа проектов и имя проектов (например, `firstBitSemenovskaya` и `jenkins-lib`), а `KEY` - ключ секрета: + * `STORAGE_PATH` - путь к хранилищу конфигурации; + * `STORAGE_USER` - параметры авторизации в хранилище вида "username with password". + * Все "шаги" по умолчанию выключены. +* Инициализация: + * Если включен шаг `initSteps`, то будет выполняться запуск ИБ с целью запуска обработчиков обновления из БСП. (`initInfobase` -> `runMigration`) + * TODO: Если в настройках шага инициализации не заполнен массив дополнительных шагов миграции (`initInfobase` -> `additionalInitializationSteps`), но в каталоге `tools` присутствуют файлы с именами, удовлетворяющими шаблону `vrunner.init*.json`, то автоматически выполняется запуск `vrunner vanessa` с передачей найденных файлов в качестве значения настроек (параметр `--settings`) в порядке лексиграфической сортировки имен файлов. +* BDD: + * TODO: Если в репозитории существует файл `tools/vrunner.json`, а настройка `bdd` -> `vrunnerSteps` не заполнена, то автоматически выполняется запуск `vrunner vanessa --settings tools/vrunner.json`. +* Синтаксический контроль: + * Если в репозитории существует файл `tools/vrunner.json`, то синтаксический контроль конфигурации с помощью конфигуратора будет выполняться с передачей файла в параметры запуска `vrunner syntax-check --settings tools/vrunner.json`. + * TODO: Значение параметра `--mode` из конфигурационного файла vrunner имеют приоритет над `syntaxCheck` -> `checkModes`. Значение из `jobConfiguration.json` передается только в том случае, если параметр отсутствует в конфигурационном файле `vrunner`. +* Трансформация результатов валидации EDT: + * По умолчанию из результатов анализа исключаются замечания, сработавшие на модулях с включенным запретом редактирования (желтый куб с замком) \ No newline at end of file From 26e5eada5f13e784834b4adfdfe378cb79079ded Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Fri, 11 Jun 2021 15:03:59 +0300 Subject: [PATCH 42/44] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=8D=D0=BA=D1=81=D0=BF=D0=B5=D1=80=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=BE=D0=B2=20=D0=B2=20git=20scm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/globalConfiguration.json | 8 +- resources/schema.json | 23 ----- .../jenkins/library/IStepExecutor.groovy | 6 -- .../jenkins/library/StepExecutor.groovy | 13 +-- .../configuration/ConfigurationReader.groovy | 3 +- .../configuration/GitSCMOptions.groovy | 28 ------ .../configuration/JobConfiguration.groovy | 5 - .../library/configuration/Secrets.groovy | 4 - .../jenkins/library/steps/Checkout.groovy | 97 ------------------- .../library/steps/GitSCMExtension.groovy | 16 --- .../ConfigurationReaderTest.java | 4 +- test/unit/resources/jobConfiguration.json | 4 +- vars/customCheckout.groovy | 10 -- 13 files changed, 7 insertions(+), 214 deletions(-) delete mode 100644 src/ru/pulsar/jenkins/library/configuration/GitSCMOptions.groovy delete mode 100644 src/ru/pulsar/jenkins/library/steps/Checkout.groovy delete mode 100644 src/ru/pulsar/jenkins/library/steps/GitSCMExtension.groovy delete mode 100644 vars/customCheckout.groovy diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index d4e6cde..e2e2ca1 100644 --- a/resources/globalConfiguration.json +++ b/resources/globalConfiguration.json @@ -3,8 +3,7 @@ "srcDir": "src/cf", "secrets": { "storagePath": "UNKNOWN_ID", - "storage": "UNKNOWN_ID", - "lfs": "UNKNOWN_ID" + "storage": "UNKNOWN_ID" }, "stages": { "initSteps": false, @@ -50,10 +49,5 @@ "removeSupport": true, "supportLevel": 0 }, - "git": { - "lfsPull": false, - "lfsURI": "", - "lfsRepoURI": "" - }, "logosConfig": "" } diff --git a/resources/schema.json b/resources/schema.json index 32fe1bc..7a61217 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -22,10 +22,6 @@ "storage" : { "type" : "string", "description" : "Данные авторизации в хранилище конфигурации" - }, - "lfs" : { - "type" : "string", - "description" : "Данные авторизации для работы с LFS" } } }, @@ -152,25 +148,6 @@ } } }, - "git" : { - "type" : "object", - "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:GitSCMOptions", - "description" : "Настройки git-репозитория", - "properties" : { - "lfsPull" : { - "type" : "boolean", - "description" : "Дополнительно выполнить git lfs pull" - }, - "lfsURI" : { - "type" : "string", - "description" : "Адрес для получения данных LFS" - }, - "lfsRepoURI" : { - "type" : "string", - "description" : "Адрес удаленного репозитория для авторизации на LFS" - } - } - }, "logosConfig" : { "type" : "string", "description" : "Конфигурация библиотеки logos. Применяется перед запуском каждой стадии сборки" diff --git a/src/ru/pulsar/jenkins/library/IStepExecutor.groovy b/src/ru/pulsar/jenkins/library/IStepExecutor.groovy index 5d9d8a8..54d57af 100644 --- a/src/ru/pulsar/jenkins/library/IStepExecutor.groovy +++ b/src/ru/pulsar/jenkins/library/IStepExecutor.groovy @@ -1,7 +1,5 @@ package ru.pulsar.jenkins.library -import hudson.plugins.git.GitSCM -import hudson.scm.SCM import org.jenkinsci.plugins.workflow.support.actions.EnvironmentAction interface IStepExecutor { @@ -28,10 +26,6 @@ interface IStepExecutor { EnvironmentAction env() - GitSCM scm() - - void checkout(SCM scm) - void createDir(String path) def withEnv(List strings, Closure body) diff --git a/src/ru/pulsar/jenkins/library/StepExecutor.groovy b/src/ru/pulsar/jenkins/library/StepExecutor.groovy index c297dfa..8cbe2de 100644 --- a/src/ru/pulsar/jenkins/library/StepExecutor.groovy +++ b/src/ru/pulsar/jenkins/library/StepExecutor.groovy @@ -1,7 +1,6 @@ package ru.pulsar.jenkins.library -import hudson.plugins.git.GitSCM -import hudson.scm.SCM + import org.jenkinsci.plugins.workflow.support.actions.EnvironmentAction import ru.yandex.qatools.allure.jenkins.config.ResultsConfig @@ -65,16 +64,6 @@ class StepExecutor implements IStepExecutor { return steps.env } - @Override - GitSCM scm() { - return steps.scm - } - - @Override - void checkout(SCM scm) { - steps.checkout(scm) - } - @Override void createDir(String path) { steps.createDir(path) diff --git a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy index ea04ae4..55b7ad2 100644 --- a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy @@ -47,8 +47,7 @@ class ConfigurationReader implements Serializable { "bddOptions", "sonarQubeOptions", "syntaxCheckOptions", - "resultsTransformOptions", - "gitSCMOptions" + "resultsTransformOptions" ).toSet() mergeObjects(baseConfiguration, configurationToMerge, nonMergeableSettings) diff --git a/src/ru/pulsar/jenkins/library/configuration/GitSCMOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/GitSCMOptions.groovy deleted file mode 100644 index 9b98d15..0000000 --- a/src/ru/pulsar/jenkins/library/configuration/GitSCMOptions.groovy +++ /dev/null @@ -1,28 +0,0 @@ -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 GitSCMOptions implements Serializable { - - @JsonPropertyDescription("Дополнительно выполнить git lfs pull") - boolean lfsPull - - @JsonPropertyDescription("Адрес для получения данных LFS") - String lfsURI = "" - - @JsonPropertyDescription("Адрес удаленного репозитория для авторизации на LFS") - String lfsRepoURI = "" - - @Override - @NonCPS - String toString() { - return "GitSCMOptions{" + - "lfsPull=" + lfsPull + - "lfsURI=" + lfsURI + - "lfsRepoURI=" + lfsRepoURI + - '}'; - } -} diff --git a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy index fbb3e93..c404c9d 100644 --- a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy @@ -40,10 +40,6 @@ class JobConfiguration implements Serializable { @JsonPropertyDescription("Настройки трансформации результатов анализа") ResultsTransformOptions resultsTransformOptions; - @JsonProperty("git") - @JsonPropertyDescription("Настройки git-репозитория") - GitSCMOptions gitSCMOptions; - @JsonProperty("logosConfig") @JsonPropertyDescription("Конфигурация библиотеки logos. Применяется перед запуском каждой стадии сборки") String logosConfig; @@ -61,7 +57,6 @@ class JobConfiguration implements Serializable { ", sonarQubeOptions=" + sonarQubeOptions + ", syntaxCheckOptions=" + syntaxCheckOptions + ", resultsTransformOptions=" + resultsTransformOptions + - ", gitSCMOptions=" + gitSCMOptions + ", logosConfig=" + logosConfig + '}'; } diff --git a/src/ru/pulsar/jenkins/library/configuration/Secrets.groovy b/src/ru/pulsar/jenkins/library/configuration/Secrets.groovy index b27d418..0ee17f0 100644 --- a/src/ru/pulsar/jenkins/library/configuration/Secrets.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/Secrets.groovy @@ -13,16 +13,12 @@ class Secrets implements Serializable { @JsonPropertyDescription("Данные авторизации в хранилище конфигурации") String storage - @JsonPropertyDescription("Данные авторизации для работы с LFS") - String lfs - @Override @NonCPS String toString() { return "Secrets{" + "storagePath='" + storagePath + '\'' + ", storage='" + storage + '\'' + - ", lfs='" + lfs + '\'' + '}'; } } diff --git a/src/ru/pulsar/jenkins/library/steps/Checkout.groovy b/src/ru/pulsar/jenkins/library/steps/Checkout.groovy deleted file mode 100644 index 8414b4f..0000000 --- a/src/ru/pulsar/jenkins/library/steps/Checkout.groovy +++ /dev/null @@ -1,97 +0,0 @@ -package ru.pulsar.jenkins.library.steps - -import hudson.plugins.git.GitSCM -import hudson.plugins.git.UserRemoteConfig -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 Checkout implements Serializable { - - private final JobConfiguration config; - - Checkout(JobConfiguration config) { - this.config = config - } - - def run() { - IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() - - Logger.printLocation() - - def gitSCMOptions = config.gitSCMOptions - - if (!gitSCMOptions.lfsPull) { - return - } - - def scm = steps.scm() - - scm = addLFSRemoteConfig(scm) - - steps.checkout(scm) - - } - - private GitSCM addLFSRemoteConfig(GitSCM scm) { - def gitSCMOptions = config.gitSCMOptions - - if (gitSCMOptions.lfsURI.isEmpty()) { - return scm - } - - IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() - - // TODO: get git.exe path from scm settings - steps.cmd("git config -f .lfsconfig lfs.url $gitSCMOptions.lfsURI") - - List userRemoteConfigs = new ArrayList<>(scm.getUserRemoteConfigs()) - - if (gitSCMOptions.lfsRepoURI.isEmpty()) { - return scm - } - - def userRemoteConfig = userRemoteConfigs.find { it.url == gitSCMOptions.lfsRepoURI } - boolean needToUpdateUserRemoteConfigs - if (userRemoteConfig == null) { - def credentialsId = config.secrets.lfs.isEmpty() ? null : config.secrets.lfs - userRemoteConfig = new UserRemoteConfig( - config.gitSCMOptions.lfsRepoURI, - null, - null, - credentialsId - ) - - needToUpdateUserRemoteConfigs = true - } else { - def credentialsId = config.secrets.lfs.isEmpty() ? userRemoteConfig.credentialsId : config.secrets.lfs - - if (userRemoteConfig.credentialsId != credentialsId) { - userRemoteConfig = new UserRemoteConfig( - userRemoteConfig.url, - null, - userRemoteConfig.refspec, - credentialsId - ) - - needToUpdateUserRemoteConfigs = true - } - } - - if (needToUpdateUserRemoteConfigs) { - userRemoteConfigs.add(0, userRemoteConfig) - scm = new GitSCM( - userRemoteConfigs, - scm.branches, - scm.doGenerateSubmoduleConfigurations, - scm.submoduleCfg, - scm.browser, - scm.gitTool, - scm.extensions - ) - } - - return scm - } -} diff --git a/src/ru/pulsar/jenkins/library/steps/GitSCMExtension.groovy b/src/ru/pulsar/jenkins/library/steps/GitSCMExtension.groovy deleted file mode 100644 index af387cc..0000000 --- a/src/ru/pulsar/jenkins/library/steps/GitSCMExtension.groovy +++ /dev/null @@ -1,16 +0,0 @@ -package ru.pulsar.jenkins.library.steps - -import ru.pulsar.jenkins.library.configuration.JobConfiguration - -class GitSCMExtension implements Serializable { - - private final JobConfiguration config; - - GitSCMExtension(JobConfiguration config) { - this.config = config - } - - def run() { - - } -} 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 90cdd26..a1fe3b2 100644 --- a/test/unit/groovy/ru/pulsar/jenkins/library/configuration/ConfigurationReaderTest.java +++ b/test/unit/groovy/ru/pulsar/jenkins/library/configuration/ConfigurationReaderTest.java @@ -41,11 +41,11 @@ class ConfigurationReaderTest { assertThat(jobConfiguration.getSyntaxCheckOptions().getCheckModes()).hasSize(1); - assertThat(jobConfiguration.getResultsTransformOptions().isRemoveSupport()).isTrue(); + assertThat(jobConfiguration.getResultsTransformOptions().isRemoveSupport()).isFalse(); assertThat(jobConfiguration.getResultsTransformOptions().getSupportLevel()).isZero(); assertThat(jobConfiguration.getInitInfobaseOptions().getRunMigration()).isFalse(); - assertThat(jobConfiguration.getInitInfobaseOptions().getAdditionalMigrationSteps()).contains("vanessa --settings ./tools/vrunner.first.json"); + 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 f73b8bb..947e8ba 100644 --- a/test/unit/resources/jobConfiguration.json +++ b/test/unit/resources/jobConfiguration.json @@ -8,7 +8,7 @@ }, "initInfobase": { "runMigration": false, - "additionalMigrationSteps": [ + "additionalInitializationSteps": [ "vanessa --settings ./tools/vrunner.first.json" ] }, @@ -16,7 +16,7 @@ "checkModes": ["-ThinClient"] }, "resultsTransform": { - "removeSupport": true + "removeSupport": false }, "logosConfig": "logger.rootLogger=DEBUG" } \ No newline at end of file diff --git a/vars/customCheckout.groovy b/vars/customCheckout.groovy deleted file mode 100644 index 2056db9..0000000 --- a/vars/customCheckout.groovy +++ /dev/null @@ -1,10 +0,0 @@ -import ru.pulsar.jenkins.library.configuration.JobConfiguration -import ru.pulsar.jenkins.library.ioc.ContextRegistry -import ru.pulsar.jenkins.library.steps.Checkout - -void call(JobConfiguration config) { - ContextRegistry.registerDefaultContext(this) - - def checkout = new Checkout(config) - checkout.run() -} \ No newline at end of file From 5c458592404a7d91573b60a373ce6bdb7950d6bf Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Fri, 11 Jun 2021 15:53:11 +0300 Subject: [PATCH 43/44] =?UTF-8?q?Fix=20#12.=20=D0=9E=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=B4=D0=B5=D1=84=D0=BE=D0=BB?= =?UTF-8?q?=D1=82=D0=BD=D0=B0=D1=8F=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B9=D0=BA=D0=B0=20=D0=B8=D0=B7=20=D0=B3=D0=BB=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BA=D0=BE=D0=BD?= =?UTF-8?q?=D1=84=D0=B8=D0=B3=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 796647b..7701d68 100644 --- a/README.md +++ b/README.md @@ -111,7 +111,7 @@ pipeline1C() * Если включен шаг `initSteps`, то будет выполняться запуск ИБ с целью запуска обработчиков обновления из БСП. (`initInfobase` -> `runMigration`) * TODO: Если в настройках шага инициализации не заполнен массив дополнительных шагов миграции (`initInfobase` -> `additionalInitializationSteps`), но в каталоге `tools` присутствуют файлы с именами, удовлетворяющими шаблону `vrunner.init*.json`, то автоматически выполняется запуск `vrunner vanessa` с передачей найденных файлов в качестве значения настроек (параметр `--settings`) в порядке лексиграфической сортировки имен файлов. * BDD: - * TODO: Если в репозитории существует файл `tools/vrunner.json`, а настройка `bdd` -> `vrunnerSteps` не заполнена, то автоматически выполняется запуск `vrunner vanessa --settings tools/vrunner.json`. + * Если в конфигурационном файле проекта не заполнена настройка `bdd` -> `vrunnerSteps`, то автоматически выполняется запуск `vrunner vanessa --settings tools/vrunner.json`. * Синтаксический контроль: * Если в репозитории существует файл `tools/vrunner.json`, то синтаксический контроль конфигурации с помощью конфигуратора будет выполняться с передачей файла в параметры запуска `vrunner syntax-check --settings tools/vrunner.json`. * TODO: Значение параметра `--mode` из конфигурационного файла vrunner имеют приоритет над `syntaxCheck` -> `checkModes`. Значение из `jobConfiguration.json` передается только в том случае, если параметр отсутствует в конфигурационном файле `vrunner`. From 0a91cc35c296c376c615a5716b4141ee6ae99c0a Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Fri, 11 Jun 2021 17:17:02 +0300 Subject: [PATCH 44/44] =?UTF-8?q?Fix=20#11.=20=D0=9F=D0=BE=D0=B8=D1=81?= =?UTF-8?q?=D0=BA=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2=20vrunner.init.js?= =?UTF-8?q?on=20=D0=B4=D0=BB=D1=8F=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=B5=D1=80=D0=B2=D0=B8=D1=87=D0=BD=D0=BE=D0=B9?= =?UTF-8?q?=20=D0=B8=D0=BD=D0=B8=D1=86=D0=B8=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 ++- build.gradle.kts | 1 + .../pulsar/jenkins/library/IStepExecutor.groovy | 5 +++++ .../pulsar/jenkins/library/StepExecutor.groovy | 7 ++++++- .../jenkins/library/steps/InitInfobase.groovy | 16 +++++++++++++--- 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 7701d68..d67fd24 100644 --- a/README.md +++ b/README.md @@ -107,9 +107,10 @@ pipeline1C() * `STORAGE_PATH` - путь к хранилищу конфигурации; * `STORAGE_USER` - параметры авторизации в хранилище вида "username with password". * Все "шаги" по умолчанию выключены. + * Результаты в формате `allure` ожидаются в каталоге `build/out/allure` или его подкаталогах. * Инициализация: * Если включен шаг `initSteps`, то будет выполняться запуск ИБ с целью запуска обработчиков обновления из БСП. (`initInfobase` -> `runMigration`) - * TODO: Если в настройках шага инициализации не заполнен массив дополнительных шагов миграции (`initInfobase` -> `additionalInitializationSteps`), но в каталоге `tools` присутствуют файлы с именами, удовлетворяющими шаблону `vrunner.init*.json`, то автоматически выполняется запуск `vrunner vanessa` с передачей найденных файлов в качестве значения настроек (параметр `--settings`) в порядке лексиграфической сортировки имен файлов. + * Если в настройках шага инициализации не заполнен массив дополнительных шагов миграции (`initInfobase` -> `additionalInitializationSteps`), но в каталоге `tools` присутствуют файлы с именами, удовлетворяющими шаблону `vrunner.init*.json`, то автоматически выполняется запуск `vrunner vanessa` с передачей найденных файлов в качестве значения настроек (параметр `--settings`) в порядке лексиграфической сортировки имен файлов. * BDD: * Если в конфигурационном файле проекта не заполнена настройка `bdd` -> `vrunnerSteps`, то автоматически выполняется запуск `vrunner vanessa --settings tools/vrunner.json`. * Синтаксический контроль: diff --git a/build.gradle.kts b/build.gradle.kts index 643a9db..903165c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -78,6 +78,7 @@ sharedLibrary { // TODO: retrieve downloaded plugin resource pluginDependencies { dependency("org.jenkins-ci.plugins", "pipeline-build-step", "2.12") + dependency("org.jenkins-ci.plugins", "pipeline-utility-steps", "2.8.0") dependency("org.jenkins-ci.plugins", "git", "4.4.4") dependency("org.6wind.jenkins", "lockable-resources", "2.7") dependency("ru.yandex.qatools.allure", "allure-jenkins-plugin", "2.28.1") diff --git a/src/ru/pulsar/jenkins/library/IStepExecutor.groovy b/src/ru/pulsar/jenkins/library/IStepExecutor.groovy index 54d57af..8c11196 100644 --- a/src/ru/pulsar/jenkins/library/IStepExecutor.groovy +++ b/src/ru/pulsar/jenkins/library/IStepExecutor.groovy @@ -1,5 +1,6 @@ package ru.pulsar.jenkins.library +import org.jenkinsci.plugins.pipeline.utility.steps.fs.FileWrapper import org.jenkinsci.plugins.workflow.support.actions.EnvironmentAction interface IStepExecutor { @@ -12,6 +13,10 @@ interface IStepExecutor { String libraryResource(String path) + FileWrapper[] findFiles(String glob) + + FileWrapper[] findFiles(String glob, String excludes) + String readFile(String file, String encoding) void echo(message) diff --git a/src/ru/pulsar/jenkins/library/StepExecutor.groovy b/src/ru/pulsar/jenkins/library/StepExecutor.groovy index 8cbe2de..573673b 100644 --- a/src/ru/pulsar/jenkins/library/StepExecutor.groovy +++ b/src/ru/pulsar/jenkins/library/StepExecutor.groovy @@ -1,6 +1,6 @@ package ru.pulsar.jenkins.library - +import org.jenkinsci.plugins.pipeline.utility.steps.fs.FileWrapper import org.jenkinsci.plugins.workflow.support.actions.EnvironmentAction import ru.yandex.qatools.allure.jenkins.config.ResultsConfig @@ -37,6 +37,11 @@ class StepExecutor implements IStepExecutor { steps.readFile encoding: encoding, file: file } + @Override + FileWrapper[] findFiles(String glob, String excludes = '') { + steps.findFiles glob: glob, excludes: excludes + } + @Override void echo(Object message) { steps.echo message diff --git a/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy index dce9133..eaef74b 100644 --- a/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy +++ b/src/ru/pulsar/jenkins/library/steps/InitInfobase.groovy @@ -1,5 +1,6 @@ package ru.pulsar.jenkins.library.steps +import org.jenkinsci.plugins.pipeline.utility.steps.fs.FileWrapper import ru.pulsar.jenkins.library.IStepExecutor import ru.pulsar.jenkins.library.configuration.JobConfiguration import ru.pulsar.jenkins.library.ioc.ContextRegistry @@ -46,9 +47,18 @@ class InitInfobase implements Serializable { } steps.catchError { - config.initInfobaseOptions.additionalInitializationSteps.each { - Logger.println("Первичная инициализация командой ${it}") - steps.cmd("oscript_modules/bin/vrunner ${it} --ibconnection \"/F./build/ib\"") + if (config.initInfobaseOptions.additionalInitializationSteps.length == 0) { + FileWrapper[] files = steps.findFiles("tools/vrunner.init*.json") + files = files.sort new OrderBy( { it.name }) + files.each { + Logger.println("Первичная инициализация файлом ${it.path}") + steps.cmd("oscript_modules/bin/vrunner vanessa --settings ${it.path} --ibconnection \"/F./build/ib\"") + } + } else { + config.initInfobaseOptions.additionalInitializationSteps.each { + Logger.println("Первичная инициализация командой ${it}") + steps.cmd("oscript_modules/bin/vrunner ${it} --ibconnection \"/F./build/ib\"") + } } } }