From d6e3b02085987c494df4ed61bf2c0d2db8743b04 Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Wed, 21 Oct 2020 12:27:51 +0300 Subject: [PATCH] =?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