From 9f0a9221dde718e1e76131455701fad85da251e0 Mon Sep 17 00:00:00 2001 From: Dima Date: Tue, 19 Mar 2024 14:54:33 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=80=D0=B0=D1=81=D1=88=D0=B8=D1=80?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=BD=D0=B0=20=D1=80=D0=B0=D0=B7?= =?UTF-8?q?=D0=BD=D1=8B=D1=85=20=D1=88=D0=B0=D0=B3=D0=B0=D1=85=20=D0=B8?= =?UTF-8?q?=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BC=D0=B5=D1=87=D0=B0=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 14 ++- build.gradle.kts | 1 - resources/globalConfiguration.json | 3 +- .../configuration/ConfigurationReader.groovy | 2 - .../configuration/InitInfoBaseOptions.groovy | 14 ++- .../configuration/JobConfiguration.groovy | 10 +- .../library/steps/LoadExtensions.groovy | 36 +++++- .../library/steps/PublishAllure.groovy | 2 +- .../library/steps/LoadExtensionsTest.java | 45 +++++++ vars/loadExtensions.groovy | 4 +- vars/pipeline1C.groovy | 112 ++++++++++++------ 11 files changed, 185 insertions(+), 58 deletions(-) create mode 100644 test/unit/groovy/ru/pulsar/jenkins/library/steps/LoadExtensionsTest.java diff --git a/README.md b/README.md index 27f0398..9ccab43 100644 --- a/README.md +++ b/README.md @@ -108,7 +108,7 @@ pipeline1C() * Общее: * В качестве маски версии платформы используется строка "8.3" (`v8version`). - * По-умолчанию версия модуля EDT не заполнена, т.к. в случае единственной версии для утилиты ring дополнительного указания не требуется (`edtVersion`). + * По умолчанию версия модуля EDT не заполнена, т.к. в случае единственной версии для утилиты ring дополнительного указания не требуется (`edtVersion`). * Исходники конфигурации ожидаются в каталоге `src/cf` (`srcDir`). * Формат исходников - выгрузка из Конфигуратора (`sourceFormat`). * Ветка по умолчанию (для комбинированного режима загрузки конфигурации) - "main" (`defaultBranch`). @@ -133,8 +133,7 @@ pipeline1C() * BDD: * Если в конфигурационном файле проекта не заполнена настройка `bdd` -> `vrunnerSteps`, то автоматически выполняется запуск `vrunner vanessa --settings tools/vrunner.json`. * YAXUnit: - * Необходимо указать расширение YAXUnit и дополнительные расширения с тестами (опционально) в `jobConfiguration.json` -> `initInfobase` -> `extensions`. Они будут загружены при инициализации ИБ. - * Если ваши тесты размещены в отдельных расширениях, скопируйте файл `./resources/yaxunit.json` из текущей библиотеки в свой репозиторий (`./tools/yaxunit.json`) и перечислите в нем имена ваших расширений. + * Если в репозитории существует файл `tools/yaxunit.json`, то он будет передан в качестве параметра для YAXUnit при запуске тестов. Если файла с таким именем нет, то в YAXUnit будет передан файл из текущей библиотеки `resources/yaxunit.json`. Он содержит минимально необходимые параметры и настроен на поиск сценариев в расширении с именем `YAXUnit`. * Дымовые тесты: * Если в репозитории существует файл `tools/vrunner.json`, то запуск дымовых тестов будет выполняться с передачей файла в параметры запуска `vrunner xunit --settings tools/vrunner.json` (`smoke` -> `vrunnerSettings`). * Если установка локальных зависимостей `opm` установит пакет `add`, то будет использоваться обработка `xddTestRunner.epf` из локальных зависимостей. @@ -171,7 +170,7 @@ pipeline1C() * Telegram: * Уведомления о результатах сборки по умолчанию рассылаются всегда (`notifications` -> `telegram` -> `onAlways`, `onFailure`, `onUnstable`, `onSuccess`). -## Конфигурирование загрузки расширений +## Настройка загрузки расширений Если у вас есть расширения которые необходимо загрузить в базу для проведения тестов и проверок, это можно сделать на этапе подготовки базы. * При загрузке из исходников расширения должны быть в том же формате(edt или конфигуратора) что и основная конфигурация. @@ -203,4 +202,9 @@ pipeline1C() } ] } -``` \ No newline at end of file +``` + +## Настройка шага YAXUnit + + * Добавить расширение `YAXUnit` и дополнительные расширения с тестами можно в `jobConfiguration.json` -> `initInfobase` -> `extensions`. Они будут загружены при инициализации ИБ. + * Если ваши тесты размещены в отдельных расширениях, скопируйте файл `./resources/yaxunit.json` из текущей библиотеки в свой репозиторий (`./tools/yaxunit.json`) и перечислите в нем имена ваших расширений. diff --git a/build.gradle.kts b/build.gradle.kts index e557c92..1c5dc5e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -61,7 +61,6 @@ dependencies { integrationTestImplementation("org.slf4j", "slf4j-api", slf4jVersion) integrationTestImplementation("org.slf4j", "slf4j-simple", slf4jVersion) - integrationTestImplementation("org.springframework.security", "spring-security-core", "5.1.13.RELEASE") } diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index 10c9ef9..693f554 100644 --- a/resources/globalConfiguration.json +++ b/resources/globalConfiguration.json @@ -42,8 +42,7 @@ "initMethod": "fromStorage", "runMigration": true, "additionalInitializationSteps": [], - "extensions": [], - "vrunnerSettings": "./tools/vrunner.json" + "extensions": [] }, "bdd": { "vrunnerSteps": [ diff --git a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy index a8c71ba..395da02 100644 --- a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy @@ -65,8 +65,6 @@ class ConfigurationReader implements Serializable { "bddOptions", "sonarQubeOptions", "smokeTestOptions", - "yaxunitOptions", - "extensions", "syntaxCheckOptions", "resultsTransformOptions", "notificationsOptions", diff --git a/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy index 8a0e5af..f3edd33 100644 --- a/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy @@ -28,11 +28,6 @@ class InitInfoBaseOptions implements Serializable { @JsonPropertyDescription("Массив расширений для загрузки в конфигурацию.") Extension[] extensions - @JsonPropertyDescription("""Путь к конфигурационному файлу vanessa-runner. - По умолчанию содержит значение "./tools/vrunner.json". - """) - String vrunnerSettings - @JsonIgnoreProperties(ignoreUnknown = true) static class Extension implements Serializable { @JsonPropertyDescription("Имя расширения, используемое при его загрузке в конфигурацию.") @@ -47,11 +42,18 @@ class InitInfoBaseOptions implements Serializable { InitExtensionMethod initMethod = InitExtensionMethod.SOURCE @JsonPropertyDescription(""" - Хранит в себе путь к расширению. + Путь к расширению. * В случае если выбран initMethod - указывается путь к исходникам расширения. * В случае если выбран initMethod - указывается путь к cfe-файлу """) String path = "src/cfe/extension" + + @JsonPropertyDescription(""" + Шаги, на которых необходимо использовать расширение + * Если не заполнено, то расширение будет подключено при инициализации базы и останется в базе на всех последующих шагах. + * Если заполнено, то расширение будет подключено только на соответствующих шагах. + """) + String[] stages = ["initInfoBase"] } @Override diff --git a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy index f3a1232..080bc23 100644 --- a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy @@ -105,8 +105,14 @@ class JobConfiguration implements Serializable { (initMethod == InitInfoBaseMethod.DEFAULT_BRANCH_FROM_STORAGE && branchName != defaultBranch) } - boolean needLoadExtensions() { - return initInfoBaseOptions.extensions.length != 0 + boolean needLoadExtensions(String stageName = "") { + if (stageName.isEmpty()) { + return initInfoBaseOptions.extensions.length != 0 + } else { + return initInfoBaseOptions.extensions.any { extension -> + extension.stages.contains(stageName) + } + } } String v8AgentLabel() { diff --git a/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy b/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy index 812ef2e..bee3ba8 100644 --- a/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy +++ b/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy @@ -12,9 +12,11 @@ import ru.pulsar.jenkins.library.utils.FileUtils class LoadExtensions implements Serializable { private final JobConfiguration config + private final String stageName - LoadExtensions(JobConfiguration config) { + LoadExtensions(JobConfiguration config, String stageName = "") { this.config = config + this.stageName = stageName } def run() { @@ -22,12 +24,25 @@ class LoadExtensions implements Serializable { Logger.printLocation() + + Extension[] filteredExtensions + extensions = this.config.initInfoBaseOptions.extensions + + if (this.stageName) { + filteredExtensions = extensions.findAll { extension -> + extension.stages.contains(this.stageName) + } + } + else { + filteredExtensions = extensions.findAll { extension -> extension.stages.empty || extension.stages.contains("initInfoBase") } + } + def env = steps.env() String cfeDir = "$env.WORKSPACE/$GetExtensions.EXTENSIONS_OUT_DIR" String vrunnerPath = VRunner.getVRunnerPath() - - config.initInfoBaseOptions.extensions.each { + + filteredExtensions.each { Logger.println("Установим расширение ${it.name}") loadExtension(it, vrunnerPath, steps, cfeDir) } @@ -47,7 +62,7 @@ class LoadExtensions implements Serializable { loadCommand += executeParameter loadCommand += ' --ibconnection "/F./build/ib"' - String vrunnerSettings = config.initInfoBaseOptions.vrunnerSettings + String vrunnerSettings = getVrunnerSettings(this.config, stageName) if (steps.fileExists(vrunnerSettings)) { loadCommand += " --settings $vrunnerSettings" } @@ -57,4 +72,17 @@ class LoadExtensions implements Serializable { VRunner.exec(loadCommand) } } + + private static String getVrunnerSettings(JobConfiguration jobConfiguration, String stageName) { + + String optionsName = "${stageName.toLowerCase()}Options" + + def optionsInstance = jobConfiguration."$optionsName" + + if (optionsInstance) { + return optionsInstance."vrunnerSettings" + } else { + return "" + } + } } diff --git a/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy b/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy index e7c0e97..f3fb372 100644 --- a/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy +++ b/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy @@ -33,7 +33,7 @@ class PublishAllure implements Serializable { if (config.stageFlags.bdd) { safeUnstash('bdd-allure') } - if (config.stageFlags.yaxunit) { + if (config.stageFlags.yaxunit && config.yaxunitOptions.publishToAllureReport) { safeUnstash(Yaxunit.YAXUNIT_ALLURE_STASH) } if (config.stageFlags.smoke && config.smokeTestOptions.publishToAllureReport) { diff --git a/test/unit/groovy/ru/pulsar/jenkins/library/steps/LoadExtensionsTest.java b/test/unit/groovy/ru/pulsar/jenkins/library/steps/LoadExtensionsTest.java new file mode 100644 index 0000000..a350d38 --- /dev/null +++ b/test/unit/groovy/ru/pulsar/jenkins/library/steps/LoadExtensionsTest.java @@ -0,0 +1,45 @@ +package ru.pulsar.jenkins.library.steps; + +import org.apache.commons.io.IOUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import ru.pulsar.jenkins.library.IStepExecutor; +import ru.pulsar.jenkins.library.configuration.ConfigurationReader; +import ru.pulsar.jenkins.library.configuration.JobConfiguration; +import ru.pulsar.jenkins.library.utils.TestUtils; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +import static org.assertj.core.api.Assertions.assertThat; + + +class LoadExtensionsTest { + + @BeforeEach + void setUp() { + TestUtils.setupMockedContext(); + } + + @Test + void runYaxunit() throws IOException { + + // given + String config = IOUtils.resourceToString( + "jobConfiguration.json", + StandardCharsets.UTF_8, + this.getClass().getClassLoader() + ); + + // when + JobConfiguration jobConfiguration = ConfigurationReader.create(config); + + LoadExtensions loadExtensions = new LoadExtensions(jobConfiguration, "yaxunit"); + + // when + Object run = loadExtensions.run(); + + // assertThat(log.toString).(1); + } +} diff --git a/vars/loadExtensions.groovy b/vars/loadExtensions.groovy index 78e8b76..6c6d469 100644 --- a/vars/loadExtensions.groovy +++ b/vars/loadExtensions.groovy @@ -2,9 +2,9 @@ import ru.pulsar.jenkins.library.configuration.JobConfiguration import ru.pulsar.jenkins.library.ioc.ContextRegistry import ru.pulsar.jenkins.library.steps.LoadExtensions -def call(JobConfiguration config) { +def call(JobConfiguration config, String stageName = "") { ContextRegistry.registerDefaultContext(this) - def loadExtensions = new LoadExtensions(config) + def loadExtensions = new LoadExtensions(config, stageName) loadExtensions.run() } \ No newline at end of file diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index 573586d..3b62cff 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -196,18 +196,33 @@ void call() { } stage('BDD сценарии') { - agent { - label agent1C - } - when { - beforeAgent true - expression { config.stageFlags.bdd } - } - steps { - timeout(time: config.timeoutOptions.bdd, unit: TimeUnit.MINUTES) { - unzipInfobase() - bdd config + stage('Загрузка расширений в конфигурацию'){ + when { + beforeAgent true + expression { config.needLoadExtensions('bdd') } + } + steps { + timeout(time: config.timeoutOptions.loadExtensions, unit: TimeUnit.MINUTES) { + loadExtensions config 'bdd' + } + } + } + + stage('Выполнение BDD сценариев') { + agent { + label agent1C + } + when { + beforeAgent true + expression { config.stageFlags.bdd } + } + steps { + timeout(time: config.timeoutOptions.bdd, unit: TimeUnit.MINUTES) { + unzipInfobase() + + bdd config + } } } } @@ -228,35 +243,66 @@ void call() { } stage('Дымовые тесты') { - agent { - label agent1C - } - when { - beforeAgent true - expression { config.stageFlags.smoke } - } - steps { - timeout(time: config.timeoutOptions.smoke, unit: TimeUnit.MINUTES) { - unzipInfobase() - smoke config + stage('Загрузка расширений в конфигурацию') { + when { + beforeAgent true + expression { config.needLoadExtensions('smoke') } + } + steps { + timeout(time: config.timeoutOptions.loadExtensions, unit: TimeUnit.MINUTES) { + loadExtensions config 'smoke' + } + } + } + + stage('Выполнение дымовых тестов') { + agent { + label agent1C + } + when { + beforeAgent true + expression { config.stageFlags.smoke } + } + steps { + timeout(time: config.timeoutOptions.smoke, unit: TimeUnit.MINUTES) { + unzipInfobase() + + smoke config + } } } } stage('YAXUnit тесты') { - agent { - label agent1C - } - when { - beforeAgent true - expression { config.stageFlags.yaxunit } - } - steps { - timeout(time: config.timeoutOptions.yaxunit, unit: TimeUnit.MINUTES) { - unzipInfobase() - yaxunit config + stage('Загрузка расширений в конфигурацию') { + when { + beforeAgent true + expression { config.needLoadExtensions('yaxunit') } + } + steps { + timeout(time: config.timeoutOptions.loadExtensions, unit: TimeUnit.MINUTES) { + loadExtensions config 'yaxunit' + } + } + } + + stage('Выполнение YAXUnit тестов') { + + agent { + label agent1C + } + when { + beforeAgent true + expression { config.stageFlags.yaxunit } + } + steps { + timeout(time: config.timeoutOptions.yaxunit, unit: TimeUnit.MINUTES) { + unzipInfobase() + + yaxunit config + } } } }