From 10310dd138ed00e9a2410285b39425a9545957f8 Mon Sep 17 00:00:00 2001 From: Sergey Kozinskiy Date: Sun, 22 Jan 2023 15:32:04 +0500 Subject: [PATCH 01/26] Yaxunit --- resources/globalConfiguration.json | 5 + resources/schema.json | 19 ++++ .../configuration/ConfigurationReader.groovy | 1 + .../configuration/JobConfiguration.groovy | 5 + .../library/configuration/StageFlags.groovy | 5 +- .../configuration/TimeoutOptions.groovy | 5 + .../configuration/YaxunitOptions.groovy | 23 +++++ .../jenkins/library/steps/Yaxunit.groovy | 98 +++++++++++++++++++ vars/pipeline1C.groovy | 17 ++++ vars/yaxunit.groovy | 12 +++ 10 files changed, 189 insertions(+), 1 deletion(-) create mode 100644 src/ru/pulsar/jenkins/library/configuration/YaxunitOptions.groovy create mode 100644 src/ru/pulsar/jenkins/library/steps/Yaxunit.groovy create mode 100644 vars/yaxunit.groovy diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index 45936811..c7d90785 100644 --- a/resources/globalConfiguration.json +++ b/resources/globalConfiguration.json @@ -18,11 +18,13 @@ "syntaxCheck": false, "edtValidate": false, "smoke": false, + "yaxunit": false, "email": false, "telegram": false }, "timeout": { "smoke": 240, + "yaxunit": 240, "bdd": 120, "getBinaries": 60, "createInfoBase": 60, @@ -80,6 +82,9 @@ "publishToAllureReport": false, "publishToJUnitReport": true }, + "yaxunit": { + "vrunnerSettings": "./tools/vrunner.json" + }, "resultsTransform": { "removeSupport": true, "supportLevel": 0 diff --git a/resources/schema.json b/resources/schema.json index f3c942c0..46362771 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -67,6 +67,10 @@ "type": "boolean", "description": "Дымовые тесты включены" }, + "yaxunit": { + "type": "boolean", + "description": "Юнит тесты" + }, "initSteps": { "type": "boolean", "description": "Предварительные шаги инициализации включены" @@ -290,6 +294,21 @@ } } }, + "yaxunit": { + "type": "object", + "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:YaxunitOptions", + "description": "Настройки юнит тестирования", + "properties": { + "vrunnerSettings": { + "type": "string", + "description": "Путь к конфигурационному файлу vanessa-runner.\n По умолчанию содержит значение \"./tools/vrunner.json\".\n " + }, + "configPath": { + "type": "string", + "description": "Путь к конфигурационному файлу для Yaxunit.\n По умолчанию содержит значение \"./tools/YaxunitConfig.json\".\n " + } + } + }, "resultsTransform": { "type": "object", "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:ResultsTransformOptions", diff --git a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy index 395da027..94099c49 100644 --- a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy @@ -65,6 +65,7 @@ class ConfigurationReader implements Serializable { "bddOptions", "sonarQubeOptions", "smokeTestOptions", + "yaxunitoptions", "syntaxCheckOptions", "resultsTransformOptions", "notificationsOptions", diff --git a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy index 8c1d331c..dca45a04 100644 --- a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy @@ -55,6 +55,10 @@ class JobConfiguration implements Serializable { @JsonPropertyDescription("Настройки дымового тестирования") SmokeTestOptions smokeTestOptions; + @JsonProperty("yaxunit") + @JsonPropertyDescription("Настройки юнит тестирования") + YaxunitOptions yaxunitOptions; + @JsonProperty("resultsTransform") @JsonPropertyDescription("Настройки трансформации результатов анализа") ResultsTransformOptions resultsTransformOptions; @@ -84,6 +88,7 @@ class JobConfiguration implements Serializable { ", sonarQubeOptions=" + sonarQubeOptions + ", syntaxCheckOptions=" + syntaxCheckOptions + ", smokeTestOptions=" + smokeTestOptions + + ", yaxunitoptions=" + yaxunitOptions + ", resultsTransformOptions=" + resultsTransformOptions + ", notificationOptions=" + notificationsOptions + ", logosConfig='" + logosConfig + '\'' + diff --git a/src/ru/pulsar/jenkins/library/configuration/StageFlags.groovy b/src/ru/pulsar/jenkins/library/configuration/StageFlags.groovy index 28f23adf..b6086acd 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 yaxunit + @JsonPropertyDescription("Предварительные шаги инициализации включены") Boolean initSteps @@ -46,6 +49,6 @@ class StageFlags implements Serializable { } boolean needInfoBase() { - return smoke || syntaxCheck || initSteps || bdd + return smoke || syntaxCheck || initSteps || bdd || yaxunit } } diff --git a/src/ru/pulsar/jenkins/library/configuration/TimeoutOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/TimeoutOptions.groovy index 612dc2b6..d08c67df 100644 --- a/src/ru/pulsar/jenkins/library/configuration/TimeoutOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/TimeoutOptions.groovy @@ -66,6 +66,11 @@ class TimeoutOptions implements Serializable { ''') Integer smoke + @JsonPropertyDescription('''Таймаут шага Юнит тестов, в минутах. + По умолчанию содержит значение 240. + ''') + Integer yaxunit + @JsonPropertyDescription('''Таймаут шага статического анализа SonarQube, в минутах. По умолчанию содержит значение 90. ''') diff --git a/src/ru/pulsar/jenkins/library/configuration/YaxunitOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/YaxunitOptions.groovy new file mode 100644 index 00000000..83e7be81 --- /dev/null +++ b/src/ru/pulsar/jenkins/library/configuration/YaxunitOptions.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 YaxunitOptions implements Serializable { + + @JsonPropertyDescription("""Путь к конфигурационному файлу vanessa-runner. + По умолчанию содержит значение "./tools/vrunner.json". + """) + String vrunnerSettings + + @Override + @NonCPS + String toString() { + return "YaxunitTestOptions{" + + "vrunnerSettings='" + vrunnerSettings + '\'' + + ", configPath='" + configPath + + '}' + } +} diff --git a/src/ru/pulsar/jenkins/library/steps/Yaxunit.groovy b/src/ru/pulsar/jenkins/library/steps/Yaxunit.groovy new file mode 100644 index 00000000..943bfe1e --- /dev/null +++ b/src/ru/pulsar/jenkins/library/steps/Yaxunit.groovy @@ -0,0 +1,98 @@ +package ru.pulsar.jenkins.library.steps + +import hudson.FilePath +import ru.pulsar.jenkins.library.IStepExecutor +import ru.pulsar.jenkins.library.configuration.JobConfiguration +import ru.pulsar.jenkins.library.ioc.ContextRegistry +import ru.pulsar.jenkins.library.utils.FileUtils +import ru.pulsar.jenkins.library.utils.Logger +import ru.pulsar.jenkins.library.utils.VRunner + +import java.nio.file.Files + +class Yaxunit implements Serializable { + + private final JobConfiguration config + + private final String yaxunitPath = 'build/yaxunit.cfe' + + Yaxunit(JobConfiguration config) { + this.config = config + } + + def run() { + IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() + + Logger.printLocation() + + if (!config.stageFlags.yaxunit) { + Logger.println("Yaxunit test step is disabled") + return + } + + List logosConfig = ["LOGOS_CONFIG=$config.logosConfig"] + steps.withEnv(logosConfig) { + steps.installLocalDependencies() + } + + def options = config.yaxunitOptions + def env = steps.env() + + String vrunnerPath = VRunner.getVRunnerPath() + String ibConnection = "--ibconnection /F./build/ib" + + // Скачиваем расширение с гитхаба + String pathToYaxunit = "$env.WORKSPACE/$yaxunitPath" + FilePath localPathToYaxunit = FileUtils.getFilePath(pathToYaxunit) + Logger.println("Скачивание Yaxunit в $localPathToYaxunit") + localPathToYaxunit.copyFrom(new URL('https://github.com/bia-technologies/yaxunit/releases/download/22.11.0/YAXUNIT-22.11.cfe')) + + // Устанавливаем расширение +// String loadYaxunitCommand = "$vrunnerPath loadext -f $localPathToYaxunit --extension Yaxunit --updatedb $ibConnection" + String loadYaxunitCommand = vrunnerPath + ' run --command "Путь=' + pathToYaxunit + ';ЗавершитьРаботуСистемы" --execute $runnerRoot/epf/ЗагрузитьРасширениеВРежимеПредприятия.epf ' + ibConnection + // Устанавливаем тесты + String loadTestsCommand = "$vrunnerPath compileext ./src/cfe test --updatedb $ibConnection" + + // Создаем конфиг, т.к. в репо может быть ключ, который не закрывает программу и может повесить конвеер + // Также путь к отчету в формате junit указывается в конфиге, т.к. мы не знаем на чем стартует агент, + // поэтому собираем сами. Стоит вынести в отдельный класс + String junitReport = "build/out/jUnit/yaxunit/yaxunit.xml" + FilePath pathToJUnitReport = FileUtils.getFilePath("$env.WORKSPACE/$junitReport") + String junitReportDir = FileUtils.getLocalPath(pathToJUnitReport.getParent()) + String configYaxunit = "test-config.json" + FilePath pathToConfig = FileUtils.getFilePath("$env.WORKSPACE/$configYaxunit") +// def data = [ +// 'filter' : 'test', +// 'reportPath' : 'ss' +// ] +// String data = "{\"filter\": {\"extensions\": [\"test\"]}, \"reportPath\": \"$pathToConfig\"}" +// def json = new groovy.json.JsonBuilder() +// json "filter" : "jj", "reportPath" : "ii" +// def file = new File("$env.WORKSPACE\\$configYaxunit") +// file.createNewFile() +// file.write(groovy.json.JsonOutput.prettyPrint(json.toString())) + + // Запускаем тесты + String command = "$vrunnerPath run --command RunUnitTests=$pathToConfig $ibConnection" + + String vrunnerSettings = options.vrunnerSettings + if (steps.fileExists(vrunnerSettings)) { + String vrunnerSettingsCommand = " --settings $vrunnerSettings" + + command += vrunnerSettingsCommand + loadYaxunitCommand += vrunnerSettingsCommand + loadTestsCommand += vrunnerSettingsCommand + } + + steps.withEnv(logosConfig) { + VRunner.exec(loadYaxunitCommand, true) + VRunner.exec(loadTestsCommand, true) + VRunner.exec(command, true) + } + + // Сохраняем результаты + steps.junit("$junitReportDir/*.xml", true) + steps.archiveArtifacts("$junitReportDir/**") + + } +} diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index f5d8ee8a..76df5550 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -243,6 +243,23 @@ void call() { } } } + + stage('Юнит тесты') { + agent { + label agent1C + } + when { + beforeAgent true + expression { config.stageFlags.yaxunit } + } + steps { + timeout(time: config.timeoutOptions.smoke, unit: TimeUnit.MINUTES) { + unzipInfobase() + + yaxunit config + } + } + } } } diff --git a/vars/yaxunit.groovy b/vars/yaxunit.groovy new file mode 100644 index 00000000..8d1183c9 --- /dev/null +++ b/vars/yaxunit.groovy @@ -0,0 +1,12 @@ +import ru.pulsar.jenkins.library.configuration.JobConfiguration +import ru.pulsar.jenkins.library.ioc.ContextRegistry +import ru.pulsar.jenkins.library.steps.Yaxunit + +def call(JobConfiguration config) { + + ContextRegistry.registerDefaultContext(this) + + def yaxunit = new Yaxunit(config) + yaxunit.run() + +} From 37a219f8a9c905518a4525dce1f27c38bad98949 Mon Sep 17 00:00:00 2001 From: Dima Ovcharenko Date: Thu, 6 Jul 2023 21:38:34 +0300 Subject: [PATCH 02/26] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20Yaxunit=20(#13)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add params * rewrite and add params * fix options merge * fix command * switch to ArrayList * fix junit reports * fix yaxunit config * fix yaxunit config * fix yaxunit config paths * add allure * fix allure * fix public * fix static * copy allure * publish options * schema upd --- build.gradle.kts | 4 + resources/globalConfiguration.json | 7 +- resources/schema.json | 14 ++- resources/yaxunit.json | 26 +++++ .../configuration/ConfigurationReader.groovy | 11 +- .../configuration/JobConfiguration.groovy | 2 +- .../configuration/YaxunitOptions.groovy | 29 ++++- .../library/steps/PublishAllure.groovy | 11 +- .../jenkins/library/steps/Yaxunit.groovy | 103 +++++++++++------- vars/pipeline1C.groovy | 2 +- 10 files changed, 161 insertions(+), 48 deletions(-) create mode 100644 resources/yaxunit.json diff --git a/build.gradle.kts b/build.gradle.kts index 2de8c201..e557c92e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -61,6 +61,8 @@ dependencies { integrationTestImplementation("org.slf4j", "slf4j-api", slf4jVersion) integrationTestImplementation("org.slf4j", "slf4j-simple", slf4jVersion) + integrationTestImplementation("org.springframework.security", "spring-security-core", "5.1.13.RELEASE") + } tasks.test { @@ -105,6 +107,8 @@ sharedLibrary { 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") dependency("org.jenkinsci.plugins", "pipeline-model-definition", declarativePluginsVersion) diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index c7d90785..fffe0328 100644 --- a/resources/globalConfiguration.json +++ b/resources/globalConfiguration.json @@ -83,7 +83,12 @@ "publishToJUnitReport": true }, "yaxunit": { - "vrunnerSettings": "./tools/vrunner.json" + "vrunnerSettings": "./tools/vrunner.json", + "cfe": "https://github.com/bia-technologies/yaxunit/releases/download/23.05/YAXUNIT-23.05.cfe", + "extensionNames": ["YAXUNIT"], + "configPath": "./tools/yaxunit.json", + "publishToAllureReport": false, + "publishToJUnitReport": true }, "resultsTransform": { "removeSupport": true, diff --git a/resources/schema.json b/resources/schema.json index 46362771..acc82d02 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -142,6 +142,10 @@ "type": "integer", "description": "Таймаут шага дымовых тестов, в минутах.\n По умолчанию содержит значение 240.\n " }, + "yaxunit": { + "type": "integer", + "description": "Таймаут шага Юнит тестов, в минутах.\n По умолчанию содержит значение 240.\n " + }, "sonarqube": { "type": "integer", "description": "Таймаут шага статического анализа SonarQube, в минутах.\n По умолчанию содержит значение 90.\n " @@ -305,7 +309,15 @@ }, "configPath": { "type": "string", - "description": "Путь к конфигурационному файлу для Yaxunit.\n По умолчанию содержит значение \"./tools/YaxunitConfig.json\".\n " + "description": "Путь к конфигурационному файлу YAXUnit.\n По умолчанию содержит значение \"./tools/yaxunit.json\".\n " + }, + "publishToAllureReport": { + "type": "boolean", + "description": "Выполнять публикацию результатов в отчет Allure.\n По умолчанию выключено.\n " + }, + "publishToJUnitReport": { + "type": "boolean", + "description": "Выполнять публикацию результатов в отчет JUnit.\n По умолчанию включено.\n " } } }, diff --git a/resources/yaxunit.json b/resources/yaxunit.json new file mode 100644 index 00000000..b5910455 --- /dev/null +++ b/resources/yaxunit.json @@ -0,0 +1,26 @@ +{ + "reportPath": "./build/out/yaxunit/junit.xml", + "closeAfterTests": true, + "filter": { + "extensions": [ + "YAXUNIT" + ], + "modules": null, + "suites": null, + "tags": null, + "contexts": null, + "paths": null, + "tests": null + }, + "settings": { + "ВТранзакции": true + }, + "reportFormat": "jUnit", + "showReport": false, + "logging": { + "file": "./build/out/yaxunit/log.txt", + "enable": false, + "level": "debug" + }, + "exitCode": "./build/out/yaxunit/result.txt" +} \ No newline at end of file diff --git a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy index 94099c49..7b285799 100644 --- a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy @@ -65,7 +65,7 @@ class ConfigurationReader implements Serializable { "bddOptions", "sonarQubeOptions", "smokeTestOptions", - "yaxunitoptions", + "yaxunitOptions", "syntaxCheckOptions", "resultsTransformOptions", "notificationsOptions", @@ -81,6 +81,7 @@ class ConfigurationReader implements Serializable { mergeObjects(baseConfiguration, configurationToMerge, nonMergeableSettings) mergeInitInfoBaseOptions(baseConfiguration.initInfoBaseOptions, configurationToMerge.initInfoBaseOptions) mergeBddOptions(baseConfiguration.bddOptions, configurationToMerge.bddOptions) + mergeYaxunitOptions(baseConfiguration.yaxunitOptions, configurationToMerge.yaxunitOptions) mergeSyntaxCheckOptions(baseConfiguration.syntaxCheckOptions, configurationToMerge.syntaxCheckOptions) mergeNotificationsOptions(baseConfiguration.notificationsOptions, configurationToMerge.notificationsOptions) @@ -147,6 +148,14 @@ class ConfigurationReader implements Serializable { baseObject.vrunnerSteps = objectToMerge.vrunnerSteps.clone() } + @NonCPS + private static void mergeYaxunitOptions(YaxunitOptions baseObject, YaxunitOptions objectToMerge) { + if (objectToMerge == null || objectToMerge.extensionNames == null) { + return + } + baseObject.extensionNames = objectToMerge.extensionNames.clone() + } + @NonCPS private static void mergeSyntaxCheckOptions(SyntaxCheckOptions baseObject, SyntaxCheckOptions objectToMerge) { if (objectToMerge == null || objectToMerge.checkModes == null) { diff --git a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy index dca45a04..72a008c9 100644 --- a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy @@ -88,7 +88,7 @@ class JobConfiguration implements Serializable { ", sonarQubeOptions=" + sonarQubeOptions + ", syntaxCheckOptions=" + syntaxCheckOptions + ", smokeTestOptions=" + smokeTestOptions + - ", yaxunitoptions=" + yaxunitOptions + + ", yaxunitOptions=" + yaxunitOptions + ", resultsTransformOptions=" + resultsTransformOptions + ", notificationOptions=" + notificationsOptions + ", logosConfig='" + logosConfig + '\'' + diff --git a/src/ru/pulsar/jenkins/library/configuration/YaxunitOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/YaxunitOptions.groovy index 83e7be81..2c8e357a 100644 --- a/src/ru/pulsar/jenkins/library/configuration/YaxunitOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/YaxunitOptions.groovy @@ -10,13 +10,40 @@ class YaxunitOptions implements Serializable { @JsonPropertyDescription("""Путь к конфигурационному файлу vanessa-runner. По умолчанию содержит значение "./tools/vrunner.json". """) - String vrunnerSettings + String vrunnerSettings = "./tools/vrunner.json" + + @JsonPropertyDescription("""Ссылка на скачивание YAXUnit. + По умолчанию содержит ссылку на официальный релиз версии 23.05. + """) + String cfe = "https://github.com/bia-technologies/yaxunit/releases/download/23.05/YAXUNIT-23.05.cfe" + + @JsonPropertyDescription("""Имена расширений с тестами. + По умолчанию содержит один элемент - YAXUNIT. + """) + String[] extensionNames = ['YAXUNIT'] + + @JsonPropertyDescription("""Путь к конфигурационному файлу YAXUnit. + По умолчанию содержит значение "./tools/yaxunit.json". + """) + String configPath = "./tools/yaxunit.json" + + @JsonPropertyDescription("""Выполнять публикацию результатов в отчет Allure. + По умолчанию выключено. + """) + boolean publishToAllureReport + + @JsonPropertyDescription("""Выполнять публикацию результатов в отчет JUnit. + По умолчанию включено. + """) + boolean publishToJUnitReport @Override @NonCPS String toString() { return "YaxunitTestOptions{" + "vrunnerSettings='" + vrunnerSettings + '\'' + + ", cfe='" + cfe + + ", extensionNames='" + extensionNames.toString() + ", configPath='" + configPath + '}' } diff --git a/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy b/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy index aaf7046c..e7c0e97d 100644 --- a/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy +++ b/src/ru/pulsar/jenkins/library/steps/PublishAllure.groovy @@ -9,8 +9,8 @@ import ru.pulsar.jenkins.library.utils.Logger class PublishAllure implements Serializable { - private final JobConfiguration config; - private IStepExecutor steps; + private final JobConfiguration config + private IStepExecutor steps PublishAllure(JobConfiguration config) { this.config = config @@ -33,11 +33,14 @@ class PublishAllure implements Serializable { if (config.stageFlags.bdd) { safeUnstash('bdd-allure') } + if (config.stageFlags.yaxunit) { + safeUnstash(Yaxunit.YAXUNIT_ALLURE_STASH) + } if (config.stageFlags.smoke && config.smokeTestOptions.publishToAllureReport) { safeUnstash(SmokeTest.SMOKE_ALLURE_STASH) } - def env = steps.env(); + def env = steps.env() FilePath allurePath = FileUtils.getFilePath("$env.WORKSPACE/build/out/allure") if (!allurePath.exists()) { @@ -45,7 +48,7 @@ class PublishAllure implements Serializable { return } - List results = new ArrayList<>(); + List results = new ArrayList<>() allurePath.listDirectories().each { FilePath filePath -> results.add(FileUtils.getLocalPath(filePath)) diff --git a/src/ru/pulsar/jenkins/library/steps/Yaxunit.groovy b/src/ru/pulsar/jenkins/library/steps/Yaxunit.groovy index 943bfe1e..bbf98c8c 100644 --- a/src/ru/pulsar/jenkins/library/steps/Yaxunit.groovy +++ b/src/ru/pulsar/jenkins/library/steps/Yaxunit.groovy @@ -8,14 +8,16 @@ import ru.pulsar.jenkins.library.utils.FileUtils import ru.pulsar.jenkins.library.utils.Logger import ru.pulsar.jenkins.library.utils.VRunner -import java.nio.file.Files - class Yaxunit implements Serializable { private final JobConfiguration config private final String yaxunitPath = 'build/yaxunit.cfe' + private final String DEFAULT_YAXUNIT_CONFIGURATION_RESOURCE = 'yaxunit.json' + + public static final String YAXUNIT_ALLURE_STASH = 'yaxunit-allure' + Yaxunit(JobConfiguration config) { this.config = config } @@ -39,60 +41,85 @@ class Yaxunit implements Serializable { def env = steps.env() String vrunnerPath = VRunner.getVRunnerPath() - String ibConnection = "--ibconnection /F./build/ib" + String ibConnection = ' --ibconnection "/F./build/ib"' - // Скачиваем расширение с гитхаба + // Скачиваем расширение String pathToYaxunit = "$env.WORKSPACE/$yaxunitPath" FilePath localPathToYaxunit = FileUtils.getFilePath(pathToYaxunit) Logger.println("Скачивание Yaxunit в $localPathToYaxunit") - localPathToYaxunit.copyFrom(new URL('https://github.com/bia-technologies/yaxunit/releases/download/22.11.0/YAXUNIT-22.11.cfe')) - - // Устанавливаем расширение -// String loadYaxunitCommand = "$vrunnerPath loadext -f $localPathToYaxunit --extension Yaxunit --updatedb $ibConnection" - String loadYaxunitCommand = vrunnerPath + ' run --command "Путь=' + pathToYaxunit + ';ЗавершитьРаботуСистемы" --execute $runnerRoot/epf/ЗагрузитьРасширениеВРежимеПредприятия.epf ' + ibConnection - // Устанавливаем тесты - String loadTestsCommand = "$vrunnerPath compileext ./src/cfe test --updatedb $ibConnection" - - // Создаем конфиг, т.к. в репо может быть ключ, который не закрывает программу и может повесить конвеер - // Также путь к отчету в формате junit указывается в конфиге, т.к. мы не знаем на чем стартует агент, - // поэтому собираем сами. Стоит вынести в отдельный класс - String junitReport = "build/out/jUnit/yaxunit/yaxunit.xml" - FilePath pathToJUnitReport = FileUtils.getFilePath("$env.WORKSPACE/$junitReport") - String junitReportDir = FileUtils.getLocalPath(pathToJUnitReport.getParent()) - String configYaxunit = "test-config.json" - FilePath pathToConfig = FileUtils.getFilePath("$env.WORKSPACE/$configYaxunit") -// def data = [ -// 'filter' : 'test', -// 'reportPath' : 'ss' -// ] -// String data = "{\"filter\": {\"extensions\": [\"test\"]}, \"reportPath\": \"$pathToConfig\"}" -// def json = new groovy.json.JsonBuilder() -// json "filter" : "jj", "reportPath" : "ii" -// def file = new File("$env.WORKSPACE\\$configYaxunit") -// file.createNewFile() -// file.write(groovy.json.JsonOutput.prettyPrint(json.toString())) - - // Запускаем тесты - String command = "$vrunnerPath run --command RunUnitTests=$pathToConfig $ibConnection" + localPathToYaxunit.copyFrom(new URL(options.cfe)) + + // Команда загрузки YAXUnit + String loadYaxunitCommand = vrunnerPath + ' run --command "Путь=' + pathToYaxunit + ';ЗавершитьРаботуСистемы;" --execute ' + String executeParameter = '$runnerRoot/epf/ЗагрузитьРасширениеВРежимеПредприятия.epf' + if (steps.isUnix()) { + executeParameter = '\\' + executeParameter + } + loadYaxunitCommand += executeParameter + loadYaxunitCommand += ' --ibconnection "/F./build/ib"' + + // Команда сборки расширений с тестами и их загрузки в ИБ + def loadTestExtCommands = [] + for (String extension in options.extensionNames) { + if (extension == "YAXUNIT") { + continue + } + def loadTestExtCommand = "$vrunnerPath compileext ./src/cfe/$extension $extension --updatedb $ibConnection" + loadTestExtCommands << loadTestExtCommand + Logger.println("Команда сборки расширения: $loadTestExtCommands") + } + + String yaxunitConfigPath = options.configPath + File yaxunitConfigFile = new File("$env.WORKSPACE/$yaxunitConfigPath") + if (!steps.fileExists(yaxunitConfigPath)) { + def defaultYaxunitConfig = steps.libraryResource DEFAULT_YAXUNIT_CONFIGURATION_RESOURCE + yaxunitConfigFile.write defaultYaxunitConfig + } + def yaxunitConfig = yaxunitConfigFile.getCanonicalPath() + + // Команда запуска тестов + String command = "$vrunnerPath run --command RunUnitTests=$yaxunitConfig $ibConnection" + // Переопределяем настройки vrunner String vrunnerSettings = options.vrunnerSettings + String[] loadTestExtCommandJoined = loadTestExtCommands if (steps.fileExists(vrunnerSettings)) { String vrunnerSettingsCommand = " --settings $vrunnerSettings" - command += vrunnerSettingsCommand loadYaxunitCommand += vrunnerSettingsCommand - loadTestsCommand += vrunnerSettingsCommand + + loadTestExtCommandJoined = loadTestExtCommands.collect { "$it $vrunnerSettingsCommand" } + command += vrunnerSettingsCommand + } + // Выполяем команды steps.withEnv(logosConfig) { VRunner.exec(loadYaxunitCommand, true) - VRunner.exec(loadTestsCommand, true) + for (loadTestExtCommand in loadTestExtCommandJoined) { + VRunner.exec(loadTestExtCommand, true) + } VRunner.exec(command, true) } // Сохраняем результаты - steps.junit("$junitReportDir/*.xml", true) - steps.archiveArtifacts("$junitReportDir/**") + String junitReport = "./build/out/yaxunit/junit.xml" + FilePath pathToJUnitReport = FileUtils.getFilePath("$env.WORKSPACE/$junitReport") + String junitReportDir = FileUtils.getLocalPath(pathToJUnitReport.getParent()) + if (options.publishToJUnitReport) { + steps.junit("$junitReportDir/*.xml", true) + steps.archiveArtifacts("$junitReportDir/**") + } + + if (options.publishToAllureReport) { + String allureReport = "./build/out/allure/yaxunit/junit.xml" + FilePath pathToAllureReport = FileUtils.getFilePath("$env.WORKSPACE/$allureReport") + String allureReportDir = FileUtils.getLocalPath(pathToAllureReport.getParent()) + + pathToJUnitReport.copyTo(pathToAllureReport) + + steps.stash(YAXUNIT_ALLURE_STASH, "$allureReportDir/**", true) + } } } diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index 76df5550..6fdc8568 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -253,7 +253,7 @@ void call() { expression { config.stageFlags.yaxunit } } steps { - timeout(time: config.timeoutOptions.smoke, unit: TimeUnit.MINUTES) { + timeout(time: config.timeoutOptions.yaxunit, unit: TimeUnit.MINUTES) { unzipInfobase() yaxunit config From b00202df77f3131f275e9e5e420f2be929b07e43 Mon Sep 17 00:00:00 2001 From: Dima Ovcharenko Date: Fri, 7 Jul 2023 15:07:42 +0300 Subject: [PATCH 03/26] =?UTF-8?q?=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7?= =?UTF-8?q?=D0=BA=D0=B0=20=D1=80=D0=B0=D1=81=D1=88=D0=B8=D1=80=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B9=20=D1=81=20=D0=BE=D1=82=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=D0=BC=20=D0=B1=D0=B5=D0=B7=D0=BE=D0=BF?= =?UTF-8?q?=D0=B0=D1=81=D0=BD=D0=BE=D0=B3=D0=BE=20=D1=80=D0=B5=D0=B6=D0=B8?= =?UTF-8?q?=D0=BC=D0=B0=20(#14)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jenkins/library/steps/Yaxunit.groovy | 57 ++++++++++--------- .../jenkins/library/utils/VRunner.groovy | 31 ++++++++-- 2 files changed, 57 insertions(+), 31 deletions(-) diff --git a/src/ru/pulsar/jenkins/library/steps/Yaxunit.groovy b/src/ru/pulsar/jenkins/library/steps/Yaxunit.groovy index bbf98c8c..af1f8615 100644 --- a/src/ru/pulsar/jenkins/library/steps/Yaxunit.groovy +++ b/src/ru/pulsar/jenkins/library/steps/Yaxunit.groovy @@ -12,7 +12,7 @@ class Yaxunit implements Serializable { private final JobConfiguration config - private final String yaxunitPath = 'build/yaxunit.cfe' + private final String yaxunitPath = 'build/out/yaxunit.cfe' private final String DEFAULT_YAXUNIT_CONFIGURATION_RESOURCE = 'yaxunit.json' @@ -43,32 +43,38 @@ class Yaxunit implements Serializable { String vrunnerPath = VRunner.getVRunnerPath() String ibConnection = ' --ibconnection "/F./build/ib"' - // Скачиваем расширение + // Скачиваем YAXUnit String pathToYaxunit = "$env.WORKSPACE/$yaxunitPath" FilePath localPathToYaxunit = FileUtils.getFilePath(pathToYaxunit) - Logger.println("Скачивание Yaxunit в $localPathToYaxunit") + Logger.println("Скачивание YAXUnit в $localPathToYaxunit из ${options.cfe}") localPathToYaxunit.copyFrom(new URL(options.cfe)) + def extCommands = [] + // Команда загрузки YAXUnit - String loadYaxunitCommand = vrunnerPath + ' run --command "Путь=' + pathToYaxunit + ';ЗавершитьРаботуСистемы;" --execute ' - String executeParameter = '$runnerRoot/epf/ЗагрузитьРасширениеВРежимеПредприятия.epf' - if (steps.isUnix()) { - executeParameter = '\\' + executeParameter - } - loadYaxunitCommand += executeParameter - loadYaxunitCommand += ' --ibconnection "/F./build/ib"' + def loadYaxunitCommand = VRunner.loadExtCommand("yaxunit") + extCommands << loadYaxunitCommand - // Команда сборки расширений с тестами и их загрузки в ИБ - def loadTestExtCommands = [] + + // Команды сборки расширений с тестами и их загрузки в ИБ for (String extension in options.extensionNames) { - if (extension == "YAXUNIT") { + if (extension.toUpperCase() == "YAXUNIT") { continue } - def loadTestExtCommand = "$vrunnerPath compileext ./src/cfe/$extension $extension --updatedb $ibConnection" - loadTestExtCommands << loadTestExtCommand - Logger.println("Команда сборки расширения: $loadTestExtCommands") + + // Команда компиляции в cfe + def compileExtCommand = "$vrunnerPath compileexttocfe --src ./src/cfe/$extension --out build/out/${extension}.cfe" + extCommands << compileExtCommand + Logger.println("Команда сборки расширения: $compileExtCommand") + + // Команда загрузки расширения в ИБ + def loadTestExtCommand = VRunner.loadExtCommand(extension) + extCommands << loadTestExtCommand + Logger.println("Команда загрузки расширения: $loadTestExtCommand") + } + // Готовим конфиг для yaxunit String yaxunitConfigPath = options.configPath File yaxunitConfigFile = new File("$env.WORKSPACE/$yaxunitConfigPath") if (!steps.fileExists(yaxunitConfigPath)) { @@ -78,28 +84,25 @@ class Yaxunit implements Serializable { def yaxunitConfig = yaxunitConfigFile.getCanonicalPath() // Команда запуска тестов - String command = "$vrunnerPath run --command RunUnitTests=$yaxunitConfig $ibConnection" + String runTestsCommand = "$vrunnerPath run --command RunUnitTests=$yaxunitConfig $ibConnection" // Переопределяем настройки vrunner String vrunnerSettings = options.vrunnerSettings - String[] loadTestExtCommandJoined = loadTestExtCommands + String[] extCommandsWithSettings = extCommands if (steps.fileExists(vrunnerSettings)) { - String vrunnerSettingsCommand = " --settings $vrunnerSettings" - - loadYaxunitCommand += vrunnerSettingsCommand + String vrunnerSettingsParam = " --settings $vrunnerSettings" - loadTestExtCommandJoined = loadTestExtCommands.collect { "$it $vrunnerSettingsCommand" } - command += vrunnerSettingsCommand + extCommandsWithSettings = extCommands.collect { "$it $vrunnerSettingsParam" } + runTestsCommand += vrunnerSettingsParam } // Выполяем команды steps.withEnv(logosConfig) { - VRunner.exec(loadYaxunitCommand, true) - for (loadTestExtCommand in loadTestExtCommandJoined) { - VRunner.exec(loadTestExtCommand, true) + for (extCommand in extCommandsWithSettings) { + VRunner.exec(extCommand, true) } - VRunner.exec(command, true) + VRunner.exec(runTestsCommand, true) } // Сохраняем результаты diff --git a/src/ru/pulsar/jenkins/library/utils/VRunner.groovy b/src/ru/pulsar/jenkins/library/utils/VRunner.groovy index fdf37e2f..ce065556 100644 --- a/src/ru/pulsar/jenkins/library/utils/VRunner.groovy +++ b/src/ru/pulsar/jenkins/library/utils/VRunner.groovy @@ -1,5 +1,6 @@ package ru.pulsar.jenkins.library.utils +import hudson.FilePath import ru.pulsar.jenkins.library.IStepExecutor import ru.pulsar.jenkins.library.ioc.ContextRegistry @@ -11,13 +12,13 @@ class VRunner { IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() - String vrunnerBinary = steps.isUnix() ? "vrunner" : "vrunner.bat"; - String vrunnerPath = "oscript_modules/bin/$vrunnerBinary"; + String vrunnerBinary = steps.isUnix() ? "vrunner" : "vrunner.bat" + String vrunnerPath = "oscript_modules/bin/$vrunnerBinary" if (!steps.fileExists(vrunnerPath)) { - vrunnerPath = vrunnerBinary; + vrunnerPath = vrunnerBinary } - return vrunnerPath; + return vrunnerPath } static int exec(String command, boolean returnStatus = false) { @@ -38,4 +39,26 @@ class VRunner { String fileContent = steps.readFile(configPath) return fileContent.contains("\"$settingName\"") } + + static String loadExtCommand(String name) { + + IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() + + def env = steps.env() + def vrunnerPath = getVRunnerPath() + + String pathToExt = "$env.WORKSPACE/build/out/${name}.cfe" + FilePath localPathToExt = FileUtils.getFilePath(pathToExt) + + // Команда загрузки расширения + String loadCommand = vrunnerPath + ' run --command "Путь=' + localPathToExt + ';ЗавершитьРаботуСистемы;" --execute ' + String executeParameter = '$runnerRoot/epf/ЗагрузитьРасширениеВРежимеПредприятия.epf' + if (steps.isUnix()) { + executeParameter = '\\' + executeParameter + } + loadCommand += executeParameter + loadCommand += ' --ibconnection "/F./build/ib"' + + return loadCommand + } } From a06a5e45153985b68dc85d06355476c4b6afbceb Mon Sep 17 00:00:00 2001 From: Dima Ovcharenko Date: Sun, 16 Jul 2023 19:19:55 +0300 Subject: [PATCH 04/26] upd README.md (#16) --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 3faa810c..97343aa5 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,7 @@ 1. Трансформация кода из формата конфигуратора в формат EDT. 1. Трансформация кода из формата EDT в формат конфигуратора. 1. Запуск BDD сценариев с сохранением результатов в формате Allure. +1. Запуск юнит-тестов с помощью фреймворка YAXUnit с сохранением результатов в формате jUnit и Allure. 1. Запуск синтаксического контроля средствами конфигуратора и сохранение результатов в виде отчета jUnit. 1. Запуск валидации проекта средствами EDT и конвертация отчета в формате generic issues. 1. Запуск статического анализа для SonarQube. @@ -131,6 +132,9 @@ pipeline1C() * Если в настройках шага инициализации не заполнен массив дополнительных шагов миграции (`initInfobase` -> `additionalInitializationSteps`), но в каталоге `tools` присутствуют файлы с именами, удовлетворяющими шаблону `vrunner.init*.json`, то автоматически выполняется запуск `vrunner vanessa` с передачей найденных файлов в качестве значения настроек (параметр `--settings`) в порядке лексикографической сортировки имен файлов. * BDD: * Если в конфигурационном файле проекта не заполнена настройка `bdd` -> `vrunnerSteps`, то автоматически выполняется запуск `vrunner vanessa --settings tools/vrunner.json`. +* YAXUnit: + * Если ваши тесты находятся в расширении YAXUnit, то необходимо указать к путь к этому расширению в формате cfe в `yaxunit` -> `cfe` + * Если ваши тесты находятся в отдельных расширениях, то необходимо (1) скопировать конфиг из текущей библиотеки (`./resources/yaxunit.json`) в свой репозиторий в `./tools/yaxunit.json` и перечислить в нем имена своих расширений. Имена образуются по правилу: `./src/cfe/unit_tests` -> `unit_tests`. И (2) - перечислить эти же имена в `jobConfiguration.json` -> `yaxunit` -> `extensionNames`. Пока что поддерживаются только расширения, выгруженные в формате конфигуратора. * Дымовые тесты: * Если в репозитории существует файл `tools/vrunner.json`, то запуск дымовых тестов будет выполняться с передачей файла в параметры запуска `vrunner xunit --settings tools/vrunner.json` (`smoke` -> `vrunnerSettings`). * Если установка локальных зависимостей `opm` установит пакет `add`, то будет использоваться обработка `xddTestRunner.epf` из локальных зависимостей. From 8dc051b3aeac91d857aed8fcb685a9c5cdf20f34 Mon Sep 17 00:00:00 2001 From: Dima Ovcharenko Date: Mon, 17 Jul 2023 13:41:57 +0300 Subject: [PATCH 05/26] =?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=B7=D0=B0=D0=BC=D0=B5=D1=87?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B9=20=D0=BA=20PR=20=D0=B2=20upstream=20(#?= =?UTF-8?q?17)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- resources/globalConfiguration.json | 8 +++- resources/schema.json | 6 +-- .../jenkins/library/IStepExecutor.groovy | 2 + .../jenkins/library/StepExecutor.groovy | 5 +++ .../configuration/ConfigurationReader.groovy | 5 ++- .../library/configuration/Extension.groovy | 17 +++++++++ .../configuration/JobConfiguration.groovy | 2 +- .../library/configuration/StageFlags.groovy | 2 +- .../configuration/TimeoutOptions.groovy | 2 +- .../configuration/YaxunitOptions.groovy | 19 +++++----- .../jenkins/library/steps/Yaxunit.groovy | 37 ++++++++----------- .../groovy/jobConfigurationTest.groovy | 1 + .../resources/jobConfiguration.json | 2 + vars/pipeline1C.groovy | 2 +- 15 files changed, 70 insertions(+), 44 deletions(-) create mode 100644 src/ru/pulsar/jenkins/library/configuration/Extension.groovy diff --git a/README.md b/README.md index 97343aa5..1837f41d 100644 --- a/README.md +++ b/README.md @@ -133,8 +133,8 @@ pipeline1C() * BDD: * Если в конфигурационном файле проекта не заполнена настройка `bdd` -> `vrunnerSteps`, то автоматически выполняется запуск `vrunner vanessa --settings tools/vrunner.json`. * YAXUnit: - * Если ваши тесты находятся в расширении YAXUnit, то необходимо указать к путь к этому расширению в формате cfe в `yaxunit` -> `cfe` - * Если ваши тесты находятся в отдельных расширениях, то необходимо (1) скопировать конфиг из текущей библиотеки (`./resources/yaxunit.json`) в свой репозиторий в `./tools/yaxunit.json` и перечислить в нем имена своих расширений. Имена образуются по правилу: `./src/cfe/unit_tests` -> `unit_tests`. И (2) - перечислить эти же имена в `jobConfiguration.json` -> `yaxunit` -> `extensionNames`. Пока что поддерживаются только расширения, выгруженные в формате конфигуратора. + * Необходимо перечислить расширения в `jobConfiguration.json` -> `yaxunit` -> `extensions`. Путь к расширению можно указать либо в виде ссылки на файл cfe, либо в виде пути к исходникам. Пока что поддерживаются только расширения, выгруженные в формате конфигуратора. При переопределении настроек по умолчанию расширение YAXUnit тоже должно быть в этом списке. + * Если ваши тесты находятся в отдельных расширениях, то необходимо скопировать конфиг из текущей библиотеки (`./resources/yaxunit.json`) в свой репозиторий в `./tools/yaxunit.json` и перечислить в нем имена расширений. * Дымовые тесты: * Если в репозитории существует файл `tools/vrunner.json`, то запуск дымовых тестов будет выполняться с передачей файла в параметры запуска `vrunner xunit --settings tools/vrunner.json` (`smoke` -> `vrunnerSettings`). * Если установка локальных зависимостей `opm` установит пакет `add`, то будет использоваться обработка `xddTestRunner.epf` из локальных зависимостей. diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index fffe0328..18a8cca0 100644 --- a/resources/globalConfiguration.json +++ b/resources/globalConfiguration.json @@ -84,8 +84,12 @@ }, "yaxunit": { "vrunnerSettings": "./tools/vrunner.json", - "cfe": "https://github.com/bia-technologies/yaxunit/releases/download/23.05/YAXUNIT-23.05.cfe", - "extensionNames": ["YAXUNIT"], + "extensions": [ + { + "name":"YAXUNIT", + "src": "https://github.com/bia-technologies/yaxunit/releases/download/23.05/YAXUNIT-23.05.cfe" + } + ], "configPath": "./tools/yaxunit.json", "publishToAllureReport": false, "publishToJUnitReport": true diff --git a/resources/schema.json b/resources/schema.json index acc82d02..500468b1 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -69,7 +69,7 @@ }, "yaxunit": { "type": "boolean", - "description": "Юнит тесты" + "description" : "Запуск YAXUnit тестов включен" }, "initSteps": { "type": "boolean", @@ -144,7 +144,7 @@ }, "yaxunit": { "type": "integer", - "description": "Таймаут шага Юнит тестов, в минутах.\n По умолчанию содержит значение 240.\n " + "description" : "Таймаут шага YAXUnit тестов, в минутах.\n По умолчанию содержит значение 240.\n " }, "sonarqube": { "type": "integer", @@ -301,7 +301,7 @@ "yaxunit": { "type": "object", "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:YaxunitOptions", - "description": "Настройки юнит тестирования", + "description" : "Настройки YAXUnit", "properties": { "vrunnerSettings": { "type": "string", diff --git a/src/ru/pulsar/jenkins/library/IStepExecutor.groovy b/src/ru/pulsar/jenkins/library/IStepExecutor.groovy index e9f9cb50..05222ce3 100644 --- a/src/ru/pulsar/jenkins/library/IStepExecutor.groovy +++ b/src/ru/pulsar/jenkins/library/IStepExecutor.groovy @@ -26,6 +26,8 @@ interface IStepExecutor { String readFile(String file, String encoding) + void writeFile(String file, String text, String encoding) + boolean fileExists(String file) void echo(message) diff --git a/src/ru/pulsar/jenkins/library/StepExecutor.groovy b/src/ru/pulsar/jenkins/library/StepExecutor.groovy index e8ffe04f..1995ebb2 100644 --- a/src/ru/pulsar/jenkins/library/StepExecutor.groovy +++ b/src/ru/pulsar/jenkins/library/StepExecutor.groovy @@ -42,6 +42,11 @@ class StepExecutor implements IStepExecutor { steps.readFile encoding: encoding, file: file } + @Override + void writeFile(String file, String text, String encoding = 'UTF-8') { + steps.writeFile encoding: encoding, file: file, text: text + } + @Override boolean fileExists(String file) { steps.fileExists file diff --git a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy index 7b285799..b3dca8f0 100644 --- a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy @@ -66,6 +66,7 @@ class ConfigurationReader implements Serializable { "sonarQubeOptions", "smokeTestOptions", "yaxunitOptions", + "extensions", "syntaxCheckOptions", "resultsTransformOptions", "notificationsOptions", @@ -150,10 +151,10 @@ class ConfigurationReader implements Serializable { @NonCPS private static void mergeYaxunitOptions(YaxunitOptions baseObject, YaxunitOptions objectToMerge) { - if (objectToMerge == null || objectToMerge.extensionNames == null) { + if (objectToMerge == null || objectToMerge.extensions == null) { return } - baseObject.extensionNames = objectToMerge.extensionNames.clone() + baseObject.extensions = objectToMerge.extensions.clone() } @NonCPS diff --git a/src/ru/pulsar/jenkins/library/configuration/Extension.groovy b/src/ru/pulsar/jenkins/library/configuration/Extension.groovy new file mode 100644 index 00000000..51e04d21 --- /dev/null +++ b/src/ru/pulsar/jenkins/library/configuration/Extension.groovy @@ -0,0 +1,17 @@ +package ru.pulsar.jenkins.library.configuration + +import com.cloudbees.groovy.cps.NonCPS +import com.fasterxml.jackson.annotation.JsonIgnoreProperties + +@JsonIgnoreProperties(ignoreUnknown = true) +class Extension implements Serializable { + String name + String src + + @Override + @NonCPS + String toString() { + return name + } + +} diff --git a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy index 72a008c9..f3a12327 100644 --- a/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/JobConfiguration.groovy @@ -56,7 +56,7 @@ class JobConfiguration implements Serializable { SmokeTestOptions smokeTestOptions; @JsonProperty("yaxunit") - @JsonPropertyDescription("Настройки юнит тестирования") + @JsonPropertyDescription("Настройки YAXUnit") YaxunitOptions yaxunitOptions; @JsonProperty("resultsTransform") diff --git a/src/ru/pulsar/jenkins/library/configuration/StageFlags.groovy b/src/ru/pulsar/jenkins/library/configuration/StageFlags.groovy index b6086acd..1d8c21c9 100644 --- a/src/ru/pulsar/jenkins/library/configuration/StageFlags.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/StageFlags.groovy @@ -18,7 +18,7 @@ class StageFlags implements Serializable { @JsonPropertyDescription("Дымовые тесты включены") Boolean smoke - @JsonPropertyDescription("Юнит тесты") + @JsonPropertyDescription("Запуск YAXUnit тестов включен") Boolean yaxunit @JsonPropertyDescription("Предварительные шаги инициализации включены") diff --git a/src/ru/pulsar/jenkins/library/configuration/TimeoutOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/TimeoutOptions.groovy index d08c67df..900f6a90 100644 --- a/src/ru/pulsar/jenkins/library/configuration/TimeoutOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/TimeoutOptions.groovy @@ -66,7 +66,7 @@ class TimeoutOptions implements Serializable { ''') Integer smoke - @JsonPropertyDescription('''Таймаут шага Юнит тестов, в минутах. + @JsonPropertyDescription('''Таймаут шага YAXUnit тестов, в минутах. По умолчанию содержит значение 240. ''') Integer yaxunit diff --git a/src/ru/pulsar/jenkins/library/configuration/YaxunitOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/YaxunitOptions.groovy index 2c8e357a..1001187c 100644 --- a/src/ru/pulsar/jenkins/library/configuration/YaxunitOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/YaxunitOptions.groovy @@ -2,6 +2,7 @@ package ru.pulsar.jenkins.library.configuration import com.cloudbees.groovy.cps.NonCPS import com.fasterxml.jackson.annotation.JsonIgnoreProperties +import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonPropertyDescription @JsonIgnoreProperties(ignoreUnknown = true) @@ -12,15 +13,14 @@ class YaxunitOptions implements Serializable { """) String vrunnerSettings = "./tools/vrunner.json" - @JsonPropertyDescription("""Ссылка на скачивание YAXUnit. - По умолчанию содержит ссылку на официальный релиз версии 23.05. + @JsonProperty("extensions") + @JsonPropertyDescription("""Расширения с тестами. + Массив объектов с полями name и src, где + name - имя расширения + src - путь к расширению (к cfe или к исходникам) + По умолчанию содержит один элемент - YAXUNIT версии 23.05. """) - String cfe = "https://github.com/bia-technologies/yaxunit/releases/download/23.05/YAXUNIT-23.05.cfe" - - @JsonPropertyDescription("""Имена расширений с тестами. - По умолчанию содержит один элемент - YAXUNIT. - """) - String[] extensionNames = ['YAXUNIT'] + Extension[] extensions @JsonPropertyDescription("""Путь к конфигурационному файлу YAXUnit. По умолчанию содержит значение "./tools/yaxunit.json". @@ -42,8 +42,7 @@ class YaxunitOptions implements Serializable { String toString() { return "YaxunitTestOptions{" + "vrunnerSettings='" + vrunnerSettings + '\'' + - ", cfe='" + cfe + - ", extensionNames='" + extensionNames.toString() + + ", extensions='" + extensions + ", configPath='" + configPath + '}' } diff --git a/src/ru/pulsar/jenkins/library/steps/Yaxunit.groovy b/src/ru/pulsar/jenkins/library/steps/Yaxunit.groovy index af1f8615..7549ed10 100644 --- a/src/ru/pulsar/jenkins/library/steps/Yaxunit.groovy +++ b/src/ru/pulsar/jenkins/library/steps/Yaxunit.groovy @@ -2,6 +2,7 @@ package ru.pulsar.jenkins.library.steps import hudson.FilePath import ru.pulsar.jenkins.library.IStepExecutor +import ru.pulsar.jenkins.library.configuration.Extension import ru.pulsar.jenkins.library.configuration.JobConfiguration import ru.pulsar.jenkins.library.ioc.ContextRegistry import ru.pulsar.jenkins.library.utils.FileUtils @@ -12,8 +13,6 @@ class Yaxunit implements Serializable { private final JobConfiguration config - private final String yaxunitPath = 'build/out/yaxunit.cfe' - private final String DEFAULT_YAXUNIT_CONFIGURATION_RESOURCE = 'yaxunit.json' public static final String YAXUNIT_ALLURE_STASH = 'yaxunit-allure' @@ -43,32 +42,29 @@ class Yaxunit implements Serializable { String vrunnerPath = VRunner.getVRunnerPath() String ibConnection = ' --ibconnection "/F./build/ib"' - // Скачиваем YAXUnit - String pathToYaxunit = "$env.WORKSPACE/$yaxunitPath" - FilePath localPathToYaxunit = FileUtils.getFilePath(pathToYaxunit) - Logger.println("Скачивание YAXUnit в $localPathToYaxunit из ${options.cfe}") - localPathToYaxunit.copyFrom(new URL(options.cfe)) - def extCommands = [] // Команда загрузки YAXUnit def loadYaxunitCommand = VRunner.loadExtCommand("yaxunit") extCommands << loadYaxunitCommand - // Команды сборки расширений с тестами и их загрузки в ИБ - for (String extension in options.extensionNames) { - if (extension.toUpperCase() == "YAXUNIT") { - continue + for (Extension extension in options.extensions) { + if (extension.src.endsWith('cfe')) { + // Скачиваем расширение + String pathToExtension = "$env.WORKSPACE/build/out/${extension.name}.cfe" + FilePath localPathToExtension = FileUtils.getFilePath(pathToExtension) + Logger.println("Скачивание расширения $extension.name в $localPathToExtension из ${extension.src}") + localPathToExtension.copyFrom(new URL(extension.src)) + } else { + // Команда компиляции в cfe + def compileExtCommand = "$vrunnerPath compileexttocfe --src $extension.src --out build/out/${extension.name}.cfe" + extCommands << compileExtCommand + Logger.println("Команда сборки расширения: $compileExtCommand") } - - // Команда компиляции в cfe - def compileExtCommand = "$vrunnerPath compileexttocfe --src ./src/cfe/$extension --out build/out/${extension}.cfe" - extCommands << compileExtCommand - Logger.println("Команда сборки расширения: $compileExtCommand") // Команда загрузки расширения в ИБ - def loadTestExtCommand = VRunner.loadExtCommand(extension) + def loadTestExtCommand = VRunner.loadExtCommand(extension.name) extCommands << loadTestExtCommand Logger.println("Команда загрузки расширения: $loadTestExtCommand") @@ -76,12 +72,11 @@ class Yaxunit implements Serializable { // Готовим конфиг для yaxunit String yaxunitConfigPath = options.configPath - File yaxunitConfigFile = new File("$env.WORKSPACE/$yaxunitConfigPath") if (!steps.fileExists(yaxunitConfigPath)) { def defaultYaxunitConfig = steps.libraryResource DEFAULT_YAXUNIT_CONFIGURATION_RESOURCE - yaxunitConfigFile.write defaultYaxunitConfig + steps.writeFile(options.configPath, defaultYaxunitConfig, 'UTF-8') } - def yaxunitConfig = yaxunitConfigFile.getCanonicalPath() + def yaxunitConfig = FileUtils.getFilePath(yaxunitConfigPath) // Команда запуска тестов String runTestsCommand = "$vrunnerPath run --command RunUnitTests=$yaxunitConfig $ibConnection" diff --git a/test/integration/groovy/jobConfigurationTest.groovy b/test/integration/groovy/jobConfigurationTest.groovy index e3ded0b8..33caabc6 100644 --- a/test/integration/groovy/jobConfigurationTest.groovy +++ b/test/integration/groovy/jobConfigurationTest.groovy @@ -74,5 +74,6 @@ class jobConfigurationTest { rule.assertLogContains("v8version='8.3.12.1500'", run) rule.assertLogContains("sonarScannerToolName='sonar-scanner'", run) rule.assertLogContains("initMethod=FROM_SOURCE", run) + rule.assertLogContains("custom_units", run) } } \ No newline at end of file diff --git a/test/integration/resources/jobConfiguration.json b/test/integration/resources/jobConfiguration.json index 38b207a9..6b3e9d10 100644 --- a/test/integration/resources/jobConfiguration.json +++ b/test/integration/resources/jobConfiguration.json @@ -7,5 +7,7 @@ "initMethod": "fromSource", "path": "/src/cfe/тест" }] + }, + "yaxunit": { } } \ No newline at end of file diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index 6fdc8568..573586dc 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -244,7 +244,7 @@ void call() { } } - stage('Юнит тесты') { + stage('YAXUnit тесты') { agent { label agent1C } From a7523fb94493c79150638e69f957dc158fa0848c Mon Sep 17 00:00:00 2001 From: Dima Date: Mon, 18 Mar 2024 13:50:40 +0300 Subject: [PATCH 06/26] tailor the code to the current develop --- resources/globalConfiguration.json | 6 ---- .../configuration/ConfigurationReader.groovy | 9 ----- .../library/configuration/Extension.groovy | 17 --------- .../configuration/YaxunitOptions.groovy | 15 ++------ .../jenkins/library/steps/Yaxunit.groovy | 35 +------------------ .../jenkins/library/utils/VRunner.groovy | 22 ------------ 6 files changed, 4 insertions(+), 100 deletions(-) delete mode 100644 src/ru/pulsar/jenkins/library/configuration/Extension.groovy diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index 18a8cca0..693f5544 100644 --- a/resources/globalConfiguration.json +++ b/resources/globalConfiguration.json @@ -84,12 +84,6 @@ }, "yaxunit": { "vrunnerSettings": "./tools/vrunner.json", - "extensions": [ - { - "name":"YAXUNIT", - "src": "https://github.com/bia-technologies/yaxunit/releases/download/23.05/YAXUNIT-23.05.cfe" - } - ], "configPath": "./tools/yaxunit.json", "publishToAllureReport": false, "publishToJUnitReport": true diff --git a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy index b3dca8f0..a8c71baf 100644 --- a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy @@ -82,7 +82,6 @@ class ConfigurationReader implements Serializable { mergeObjects(baseConfiguration, configurationToMerge, nonMergeableSettings) mergeInitInfoBaseOptions(baseConfiguration.initInfoBaseOptions, configurationToMerge.initInfoBaseOptions) mergeBddOptions(baseConfiguration.bddOptions, configurationToMerge.bddOptions) - mergeYaxunitOptions(baseConfiguration.yaxunitOptions, configurationToMerge.yaxunitOptions) mergeSyntaxCheckOptions(baseConfiguration.syntaxCheckOptions, configurationToMerge.syntaxCheckOptions) mergeNotificationsOptions(baseConfiguration.notificationsOptions, configurationToMerge.notificationsOptions) @@ -149,14 +148,6 @@ class ConfigurationReader implements Serializable { baseObject.vrunnerSteps = objectToMerge.vrunnerSteps.clone() } - @NonCPS - private static void mergeYaxunitOptions(YaxunitOptions baseObject, YaxunitOptions objectToMerge) { - if (objectToMerge == null || objectToMerge.extensions == null) { - return - } - baseObject.extensions = objectToMerge.extensions.clone() - } - @NonCPS private static void mergeSyntaxCheckOptions(SyntaxCheckOptions baseObject, SyntaxCheckOptions objectToMerge) { if (objectToMerge == null || objectToMerge.checkModes == null) { diff --git a/src/ru/pulsar/jenkins/library/configuration/Extension.groovy b/src/ru/pulsar/jenkins/library/configuration/Extension.groovy deleted file mode 100644 index 51e04d21..00000000 --- a/src/ru/pulsar/jenkins/library/configuration/Extension.groovy +++ /dev/null @@ -1,17 +0,0 @@ -package ru.pulsar.jenkins.library.configuration - -import com.cloudbees.groovy.cps.NonCPS -import com.fasterxml.jackson.annotation.JsonIgnoreProperties - -@JsonIgnoreProperties(ignoreUnknown = true) -class Extension implements Serializable { - String name - String src - - @Override - @NonCPS - String toString() { - return name - } - -} diff --git a/src/ru/pulsar/jenkins/library/configuration/YaxunitOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/YaxunitOptions.groovy index 1001187c..c285fa1a 100644 --- a/src/ru/pulsar/jenkins/library/configuration/YaxunitOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/YaxunitOptions.groovy @@ -2,7 +2,6 @@ package ru.pulsar.jenkins.library.configuration import com.cloudbees.groovy.cps.NonCPS import com.fasterxml.jackson.annotation.JsonIgnoreProperties -import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonPropertyDescription @JsonIgnoreProperties(ignoreUnknown = true) @@ -13,15 +12,6 @@ class YaxunitOptions implements Serializable { """) String vrunnerSettings = "./tools/vrunner.json" - @JsonProperty("extensions") - @JsonPropertyDescription("""Расширения с тестами. - Массив объектов с полями name и src, где - name - имя расширения - src - путь к расширению (к cfe или к исходникам) - По умолчанию содержит один элемент - YAXUNIT версии 23.05. - """) - Extension[] extensions - @JsonPropertyDescription("""Путь к конфигурационному файлу YAXUnit. По умолчанию содержит значение "./tools/yaxunit.json". """) @@ -40,10 +30,11 @@ class YaxunitOptions implements Serializable { @Override @NonCPS String toString() { - return "YaxunitTestOptions{" + + return "YaxunitOptions{" + "vrunnerSettings='" + vrunnerSettings + '\'' + - ", extensions='" + extensions + ", configPath='" + configPath + + ", publishToAllureReport='" + publishToAllureReport + + ", publishToJUnitReport='" + publishToJUnitReport + '}' } } diff --git a/src/ru/pulsar/jenkins/library/steps/Yaxunit.groovy b/src/ru/pulsar/jenkins/library/steps/Yaxunit.groovy index 7549ed10..2587d0bb 100644 --- a/src/ru/pulsar/jenkins/library/steps/Yaxunit.groovy +++ b/src/ru/pulsar/jenkins/library/steps/Yaxunit.groovy @@ -2,7 +2,7 @@ package ru.pulsar.jenkins.library.steps import hudson.FilePath import ru.pulsar.jenkins.library.IStepExecutor -import ru.pulsar.jenkins.library.configuration.Extension + import ru.pulsar.jenkins.library.configuration.JobConfiguration import ru.pulsar.jenkins.library.ioc.ContextRegistry import ru.pulsar.jenkins.library.utils.FileUtils @@ -42,34 +42,6 @@ class Yaxunit implements Serializable { String vrunnerPath = VRunner.getVRunnerPath() String ibConnection = ' --ibconnection "/F./build/ib"' - def extCommands = [] - - // Команда загрузки YAXUnit - def loadYaxunitCommand = VRunner.loadExtCommand("yaxunit") - extCommands << loadYaxunitCommand - - // Команды сборки расширений с тестами и их загрузки в ИБ - for (Extension extension in options.extensions) { - if (extension.src.endsWith('cfe')) { - // Скачиваем расширение - String pathToExtension = "$env.WORKSPACE/build/out/${extension.name}.cfe" - FilePath localPathToExtension = FileUtils.getFilePath(pathToExtension) - Logger.println("Скачивание расширения $extension.name в $localPathToExtension из ${extension.src}") - localPathToExtension.copyFrom(new URL(extension.src)) - } else { - // Команда компиляции в cfe - def compileExtCommand = "$vrunnerPath compileexttocfe --src $extension.src --out build/out/${extension.name}.cfe" - extCommands << compileExtCommand - Logger.println("Команда сборки расширения: $compileExtCommand") - } - - // Команда загрузки расширения в ИБ - def loadTestExtCommand = VRunner.loadExtCommand(extension.name) - extCommands << loadTestExtCommand - Logger.println("Команда загрузки расширения: $loadTestExtCommand") - - } - // Готовим конфиг для yaxunit String yaxunitConfigPath = options.configPath if (!steps.fileExists(yaxunitConfigPath)) { @@ -83,20 +55,15 @@ class Yaxunit implements Serializable { // Переопределяем настройки vrunner String vrunnerSettings = options.vrunnerSettings - String[] extCommandsWithSettings = extCommands if (steps.fileExists(vrunnerSettings)) { String vrunnerSettingsParam = " --settings $vrunnerSettings" - extCommandsWithSettings = extCommands.collect { "$it $vrunnerSettingsParam" } runTestsCommand += vrunnerSettingsParam } // Выполяем команды steps.withEnv(logosConfig) { - for (extCommand in extCommandsWithSettings) { - VRunner.exec(extCommand, true) - } VRunner.exec(runTestsCommand, true) } diff --git a/src/ru/pulsar/jenkins/library/utils/VRunner.groovy b/src/ru/pulsar/jenkins/library/utils/VRunner.groovy index ce065556..ebce6fe4 100644 --- a/src/ru/pulsar/jenkins/library/utils/VRunner.groovy +++ b/src/ru/pulsar/jenkins/library/utils/VRunner.groovy @@ -1,6 +1,5 @@ package ru.pulsar.jenkins.library.utils -import hudson.FilePath import ru.pulsar.jenkins.library.IStepExecutor import ru.pulsar.jenkins.library.ioc.ContextRegistry @@ -40,25 +39,4 @@ class VRunner { return fileContent.contains("\"$settingName\"") } - static String loadExtCommand(String name) { - - IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() - - def env = steps.env() - def vrunnerPath = getVRunnerPath() - - String pathToExt = "$env.WORKSPACE/build/out/${name}.cfe" - FilePath localPathToExt = FileUtils.getFilePath(pathToExt) - - // Команда загрузки расширения - String loadCommand = vrunnerPath + ' run --command "Путь=' + localPathToExt + ';ЗавершитьРаботуСистемы;" --execute ' - String executeParameter = '$runnerRoot/epf/ЗагрузитьРасширениеВРежимеПредприятия.epf' - if (steps.isUnix()) { - executeParameter = '\\' + executeParameter - } - loadCommand += executeParameter - loadCommand += ' --ibconnection "/F./build/ib"' - - return loadCommand - } } From 76c18b429dcfb6abe2422d957431becd72e8e08b Mon Sep 17 00:00:00 2001 From: Dima Date: Mon, 18 Mar 2024 14:53:47 +0300 Subject: [PATCH 07/26] add vrunnerSettings to initInfoBase --- resources/globalConfiguration.json | 3 ++- .../configuration/InitInfoBaseOptions.groovy | 18 ++++++++++++------ .../library/steps/LoadExtensions.groovy | 11 ++++++++--- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/resources/globalConfiguration.json b/resources/globalConfiguration.json index 693f5544..10c9ef90 100644 --- a/resources/globalConfiguration.json +++ b/resources/globalConfiguration.json @@ -42,7 +42,8 @@ "initMethod": "fromStorage", "runMigration": true, "additionalInitializationSteps": [], - "extensions": [] + "extensions": [], + "vrunnerSettings": "./tools/vrunner.json" }, "bdd": { "vrunnerSteps": [ diff --git a/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy index b6614983..8a0e5af6 100644 --- a/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy @@ -14,7 +14,7 @@ class InitInfoBaseOptions implements Serializable { * fromSource - инициализация информационной базы из исходников конфигурации; * defaultBranchFromStorage - инициализация основной ветки из хранилища конфигурации, остальных - из исходников конфигурации. По умолчанию содержит значение "fromStorage".""") - InitInfoBaseMethod initMethod = InitInfoBaseMethod.FROM_STORAGE; + InitInfoBaseMethod initMethod = InitInfoBaseMethod.FROM_STORAGE @JsonPropertyDescription("Запустить миграцию ИБ") Boolean runMigration = true @@ -26,12 +26,17 @@ class InitInfoBaseOptions implements Serializable { String[] additionalInitializationSteps @JsonPropertyDescription("Массив расширений для загрузки в конфигурацию.") - Extension[] extensions; + Extension[] extensions + + @JsonPropertyDescription("""Путь к конфигурационному файлу vanessa-runner. + По умолчанию содержит значение "./tools/vrunner.json". + """) + String vrunnerSettings @JsonIgnoreProperties(ignoreUnknown = true) static class Extension implements Serializable { @JsonPropertyDescription("Имя расширения, используемое при его загрузке в конфигурацию.") - String name = "extension"; + String name = "extension" @JsonPropertyDescription(""" Способ инициализации расширения. @@ -39,14 +44,14 @@ class InitInfoBaseOptions implements Serializable { * fromSource - инициализация расширения из исходников; * fromFile - скачивание скомпилированного cfe по ссылке. """) - InitExtensionMethod initMethod = InitExtensionMethod.SOURCE; + InitExtensionMethod initMethod = InitExtensionMethod.SOURCE @JsonPropertyDescription(""" Хранит в себе путь к расширению. * В случае если выбран initMethod - указывается путь к исходникам расширения. * В случае если выбран initMethod - указывается путь к cfe-файлу """) - String path = "src/cfe/extension"; + String path = "src/cfe/extension" } @Override @@ -57,6 +62,7 @@ class InitInfoBaseOptions implements Serializable { ", runMigration=" + runMigration + ", additionalInitializationSteps=" + additionalInitializationSteps + ", extensions=" + extensions + - '}'; + ", vrunnerSettings=" + vrunnerSettings + + '}' } } diff --git a/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy b/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy index 53be96c6..812ef2e4 100644 --- a/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy +++ b/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy @@ -11,7 +11,7 @@ import ru.pulsar.jenkins.library.utils.FileUtils class LoadExtensions implements Serializable { - private final JobConfiguration config; + private final JobConfiguration config LoadExtensions(JobConfiguration config) { this.config = config @@ -22,10 +22,10 @@ class LoadExtensions implements Serializable { Logger.printLocation() - def env = steps.env(); + def env = steps.env() String cfeDir = "$env.WORKSPACE/$GetExtensions.EXTENSIONS_OUT_DIR" - String vrunnerPath = VRunner.getVRunnerPath(); + String vrunnerPath = VRunner.getVRunnerPath() config.initInfoBaseOptions.extensions.each { Logger.println("Установим расширение ${it.name}") @@ -47,6 +47,11 @@ class LoadExtensions implements Serializable { loadCommand += executeParameter loadCommand += ' --ibconnection "/F./build/ib"' + String vrunnerSettings = config.initInfoBaseOptions.vrunnerSettings + if (steps.fileExists(vrunnerSettings)) { + loadCommand += " --settings $vrunnerSettings" + } + List logosConfig = ["LOGOS_CONFIG=$config.logosConfig"] steps.withEnv(logosConfig) { VRunner.exec(loadCommand) From 13ce9cfcf8d9d6ef1e1b93c575f2a7aeaee17109 Mon Sep 17 00:00:00 2001 From: Dima Date: Mon, 18 Mar 2024 17:24:13 +0300 Subject: [PATCH 08/26] upd README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1837f41d..27f0398e 100644 --- a/README.md +++ b/README.md @@ -133,8 +133,8 @@ pipeline1C() * BDD: * Если в конфигурационном файле проекта не заполнена настройка `bdd` -> `vrunnerSteps`, то автоматически выполняется запуск `vrunner vanessa --settings tools/vrunner.json`. * YAXUnit: - * Необходимо перечислить расширения в `jobConfiguration.json` -> `yaxunit` -> `extensions`. Путь к расширению можно указать либо в виде ссылки на файл cfe, либо в виде пути к исходникам. Пока что поддерживаются только расширения, выгруженные в формате конфигуратора. При переопределении настроек по умолчанию расширение YAXUnit тоже должно быть в этом списке. - * Если ваши тесты находятся в отдельных расширениях, то необходимо скопировать конфиг из текущей библиотеки (`./resources/yaxunit.json`) в свой репозиторий в `./tools/yaxunit.json` и перечислить в нем имена расширений. + * Необходимо указать расширение YAXUnit и дополнительные расширения с тестами (опционально) в `jobConfiguration.json` -> `initInfobase` -> `extensions`. Они будут загружены при инициализации ИБ. + * Если ваши тесты размещены в отдельных расширениях, скопируйте файл `./resources/yaxunit.json` из текущей библиотеки в свой репозиторий (`./tools/yaxunit.json`) и перечислите в нем имена ваших расширений. * Дымовые тесты: * Если в репозитории существует файл `tools/vrunner.json`, то запуск дымовых тестов будет выполняться с передачей файла в параметры запуска `vrunner xunit --settings tools/vrunner.json` (`smoke` -> `vrunnerSettings`). * Если установка локальных зависимостей `opm` установит пакет `add`, то будет использоваться обработка `xddTestRunner.epf` из локальных зависимостей. From 9f0a9221dde718e1e76131455701fad85da251e0 Mon Sep 17 00:00:00 2001 From: Dima Date: Tue, 19 Mar 2024 14:54:33 +0300 Subject: [PATCH 09/26] =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E?= =?UTF-8?q?=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=80=D0=B0=D1=81=D1=88=D0=B8?= =?UTF-8?q?=D1=80=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=BD=D0=B0=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B7=D0=BD=D1=8B=D1=85=20=D1=88=D0=B0=D0=B3=D0=B0=D1=85=20?= =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=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 | 106 +++++++++++++----- 11 files changed, 182 insertions(+), 55 deletions(-) create mode 100644 test/unit/groovy/ru/pulsar/jenkins/library/steps/LoadExtensionsTest.java diff --git a/README.md b/README.md index 27f0398e..9ccab43c 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 e557c92e..1c5dc5eb 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 10c9ef90..693f5544 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 a8c71baf..395da027 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 8a0e5af6..f3edd33b 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 f3a12327..080bc23a 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 812ef2e4..bee3ba8d 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 e7c0e97d..f3fb372f 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 00000000..a350d38b --- /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 78e8b766..6c6d4699 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 573586dc..3b62cff5 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 } + + stage('Загрузка расширений в конфигурацию'){ + when { + beforeAgent true + expression { config.needLoadExtensions('bdd') } + } + steps { + timeout(time: config.timeoutOptions.loadExtensions, unit: TimeUnit.MINUTES) { + loadExtensions config 'bdd' + } + } } - steps { - timeout(time: config.timeoutOptions.bdd, unit: TimeUnit.MINUTES) { - unzipInfobase() - bdd config + 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 } + + stage('Загрузка расширений в конфигурацию') { + when { + beforeAgent true + expression { config.needLoadExtensions('smoke') } + } + steps { + timeout(time: config.timeoutOptions.loadExtensions, unit: TimeUnit.MINUTES) { + loadExtensions config 'smoke' + } + } } - steps { - timeout(time: config.timeoutOptions.smoke, unit: TimeUnit.MINUTES) { - unzipInfobase() - smoke config + 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 } + + stage('Загрузка расширений в конфигурацию') { + when { + beforeAgent true + expression { config.needLoadExtensions('yaxunit') } + } + steps { + timeout(time: config.timeoutOptions.loadExtensions, unit: TimeUnit.MINUTES) { + loadExtensions config 'yaxunit' + } + } } - steps { - timeout(time: config.timeoutOptions.yaxunit, unit: TimeUnit.MINUTES) { - unzipInfobase() - yaxunit 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 + } } } } From 6f422b1e12b3db4c20aff34fb88c497f4d745413 Mon Sep 17 00:00:00 2001 From: Dima Date: Tue, 19 Mar 2024 14:59:03 +0300 Subject: [PATCH 10/26] fix pipeline --- vars/pipeline1C.groovy | 136 +++++++++++++++++++++-------------------- 1 file changed, 69 insertions(+), 67 deletions(-) diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index 3b62cff5..568119c6 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -196,32 +196,33 @@ void call() { } stage('BDD сценарии') { - - stage('Загрузка расширений в конфигурацию'){ - when { - beforeAgent true - expression { config.needLoadExtensions('bdd') } - } - steps { - timeout(time: config.timeoutOptions.loadExtensions, unit: TimeUnit.MINUTES) { - loadExtensions config 'bdd' + agent { + label agent1C + } + when { + beforeAgent true + expression { config.stageFlags.bdd } + } + steps { + 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() + stage('Выполнение BDD сценариев') { + steps { + timeout(time: config.timeoutOptions.bdd, unit: TimeUnit.MINUTES) { + unzipInfobase() - bdd config + bdd config + } } } } @@ -243,65 +244,66 @@ void call() { } stage('Дымовые тесты') { - - stage('Загрузка расширений в конфигурацию') { - when { - beforeAgent true - expression { config.needLoadExtensions('smoke') } - } - steps { - timeout(time: config.timeoutOptions.loadExtensions, unit: TimeUnit.MINUTES) { - loadExtensions config 'smoke' + agent { + label agent1C + } + when { + beforeAgent true + expression { config.stageFlags.smoke } + } + steps { + 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() + stage('Выполнение дымовых тестов') { + steps { + timeout(time: config.timeoutOptions.smoke, unit: TimeUnit.MINUTES) { + unzipInfobase() - smoke config + smoke config + } } } } } stage('YAXUnit тесты') { - - stage('Загрузка расширений в конфигурацию') { - when { - beforeAgent true - expression { config.needLoadExtensions('yaxunit') } - } - steps { - timeout(time: config.timeoutOptions.loadExtensions, unit: TimeUnit.MINUTES) { - loadExtensions config 'yaxunit' + agent { + label agent1C + } + when { + beforeAgent true + expression { config.stageFlags.yaxunit } + } + steps { + 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() + stage('Выполнение YAXUnit тестов') { + steps { + timeout(time: config.timeoutOptions.yaxunit, unit: TimeUnit.MINUTES) { + unzipInfobase() - yaxunit config + yaxunit config + } } } } From 5dba901d3e746365af2b33722ba2083b198d2075 Mon Sep 17 00:00:00 2001 From: Dima Date: Tue, 19 Mar 2024 15:05:28 +0300 Subject: [PATCH 11/26] fix pipeline --- vars/pipeline1C.groovy | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index 568119c6..6b745b37 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -203,7 +203,7 @@ void call() { beforeAgent true expression { config.stageFlags.bdd } } - steps { + stages { stage('Загрузка расширений в конфигурацию') { when { beforeAgent true @@ -251,7 +251,7 @@ void call() { beforeAgent true expression { config.stageFlags.smoke } } - steps { + stages { stage('Загрузка расширений в конфигурацию') { when { beforeAgent true @@ -284,7 +284,7 @@ void call() { beforeAgent true expression { config.stageFlags.yaxunit } } - steps { + stages { stage('Загрузка расширений в конфигурацию') { when { beforeAgent true From d76c8021f8147af073f63549279a32b3cd955a21 Mon Sep 17 00:00:00 2001 From: Dima Date: Tue, 19 Mar 2024 15:10:38 +0300 Subject: [PATCH 12/26] fix pipeline again --- vars/pipeline1C.groovy | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index 6b745b37..2ee3be65 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -211,7 +211,7 @@ void call() { } steps { timeout(time: config.timeoutOptions.loadExtensions, unit: TimeUnit.MINUTES) { - loadExtensions config 'bdd' + loadExtensions config, 'bdd' } } } @@ -259,7 +259,7 @@ void call() { } steps { timeout(time: config.timeoutOptions.loadExtensions, unit: TimeUnit.MINUTES) { - loadExtensions config 'smoke' + loadExtensions config, 'smoke' } } } @@ -292,7 +292,7 @@ void call() { } steps { timeout(time: config.timeoutOptions.loadExtensions, unit: TimeUnit.MINUTES) { - loadExtensions config 'yaxunit' + loadExtensions config, 'yaxunit' } } } From 6efdf8edb7660345f14104f302ac8aabcc8823e0 Mon Sep 17 00:00:00 2001 From: Dima Date: Tue, 19 Mar 2024 15:31:13 +0300 Subject: [PATCH 13/26] fix conf reader --- .../jenkins/library/configuration/ConfigurationReader.groovy | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy index 395da027..51465af4 100644 --- a/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/ConfigurationReader.groovy @@ -65,6 +65,7 @@ class ConfigurationReader implements Serializable { "bddOptions", "sonarQubeOptions", "smokeTestOptions", + "yaxunitOptions", "syntaxCheckOptions", "resultsTransformOptions", "notificationsOptions", From 8cb9103bd3b85482294df33fc7fa3ea6c1ecf59b Mon Sep 17 00:00:00 2001 From: Dima Date: Tue, 19 Mar 2024 16:15:25 +0300 Subject: [PATCH 14/26] fix def --- src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy b/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy index bee3ba8d..8481d8b5 100644 --- a/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy +++ b/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy @@ -26,7 +26,7 @@ class LoadExtensions implements Serializable { Extension[] filteredExtensions - extensions = this.config.initInfoBaseOptions.extensions + def extensions = this.config.initInfoBaseOptions.extensions if (this.stageName) { filteredExtensions = extensions.findAll { extension -> From 63f065062d8284a8d8a3bb639d85d6255a3dc724 Mon Sep 17 00:00:00 2001 From: Dima Date: Tue, 19 Mar 2024 16:23:19 +0300 Subject: [PATCH 15/26] fix add this --- src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy b/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy index 8481d8b5..62fd3e28 100644 --- a/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy +++ b/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy @@ -62,7 +62,7 @@ class LoadExtensions implements Serializable { loadCommand += executeParameter loadCommand += ' --ibconnection "/F./build/ib"' - String vrunnerSettings = getVrunnerSettings(this.config, stageName) + String vrunnerSettings = getVrunnerSettings(this.config, this.stageName) if (steps.fileExists(vrunnerSettings)) { loadCommand += " --settings $vrunnerSettings" } From a2ff5043938389a7e4f9c37efaef77e22c10cf85 Mon Sep 17 00:00:00 2001 From: Dima Date: Tue, 19 Mar 2024 16:52:39 +0300 Subject: [PATCH 16/26] simplify and fix --- .../jenkins/library/steps/LoadExtensions.groovy | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy b/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy index 62fd3e28..58580b90 100644 --- a/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy +++ b/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy @@ -62,7 +62,7 @@ class LoadExtensions implements Serializable { loadCommand += executeParameter loadCommand += ' --ibconnection "/F./build/ib"' - String vrunnerSettings = getVrunnerSettings(this.config, this.stageName) + String vrunnerSettings = getVrunnerSettings() if (steps.fileExists(vrunnerSettings)) { loadCommand += " --settings $vrunnerSettings" } @@ -73,11 +73,15 @@ class LoadExtensions implements Serializable { } } - private static String getVrunnerSettings(JobConfiguration jobConfiguration, String stageName) { + private static String getVrunnerSettings() { - String optionsName = "${stageName.toLowerCase()}Options" + if (!this.stageName) { + return "" + } + + String optionsName = "${this.stageName.toLowerCase()}Options" - def optionsInstance = jobConfiguration."$optionsName" + def optionsInstance = this.config."$optionsName" if (optionsInstance) { return optionsInstance."vrunnerSettings" From fef2c1a8f925b678f910888b205a1a6e0fa863d5 Mon Sep 17 00:00:00 2001 From: Dima Date: Tue, 19 Mar 2024 17:08:18 +0300 Subject: [PATCH 17/26] revert static --- .../pulsar/jenkins/library/steps/LoadExtensions.groovy | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy b/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy index 58580b90..ddec66e5 100644 --- a/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy +++ b/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy @@ -62,7 +62,7 @@ class LoadExtensions implements Serializable { loadCommand += executeParameter loadCommand += ' --ibconnection "/F./build/ib"' - String vrunnerSettings = getVrunnerSettings() + String vrunnerSettings = getVrunnerSettings(this.config, this.stageName) if (steps.fileExists(vrunnerSettings)) { loadCommand += " --settings $vrunnerSettings" } @@ -73,15 +73,15 @@ class LoadExtensions implements Serializable { } } - private static String getVrunnerSettings() { + private static String getVrunnerSettings(JobConfiguration config, String stageName) { - if (!this.stageName) { + if (!stageName) { return "" } - String optionsName = "${this.stageName.toLowerCase()}Options" + String optionsName = "${stageName.toLowerCase()}Options" - def optionsInstance = this.config."$optionsName" + def optionsInstance = config."$optionsName" if (optionsInstance) { return optionsInstance."vrunnerSettings" From 512fd5e90c09a97c60024c271b155fe01b7b138b Mon Sep 17 00:00:00 2001 From: Dima Date: Tue, 19 Mar 2024 17:15:13 +0300 Subject: [PATCH 18/26] fix empty vrunnerSettings --- src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy b/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy index ddec66e5..dcb406b6 100644 --- a/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy +++ b/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy @@ -63,7 +63,7 @@ class LoadExtensions implements Serializable { loadCommand += ' --ibconnection "/F./build/ib"' String vrunnerSettings = getVrunnerSettings(this.config, this.stageName) - if (steps.fileExists(vrunnerSettings)) { + if (vrunnerSettings && steps.fileExists(vrunnerSettings)) { loadCommand += " --settings $vrunnerSettings" } From 876009dee8682175f05d06bac895d69fda5c4be5 Mon Sep 17 00:00:00 2001 From: Dima Date: Tue, 19 Mar 2024 18:04:32 +0300 Subject: [PATCH 19/26] unzipInfobase before loadExtensions --- vars/pipeline1C.groovy | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index 2ee3be65..967fb624 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -204,6 +204,10 @@ void call() { expression { config.stageFlags.bdd } } stages { + stage('Распаковка ИБ') { + unzipInfobase() + } + stage('Загрузка расширений в конфигурацию') { when { beforeAgent true @@ -219,8 +223,6 @@ void call() { stage('Выполнение BDD сценариев') { steps { timeout(time: config.timeoutOptions.bdd, unit: TimeUnit.MINUTES) { - unzipInfobase() - bdd config } } @@ -252,6 +254,10 @@ void call() { expression { config.stageFlags.smoke } } stages { + stage('Распаковка ИБ') { + unzipInfobase() + } + stage('Загрузка расширений в конфигурацию') { when { beforeAgent true @@ -267,8 +273,6 @@ void call() { stage('Выполнение дымовых тестов') { steps { timeout(time: config.timeoutOptions.smoke, unit: TimeUnit.MINUTES) { - unzipInfobase() - smoke config } } @@ -285,6 +289,10 @@ void call() { expression { config.stageFlags.yaxunit } } stages { + stage('Распаковка ИБ') { + unzipInfobase() + } + stage('Загрузка расширений в конфигурацию') { when { beforeAgent true @@ -300,8 +308,6 @@ void call() { stage('Выполнение YAXUnit тестов') { steps { timeout(time: config.timeoutOptions.yaxunit, unit: TimeUnit.MINUTES) { - unzipInfobase() - yaxunit config } } From c5f0b221ac60883cfdcb0021aeaf280a6a3a9be9 Mon Sep 17 00:00:00 2001 From: Dima Date: Tue, 19 Mar 2024 18:18:02 +0300 Subject: [PATCH 20/26] add steps {} --- vars/pipeline1C.groovy | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/vars/pipeline1C.groovy b/vars/pipeline1C.groovy index 967fb624..1cd323b0 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -205,7 +205,9 @@ void call() { } stages { stage('Распаковка ИБ') { - unzipInfobase() + steps { + unzipInfobase() + } } stage('Загрузка расширений в конфигурацию') { @@ -255,7 +257,9 @@ void call() { } stages { stage('Распаковка ИБ') { - unzipInfobase() + steps { + unzipInfobase() + } } stage('Загрузка расширений в конфигурацию') { @@ -290,7 +294,9 @@ void call() { } stages { stage('Распаковка ИБ') { - unzipInfobase() + steps { + unzipInfobase() + } } stage('Загрузка расширений в конфигурацию') { From ec462505803281b13db0b98f554475c4d6d7e3d5 Mon Sep 17 00:00:00 2001 From: Dima Date: Tue, 19 Mar 2024 18:38:00 +0300 Subject: [PATCH 21/26] stash and unstash extensions --- src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy | 4 ++++ vars/unzipInfobase.groovy | 3 +++ 2 files changed, 7 insertions(+) diff --git a/src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy b/src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy index cf52e90a..68bd9502 100644 --- a/src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy +++ b/src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy @@ -13,6 +13,7 @@ import ru.pulsar.jenkins.library.utils.FileUtils class GetExtensions implements Serializable { + public static final String EXTENSIONS_STASH = 'extensions' public static final String EXTENSIONS_OUT_DIR = 'build/out/cfe' private final JobConfiguration config; @@ -58,6 +59,9 @@ class GetExtensions implements Serializable { Logger.println("Неизвестный метод инициализации расширения ${it.name}") } } + + steps.stash(EXTENSIONS_STASH, "$EXTENSIONS_OUT_DIR/**", true) + } private void buildExtension(Extension extension, String srcDir, String vrunnerPath, IStepExecutor steps) { diff --git a/vars/unzipInfobase.groovy b/vars/unzipInfobase.groovy index cb3fdfda..27c74f4a 100644 --- a/vars/unzipInfobase.groovy +++ b/vars/unzipInfobase.groovy @@ -1,4 +1,7 @@ +import ru.pulsar.jenkins.library.steps.GetExtensions + def call() { unstash '1Cv8.1CD.zip' unzip dir: 'build/ib', zipFile: '1Cv8.1CD.zip' + unstash GetExtensions.EXTENSIONS_STASH } \ No newline at end of file From 3f6ec51cd00544f3ea31969085192c8d9f4cb702 Mon Sep 17 00:00:00 2001 From: Dima Date: Thu, 28 Mar 2024 16:42:13 +0300 Subject: [PATCH 22/26] bump mockito, add tests, fix errors --- build.gradle.kts | 2 +- resources/schema.json | 711 +++++++++--------- .../configuration/InitInfoBaseOptions.groovy | 1 - .../library/steps/LoadExtensions.groovy | 18 +- .../groovy/jobConfigurationTest.groovy | 3 +- .../library/steps/LoadExtensionsTest.java | 44 +- .../jenkins/library/utils/EnvUtils.java | 32 + .../jenkins/library/utils/TestUtils.java | 2 + test/unit/resources/jobConfiguration.json | 14 + 9 files changed, 443 insertions(+), 384 deletions(-) create mode 100644 test/unit/groovy/ru/pulsar/jenkins/library/utils/EnvUtils.java diff --git a/build.gradle.kts b/build.gradle.kts index 1c5dc5eb..afd047aa 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -48,7 +48,7 @@ dependencies { testRuntimeOnly("org.junit.jupiter", "junit-jupiter-engine", junitVersion) testImplementation("org.assertj", "assertj-core", "3.15.0") - testImplementation("org.mockito", "mockito-core", "3.3.3") + testImplementation("org.mockito", "mockito-core", "5.11.0") testImplementation("org.slf4j", "slf4j-api", slf4jVersion) testImplementation("org.slf4j", "slf4j-simple", slf4jVersion) diff --git a/resources/schema.json b/resources/schema.json index 500468b1..326c1e0a 100644 --- a/resources/schema.json +++ b/resources/schema.json @@ -1,436 +1,437 @@ { - "type": "object", - "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:JobConfiguration", - "properties": { - "v8version": { - "type": "string", - "description": "Версия платформы 1С:Предприятие в формате 8.3.хх.хххх." + "type" : "object", + "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:JobConfiguration", + "properties" : { + "v8version" : { + "type" : "string", + "description" : "Версия платформы 1С:Предприятие в формате 8.3.хх.хххх." }, - "edtVersion": { - "type": "string", - "description": "Версия модуля 1C:Enterprise Development Tools формате xxxx.x.x:x86_64" + "edtVersion" : { + "type" : "string", + "description" : "Версия модуля 1C:Enterprise Development Tools формате xxxx.x.x:x86_64" }, - "srcDir": { - "type": "string", - "description": "Путь к корневому каталогу с исходниками конфигурации, в случае хранения исходников в формате EDT, необходимо указать путь к проекту" + "srcDir" : { + "type" : "string", + "description" : "Путь к корневому каталогу с исходниками конфигурации, в случае хранения исходников в формате EDT, необходимо указать путь к проекту" }, - "sourceFormat": { - "type": "string", - "description": "Формат исходников конфигурации", - "enum": ["edt", "designer"] + "sourceFormat" : { + "type" : "string", + "description" : "Формат исходников конфигурации", + "enum" : [ "edt", "designer" ] }, - "defaultBranch": { - "type": "string", - "description": "Имя ветки по умолчанию. Значение по умолчанию - main." + "defaultBranch" : { + "type" : "string", + "description" : "Имя ветки по умолчанию. Значение по умолчанию - main." }, - "secrets": { - "type": "object", - "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:Secrets", - "description": "Идентификаторы сохраненных секретов", - "properties": { - "storagePath": { - "type": "string", - "description": "Путь к хранилищу конфигурации" - }, - "storage": { - "type": "string", - "description": "Данные авторизации в хранилище конфигурации" - }, - "telegramChatId": { - "type": "string", - "description": "Идентификатор telegram-чата для отправки уведомлений" - }, - "telegramBotToken": { - "type": "string", - "description": "Токен авторизации telegram-бота для отправки уведомлений" + "secrets" : { + "type" : "object", + "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:Secrets", + "description" : "Идентификаторы сохраненных секретов", + "properties" : { + "storagePath" : { + "type" : "string", + "description" : "Путь к хранилищу конфигурации" + }, + "storage" : { + "type" : "string", + "description" : "Данные авторизации в хранилище конфигурации" + }, + "telegramChatId" : { + "type" : "string", + "description" : "Идентификатор telegram-чата для отправки уведомлений" + }, + "telegramBotToken" : { + "type" : "string", + "description" : "Токен авторизации telegram-бота для отправки уведомлений" } } }, - "stages": { - "type": "object", - "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:StageFlags", - "description": "Включение этапов сборок", - "properties": { - "sonarqube": { - "type": "boolean", - "description": "Анализ SonarQube включен" - }, - "syntaxCheck": { - "type": "boolean", - "description": "Синтаксический контроль включен" - }, - "edtValidate": { - "type": "boolean", - "description": "Валидация EDT включена" - }, - "smoke": { - "type": "boolean", - "description": "Дымовые тесты включены" - }, - "yaxunit": { - "type": "boolean", + "stages" : { + "type" : "object", + "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:StageFlags", + "description" : "Включение этапов сборок", + "properties" : { + "sonarqube" : { + "type" : "boolean", + "description" : "Анализ SonarQube включен" + }, + "syntaxCheck" : { + "type" : "boolean", + "description" : "Синтаксический контроль включен" + }, + "edtValidate" : { + "type" : "boolean", + "description" : "Валидация EDT включена" + }, + "smoke" : { + "type" : "boolean", + "description" : "Дымовые тесты включены" + }, + "yaxunit" : { + "type" : "boolean", "description" : "Запуск YAXUnit тестов включен" }, - "initSteps": { - "type": "boolean", - "description": "Предварительные шаги инициализации включены" + "initSteps" : { + "type" : "boolean", + "description" : "Предварительные шаги инициализации включены" }, - "bdd": { - "type": "boolean", - "description": "Запуск BDD сценариев включен" + "bdd" : { + "type" : "boolean", + "description" : "Запуск BDD сценариев включен" }, - "email": { - "type": "boolean", - "description": "Выполнять рассылку результатов сборки на email" + "email" : { + "type" : "boolean", + "description" : "Выполнять рассылку результатов сборки на email" }, - "telegram": { - "type": "boolean", - "description": "Выполнять рассылку результатов сборки в telegram" + "telegram" : { + "type" : "boolean", + "description" : "Выполнять рассылку результатов сборки в telegram" } } }, - "timeout": { - "type": "object", - "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:TimeoutOptions", - "description": "Настройка таймаутов для шагов", - "properties": { - "edtToDesignerFormatTransformation": { - "type": "integer", - "description": "Таймаут шага трансформации исходников из формата EDT в формат Конфигуратора, в минутах.\n По умолчанию содержит значение 60.\n " - }, - "getBinaries": { - "type": "integer", - "description": "Таймаут шага получения бинарников, в минутах.\n По умолчанию содержит значение 60.\n " - }, - "createInfoBase": { - "type": "integer", - "description": "Таймаут шага создания информационной базы, в минутах.\n По умолчанию содержит значение 60.\n " - }, - "initInfoBase": { - "type": "integer", - "description": "Таймаут шага инициализации информационной базы, в минутах.\n По умолчанию содержит значение 60.\n " - }, - "loadExtensions": { - "type": "integer", - "description": "Таймаут шага загрузки расширений в базу, в минутах.\n По умолчанию содержит значение 60.\n " - }, - "zipInfoBase": { - "type": "integer", - "description": "Таймаут шага архивирования информационной базы, в минутах.\n По умолчанию содержит значение 60.\n " - }, - "designerToEdtFormatTransformation": { - "type": "integer", - "description": "Таймаут шага трансформации исходников из формата Конфигуратора в формат EDT, в минутах.\n По умолчанию содержит значение 60.\n " - }, - "edtValidate": { - "type": "integer", - "description": "Таймаут шага валидации EDT, в минутах.\n По умолчанию содержит значение 240.\n " - }, - "resultTransformation": { - "type": "integer", - "description": "Таймаут шага трансформации результатов EDT, в минутах.\n По умолчанию содержит значение 10.\n " - }, - "bdd": { - "type": "integer", - "description": "Таймаут шага проверки сценариев поведения, в минутах.\n По умолчанию содержит значение 120.\n " - }, - "syntaxCheck": { - "type": "integer", - "description": "Таймаут шага синтаксического контроля, в минутах.\n По умолчанию содержит значение 240.\n " - }, - "smoke": { - "type": "integer", - "description": "Таймаут шага дымовых тестов, в минутах.\n По умолчанию содержит значение 240.\n " - }, - "yaxunit": { - "type": "integer", + "timeout" : { + "type" : "object", + "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:TimeoutOptions", + "description" : "Настройка таймаутов для шагов", + "properties" : { + "edtToDesignerFormatTransformation" : { + "type" : "integer", + "description" : "Таймаут шага трансформации исходников из формата EDT в формат Конфигуратора, в минутах.\n По умолчанию содержит значение 60.\n " + }, + "getBinaries" : { + "type" : "integer", + "description" : "Таймаут шага получения бинарников, в минутах.\n По умолчанию содержит значение 60.\n " + }, + "createInfoBase" : { + "type" : "integer", + "description" : "Таймаут шага создания информационной базы, в минутах.\n По умолчанию содержит значение 60.\n " + }, + "initInfoBase" : { + "type" : "integer", + "description" : "Таймаут шага инициализации информационной базы, в минутах.\n По умолчанию содержит значение 60.\n " + }, + "loadExtensions" : { + "type" : "integer", + "description" : "Таймаут шага загрузки расширений в базу, в минутах.\n По умолчанию содержит значение 60.\n " + }, + "zipInfoBase" : { + "type" : "integer", + "description" : "Таймаут шага архивирования информационной базы, в минутах.\n По умолчанию содержит значение 60.\n " + }, + "designerToEdtFormatTransformation" : { + "type" : "integer", + "description" : "Таймаут шага трансформации исходников из формата Конфигуратора в формат EDT, в минутах.\n По умолчанию содержит значение 60.\n " + }, + "edtValidate" : { + "type" : "integer", + "description" : "Таймаут шага валидации EDT, в минутах.\n По умолчанию содержит значение 240.\n " + }, + "resultTransformation" : { + "type" : "integer", + "description" : "Таймаут шага трансформации результатов EDT, в минутах.\n По умолчанию содержит значение 10.\n " + }, + "bdd" : { + "type" : "integer", + "description" : "Таймаут шага проверки сценариев поведения, в минутах.\n По умолчанию содержит значение 120.\n " + }, + "syntaxCheck" : { + "type" : "integer", + "description" : "Таймаут шага синтаксического контроля, в минутах.\n По умолчанию содержит значение 240.\n " + }, + "smoke" : { + "type" : "integer", + "description" : "Таймаут шага дымовых тестов, в минутах.\n По умолчанию содержит значение 240.\n " + }, + "yaxunit" : { + "type" : "integer", "description" : "Таймаут шага YAXUnit тестов, в минутах.\n По умолчанию содержит значение 240.\n " }, - "sonarqube": { - "type": "integer", - "description": "Таймаут шага статического анализа SonarQube, в минутах.\n По умолчанию содержит значение 90.\n " + "sonarqube" : { + "type" : "integer", + "description" : "Таймаут шага статического анализа SonarQube, в минутах.\n По умолчанию содержит значение 90.\n " } } }, - "initInfobase": { - "type": "object", - "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:InitInfoBaseOptions", - "description": "Настройки шага инициализации ИБ", - "properties": { - "initMethod": { - "type": "string", - "description": "\n Способ инициализации информационной базы.\n Поддерживается три варианта:\n * fromStorage - инициализация информационной базы из хранилища конфигурации;\n * fromSource - инициализация информационной базы из исходников конфигурации;\n * defaultBranchFromStorage - инициализация основной ветки из хранилища конфигурации, остальных - из исходников конфигурации.\n По умолчанию содержит значение \"fromStorage\".", - "enum": ["fromStorage", "fromSource", "defaultBranchFromStorage"] - }, - "runMigration": { - "type": "boolean", - "description": "Запустить миграцию ИБ" - }, - "additionalInitializationSteps": { - "type": "array", - "description": "Дополнительные шаги, запускаемые через vrunner.\n В каждой строке передается отдельная команда \n vrunner и ее аргументы (например, \"vanessa --settings ./tools/vrunner.first.json\")\n ", - "items": { - "type": "string" + "initInfobase" : { + "type" : "object", + "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:InitInfoBaseOptions", + "description" : "Настройки шага инициализации ИБ", + "properties" : { + "initMethod" : { + "type" : "string", + "description" : "\n Способ инициализации информационной базы.\n Поддерживается три варианта:\n * fromStorage - инициализация информационной базы из хранилища конфигурации;\n * fromSource - инициализация информационной базы из исходников конфигурации;\n * defaultBranchFromStorage - инициализация основной ветки из хранилища конфигурации, остальных - из исходников конфигурации.\n По умолчанию содержит значение \"fromStorage\".", + "enum" : [ "fromStorage", "fromSource", "defaultBranchFromStorage" ] + }, + "runMigration" : { + "type" : "boolean", + "description" : "Запустить миграцию ИБ" + }, + "additionalInitializationSteps" : { + "type" : "array", + "description" : "Дополнительные шаги, запускаемые через vrunner.\n В каждой строке передается отдельная команда \n vrunner и ее аргументы (например, \"vanessa --settings ./tools/vrunner.first.json\")\n ", + "items" : { + "type" : "string" } }, - "extensions": { - "type": "array", - "description": "Массив расширений для загрузки в конфигурацию.", - "items": { - "type": "object", - "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:InitInfoBaseOptions:extensions:exception", - "description": "Информация о расширении для загрузки", - "properties": { - "name": { - "type": "string", - "description": "Имя расширения с которым оно грузится в конфигурацию" + "extensions" : { + "type" : "array", + "description" : "Массив расширений для загрузки в конфигурацию.", + "items" : { + "type" : "object", + "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:InitInfoBaseOptions:Extension", + "properties" : { + "name" : { + "type" : "string", + "description" : "Имя расширения, используемое при его загрузке в конфигурацию." }, - "initMethod": { - "type": "string", - "description": "\n Способ инициализации расширения.\n Поддерживается два варианта:\n * fromSource - инициализация расширения из исходников;\n * fromFile - использование скомпилированного cfe.", - "enum": ["fromSource", "fromFile"] + "initMethod" : { + "type" : "string", + "description" : "\n Способ инициализации расширения.\n Поддерживается два варианта:\n * fromSource - инициализация расширения из исходников;\n * fromFile - скачивание скомпилированного cfe по ссылке.\n ", + "enum" : [ "fromSource", "fromFile" ] }, - "path": { - "type": "string", - "description": "Хранит в себе путь к расширению.\n * В случае если выбран initMethod - указывается путь к исходникам расширения.\n * В случае если выбран initMethod - указывается путь к cfe-файлу" + "path" : { + "type" : "string", + "description" : "\n Путь к расширению.\n * В случае если выбран initMethod - указывается путь к исходникам расширения.\n * В случае если выбран initMethod - указывается путь к cfe-файлу\n " + }, + "stages" : { + "type" : "array", + "description" : "\n Шаги, на которых необходимо использовать расширение\n * Если не заполнено, то расширение будет подключено при инициализации базы и останется в базе на всех последующих шагах.\n * Если заполнено, то расширение будет подключено только на соответствующих шагах.\n ", + "items" : { + "type" : "string" + } } } } } } }, - "bdd": { - "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" + "bdd" : { + "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" } } } }, - "sonarqube": { - "type": "object", - "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:SonarQubeOptions", - "description": "Настройки анализа SonarQube", - "properties": { - "sonarQubeInstallation": { - "type": "string", - "description": "Имя настроенного SonarQube-сервера (SonarQube installations).\nЕсли настроен только один сервер, то может быть оставлено пустым." - }, - "useSonarScannerFromPath": { - "type": "boolean", - "description": "Использовать sonar-scanner, доступный в PATH" - }, - "sonarScannerToolName": { - "type": "string", - "description": "Имя настроенной утилиты sonar-scanner.\nПрименяется, если useSonarScannerFromPath установлено в false." - }, - "infoBaseUpdateModuleName": { - "type": "string", - "description": "Имя общего модуля (например, ОбновлениеИнформационнойБазыXXX), в котором указана версия библиотеки.\n Версия должна задаваться в виде присвоения `Описание.Версия = \"ваш номер версии\";`\n " - }, - "branchAnalysisConfiguration": { - "type": "string", - "description": "Вариант конфигурации branch plugin.\n Поддерживаемые варианты:\n * auto - применяется автоконфигурация sonar-scanner силами branchplugin. Так же может применяться для отключения конфигурирования, если branch plugin отсутствует;\n * fromEnv - применяется ручная конфигурация sonar-scanner на основе переменных среды.\n Значение по умолчанию: fromEnv.", - "enum": ["auto", "fromEnv"] - }, - "waitForQualityGate": { - "type": "boolean", - "description": "Ожидать состояние Quality Gate от SonarQube после загрузки анализа. По умолчанию `false`.\n Таймаут ожидания состояния равен таймауту шага.\n " + "sonarqube" : { + "type" : "object", + "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:SonarQubeOptions", + "description" : "Настройки анализа SonarQube", + "properties" : { + "sonarQubeInstallation" : { + "type" : "string", + "description" : "Имя настроенного SonarQube-сервера (SonarQube installations).\nЕсли настроен только один сервер, то может быть оставлено пустым." + }, + "useSonarScannerFromPath" : { + "type" : "boolean", + "description" : "Использовать sonar-scanner, доступный в PATH" + }, + "sonarScannerToolName" : { + "type" : "string", + "description" : "Имя настроенной утилиты sonar-scanner.\nПрименяется, если useSonarScannerFromPath установлено в false." + }, + "infoBaseUpdateModuleName" : { + "type" : "string", + "description" : "Имя общего модуля (например, ОбновлениеИнформационнойБазыXXX), в котором указана версия библиотеки.\n Версия должна задаваться в виде присвоения `Описание.Версия = \"ваш номер версии\";`\n " + }, + "branchAnalysisConfiguration" : { + "type" : "string", + "description" : "Вариант конфигурации branch plugin.\n Поддерживаемые варианты:\n * auto - применяется автоконфигурация sonar-scanner силами branchplugin. Так же может применяться для отключения конфигурирования, если branch plugin отсутствует;\n * fromEnv - применяется ручная конфигурация sonar-scanner на основе переменных среды.\n Значение по умолчанию: fromEnv.", + "enum" : [ "auto", "fromEnv" ] + }, + "waitForQualityGate" : { + "type" : "boolean", + "description" : "Ожидать состояние Quality Gate от SonarQube после загрузки анализа. По умолчанию `false`.\n Таймаут ожидания состояния равен таймауту шага.\n " } } }, - "syntaxCheck": { - "type": "object", - "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:SyntaxCheckOptions", - "description": "Настройки синтаксического контроля", - "properties": { - "pathToJUnitReport": { - "type": "string", - "description": "Путь к файлу отчета jUnit\n По умолчанию содержит значение \"./build/out/jUnit/syntax.xml\"\n " - }, - "groupErrorsByMetadata": { - "type": "boolean", - "description": "Группировать выявленные ошибки по объектам метаданных.\n По умолчанию включено.\n " - }, - "checkModes": { - "type": "array", - "description": "Режимы проверки конфигурации", - "items": { - "type": "string" + "syntaxCheck" : { + "type" : "object", + "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:SyntaxCheckOptions", + "description" : "Настройки синтаксического контроля", + "properties" : { + "pathToJUnitReport" : { + "type" : "string", + "description" : "Путь к файлу отчета jUnit\n По умолчанию содержит значение \"./build/out/jUnit/syntax.xml\"\n " + }, + "groupErrorsByMetadata" : { + "type" : "boolean", + "description" : "Группировать выявленные ошибки по объектам метаданных.\n По умолчанию включено.\n " + }, + "checkModes" : { + "type" : "array", + "description" : "Режимы проверки конфигурации", + "items" : { + "type" : "string" } }, - "exceptionFile": { - "type": "string", - "description": "Путь к файлу с указанием пропускаемых ошибок.\n Формат файла: в каждой строке файла указан текст пропускаемого исключения или его часть\n Кодировка: UTF-8\n " + "exceptionFile" : { + "type" : "string", + "description" : "Путь к файлу с указанием пропускаемых ошибок.\n Формат файла: в каждой строке файла указан текст пропускаемого исключения или его часть\n Кодировка: UTF-8\n " }, - "vrunnerSettings": { - "type": "string", - "description": "Путь к конфигурационному файлу vanessa-runner.\n По умолчанию содержит значение \"./tools/vrunner.json\".\n " + "vrunnerSettings" : { + "type" : "string", + "description" : "Путь к конфигурационному файлу vanessa-runner.\n По умолчанию содержит значение \"./tools/vrunner.json\".\n " } } }, - "smoke": { - "type": "object", - "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:SmokeTestOptions", - "description": "Настройки дымового тестирования", - "properties": { - "vrunnerSettings": { - "type": "string", - "description": "Путь к конфигурационному файлу vanessa-runner.\n По умолчанию содержит значение \"./tools/vrunner.json\".\n " - }, - "xddConfigPath": { - "type": "string", - "description": "Путь к конфигурационному файлу для xddTestRunner.\n По умолчанию содержит значение \"./tools/xUnitParams.json\".\n " - }, - "publishToAllureReport": { - "type": "boolean", - "description": "Выполнять публикацию результатов в отчет Allure.\n По умолчанию выключено.\n " - }, - "publishToJUnitReport": { - "type": "boolean", - "description": "Выполнять публикацию результатов в отчет JUnit.\n По умолчанию включено.\n " + "smoke" : { + "type" : "object", + "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:SmokeTestOptions", + "description" : "Настройки дымового тестирования", + "properties" : { + "vrunnerSettings" : { + "type" : "string", + "description" : "Путь к конфигурационному файлу vanessa-runner.\n По умолчанию содержит значение \"./tools/vrunner.json\".\n " + }, + "xddConfigPath" : { + "type" : "string", + "description" : "Путь к конфигурационному файлу для xddTestRunner.\n По умолчанию содержит значение \"./tools/xUnitParams.json\".\n " + }, + "publishToAllureReport" : { + "type" : "boolean", + "description" : "Выполнять публикацию результатов в отчет Allure.\n По умолчанию выключено.\n " + }, + "publishToJUnitReport" : { + "type" : "boolean", + "description" : "Выполнять публикацию результатов в отчет JUnit.\n По умолчанию включено.\n " } } }, - "yaxunit": { - "type": "object", - "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:YaxunitOptions", + "yaxunit" : { + "type" : "object", + "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:YaxunitOptions", "description" : "Настройки YAXUnit", - "properties": { - "vrunnerSettings": { - "type": "string", - "description": "Путь к конфигурационному файлу vanessa-runner.\n По умолчанию содержит значение \"./tools/vrunner.json\".\n " - }, - "configPath": { - "type": "string", - "description": "Путь к конфигурационному файлу YAXUnit.\n По умолчанию содержит значение \"./tools/yaxunit.json\".\n " - }, - "publishToAllureReport": { - "type": "boolean", - "description": "Выполнять публикацию результатов в отчет Allure.\n По умолчанию выключено.\n " - }, - "publishToJUnitReport": { - "type": "boolean", - "description": "Выполнять публикацию результатов в отчет JUnit.\n По умолчанию включено.\n " + "properties" : { + "vrunnerSettings" : { + "type" : "string", + "description" : "Путь к конфигурационному файлу vanessa-runner.\n По умолчанию содержит значение \"./tools/vrunner.json\".\n " + }, + "configPath" : { + "type" : "string", + "description" : "Путь к конфигурационному файлу YAXUnit.\n По умолчанию содержит значение \"./tools/yaxunit.json\".\n " + }, + "publishToAllureReport" : { + "type" : "boolean", + "description" : "Выполнять публикацию результатов в отчет Allure.\n По умолчанию выключено.\n " + }, + "publishToJUnitReport" : { + "type" : "boolean", + "description" : "Выполнять публикацию результатов в отчет JUnit.\n По умолчанию включено.\n " } } }, - "resultsTransform": { - "type": "object", - "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:ResultsTransformOptions", - "description": "Настройки трансформации результатов анализа", - "properties": { - "removeSupport": { - "type": "boolean", - "description": "Фильтровать замечания по уровню поддержки модуля. По умолчанию включено." - }, - "supportLevel": { - "type": "integer", - "description": "Настройка фильтрации замечаний по уровню поддержки.\n 0 - удалить файлы на замке;\n 1 - удалить файлы на замке и на поддержке;\n 2 - удалить файлы на замке, на поддержке и снятые с поддержки.\n " + "resultsTransform" : { + "type" : "object", + "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:ResultsTransformOptions", + "description" : "Настройки трансформации результатов анализа", + "properties" : { + "removeSupport" : { + "type" : "boolean", + "description" : "Фильтровать замечания по уровню поддержки модуля. По умолчанию включено." + }, + "supportLevel" : { + "type" : "integer", + "description" : "Настройка фильтрации замечаний по уровню поддержки.\n 0 - удалить файлы на замке;\n 1 - удалить файлы на замке и на поддержке;\n 2 - удалить файлы на замке, на поддержке и снятые с поддержки.\n " } } }, - "notifications": { - "type": "object", - "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:NotificationsOptions", - "description": "Настройки рассылки результатов сборки", - "properties": { - "email": { - "type": "object", - "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:EmailNotificationOptions", - "description": "Настройки рассылки результатов сборки через email", - "properties": { - "onAlways": { - "type": "boolean", - "description": "Отправлять всегда" + "notifications" : { + "type" : "object", + "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:NotificationsOptions", + "description" : "Настройки рассылки результатов сборки", + "properties" : { + "email" : { + "type" : "object", + "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:EmailNotificationOptions", + "description" : "Настройки рассылки результатов сборки через email", + "properties" : { + "onAlways" : { + "type" : "boolean", + "description" : "Отправлять всегда" }, - "onSuccess": { - "type": "boolean", - "description": "Отправлять при успешной сборке" + "onSuccess" : { + "type" : "boolean", + "description" : "Отправлять при успешной сборке" }, - "onFailure": { - "type": "boolean", - "description": "Отправлять при падении сборки" + "onFailure" : { + "type" : "boolean", + "description" : "Отправлять при падении сборки" }, - "onUnstable": { - "type": "boolean", - "description": "Отправлять при нестабильной сборке" + "onUnstable" : { + "type" : "boolean", + "description" : "Отправлять при нестабильной сборке" }, - "alwaysOptions": { - "type": "object", - "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:email:EmailExtConfiguration", - "properties": { - "attachLog": { - "type": "boolean" + "alwaysOptions" : { + "type" : "object", + "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:email:EmailExtConfiguration", + "properties" : { + "attachLog" : { + "type" : "boolean" }, - "directRecipients": { - "type": "array", - "items": { - "type": "string" + "directRecipients" : { + "type" : "array", + "items" : { + "type" : "string" } }, - "recipientProviders": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "developers", - "requestor", - "brokenBuildSuspects", - "brokenTestsSuspects" - ] + "recipientProviders" : { + "type" : "array", + "items" : { + "type" : "string", + "enum" : [ "developers", "requestor", "brokenBuildSuspects", "brokenTestsSuspects" ] } } } }, - "successOptions": { - "type": "object", - "$ref": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:email:EmailExtConfiguration" + "successOptions" : { + "type" : "object", + "$ref" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:email:EmailExtConfiguration" }, - "failureOptions": { - "type": "object", - "$ref": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:email:EmailExtConfiguration" + "failureOptions" : { + "type" : "object", + "$ref" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:email:EmailExtConfiguration" }, - "unstableOptions": { - "type": "object", - "$ref": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:email:EmailExtConfiguration" + "unstableOptions" : { + "type" : "object", + "$ref" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:email:EmailExtConfiguration" } } }, - "telegram": { - "type": "object", - "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:TelegramNotificationOptions", - "description": "Настройки рассылки результатов сборки через telegram", - "properties": { - "onAlways": { - "type": "boolean", - "description": "Отправлять всегда" + "telegram" : { + "type" : "object", + "id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:TelegramNotificationOptions", + "description" : "Настройки рассылки результатов сборки через telegram", + "properties" : { + "onAlways" : { + "type" : "boolean", + "description" : "Отправлять всегда" }, - "onSuccess": { - "type": "boolean", - "description": "Отправлять при успешной сборке" + "onSuccess" : { + "type" : "boolean", + "description" : "Отправлять при успешной сборке" }, - "onFailure": { - "type": "boolean", - "description": "Отправлять при падении сборки" + "onFailure" : { + "type" : "boolean", + "description" : "Отправлять при падении сборки" }, - "onUnstable": { - "type": "boolean", - "description": "Отправлять при нестабильной сборке" + "onUnstable" : { + "type" : "boolean", + "description" : "Отправлять при нестабильной сборке" } } } } }, - "logosConfig": { - "type": "string", - "description": "Конфигурация библиотеки logos. Применяется перед запуском каждой стадии сборки" + "logosConfig" : { + "type" : "string", + "description" : "Конфигурация библиотеки logos. Применяется перед запуском каждой стадии сборки" } } -} +} \ No newline at end of file diff --git a/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy b/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy index f3edd33b..f1b7e1aa 100644 --- a/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy +++ b/src/ru/pulsar/jenkins/library/configuration/InitInfoBaseOptions.groovy @@ -64,7 +64,6 @@ class InitInfoBaseOptions implements Serializable { ", runMigration=" + runMigration + ", additionalInitializationSteps=" + additionalInitializationSteps + ", extensions=" + extensions + - ", vrunnerSettings=" + vrunnerSettings + '}' } } diff --git a/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy b/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy index dcb406b6..2b92ffe1 100644 --- a/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy +++ b/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy @@ -14,27 +14,31 @@ class LoadExtensions implements Serializable { private final JobConfiguration config private final String stageName + private Extension[] extensionsFiltered + LoadExtensions(JobConfiguration config, String stageName = "") { this.config = config this.stageName = stageName } + Extension[] getExtensionsFiltered() { + return extensionsFiltered + } + def run() { IStepExecutor steps = ContextRegistry.getContext().getStepExecutor() Logger.printLocation() - - Extension[] filteredExtensions def extensions = this.config.initInfoBaseOptions.extensions if (this.stageName) { - filteredExtensions = extensions.findAll { extension -> + this.extensionsFiltered = extensions.findAll { extension -> extension.stages.contains(this.stageName) } } else { - filteredExtensions = extensions.findAll { extension -> extension.stages.empty || extension.stages.contains("initInfoBase") } + this.extensionsFiltered = extensions.findAll { extension -> extension.stages.empty || extension.stages.contains("initInfoBase") } } def env = steps.env() @@ -42,7 +46,7 @@ class LoadExtensions implements Serializable { String vrunnerPath = VRunner.getVRunnerPath() - filteredExtensions.each { + this.extensionsFiltered.each { Logger.println("Установим расширение ${it.name}") loadExtension(it, vrunnerPath, steps, cfeDir) } @@ -62,7 +66,7 @@ class LoadExtensions implements Serializable { loadCommand += executeParameter loadCommand += ' --ibconnection "/F./build/ib"' - String vrunnerSettings = getVrunnerSettings(this.config, this.stageName) + String vrunnerSettings = getVrunnerSettingsForStage(this.config, this.stageName) if (vrunnerSettings && steps.fileExists(vrunnerSettings)) { loadCommand += " --settings $vrunnerSettings" } @@ -73,7 +77,7 @@ class LoadExtensions implements Serializable { } } - private static String getVrunnerSettings(JobConfiguration config, String stageName) { + private static String getVrunnerSettingsForStage(JobConfiguration config, String stageName) { if (!stageName) { return "" diff --git a/test/integration/groovy/jobConfigurationTest.groovy b/test/integration/groovy/jobConfigurationTest.groovy index 33caabc6..b2a671ec 100644 --- a/test/integration/groovy/jobConfigurationTest.groovy +++ b/test/integration/groovy/jobConfigurationTest.groovy @@ -47,7 +47,7 @@ class jobConfigurationTest { 'jobConfiguration.json', StandardCharsets.UTF_8, this.getClass().getClassLoader() - ); + ) def writeFile = """ writeFile text: \"\"\"$file\"\"\", file: 'jobConfiguration.json' @@ -74,6 +74,5 @@ class jobConfigurationTest { rule.assertLogContains("v8version='8.3.12.1500'", run) rule.assertLogContains("sonarScannerToolName='sonar-scanner'", run) rule.assertLogContains("initMethod=FROM_SOURCE", run) - rule.assertLogContains("custom_units", run) } } \ No newline at end of file diff --git a/test/unit/groovy/ru/pulsar/jenkins/library/steps/LoadExtensionsTest.java b/test/unit/groovy/ru/pulsar/jenkins/library/steps/LoadExtensionsTest.java index a350d38b..4b6bf534 100644 --- a/test/unit/groovy/ru/pulsar/jenkins/library/steps/LoadExtensionsTest.java +++ b/test/unit/groovy/ru/pulsar/jenkins/library/steps/LoadExtensionsTest.java @@ -1,19 +1,23 @@ package ru.pulsar.jenkins.library.steps; +import hudson.FilePath; 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 org.mockito.MockedStatic; +import org.mockito.Mockito; import ru.pulsar.jenkins.library.configuration.ConfigurationReader; import ru.pulsar.jenkins.library.configuration.JobConfiguration; +import ru.pulsar.jenkins.library.utils.FileUtils; import ru.pulsar.jenkins.library.utils.TestUtils; +import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; import static org.assertj.core.api.Assertions.assertThat; - +import static org.mockito.ArgumentMatchers.anyString; class LoadExtensionsTest { @@ -25,21 +29,25 @@ void setUp() { @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); + try (MockedStatic fu = Mockito.mockStatic(FileUtils.class)) { + fu.when(() -> FileUtils.getFilePath(anyString())) + .thenReturn(new FilePath(new File("/"))); + + // given + // файл содержит 2 расширения для двух стейджей + String config = IOUtils.resourceToString( + "jobConfiguration.json", + StandardCharsets.UTF_8, + this.getClass().getClassLoader() + ); + JobConfiguration jobConfiguration = ConfigurationReader.create(config); + LoadExtensions loadExtensions = new LoadExtensions(jobConfiguration, "yaxunit"); + + // when + loadExtensions.run(); + + // then + assertThat(loadExtensions.getExtensionsFiltered().length).isEqualTo(1); + } } } diff --git a/test/unit/groovy/ru/pulsar/jenkins/library/utils/EnvUtils.java b/test/unit/groovy/ru/pulsar/jenkins/library/utils/EnvUtils.java new file mode 100644 index 00000000..d621c3e6 --- /dev/null +++ b/test/unit/groovy/ru/pulsar/jenkins/library/utils/EnvUtils.java @@ -0,0 +1,32 @@ +package ru.pulsar.jenkins.library.utils; + +import hudson.EnvVars; +import org.jenkinsci.plugins.workflow.support.actions.EnvironmentAction; + +import java.io.IOException; + +public class EnvUtils implements EnvironmentAction { + + public String NODE_NAME = "node"; + public String WORKSPACE = "ws"; + + @Override + public EnvVars getEnvironment() throws IOException, InterruptedException { + return null; + } + + @Override + public String getIconFileName() { + return null; + } + + @Override + public String getDisplayName() { + return null; + } + + @Override + public String getUrlName() { + return null; + } +} diff --git a/test/unit/groovy/ru/pulsar/jenkins/library/utils/TestUtils.java b/test/unit/groovy/ru/pulsar/jenkins/library/utils/TestUtils.java index 92f5a4b4..3c1999d5 100644 --- a/test/unit/groovy/ru/pulsar/jenkins/library/utils/TestUtils.java +++ b/test/unit/groovy/ru/pulsar/jenkins/library/utils/TestUtils.java @@ -28,6 +28,8 @@ public static IStepExecutor getMockedStepExecutor() { ); }); + when(steps.env()).thenAnswer(invocation -> new EnvUtils()); + when(steps.readFile(anyString(), anyString())).thenAnswer(invocation -> { String file = invocation.getArgument(0); String encoding = invocation.getArgument(1); diff --git a/test/unit/resources/jobConfiguration.json b/test/unit/resources/jobConfiguration.json index b49569d0..794de67b 100644 --- a/test/unit/resources/jobConfiguration.json +++ b/test/unit/resources/jobConfiguration.json @@ -14,6 +14,20 @@ "runMigration": false, "additionalInitializationSteps": [ "vanessa --settings ./tools/vrunner.first.json" + ], + "extensions": [ + { + "name": "YAXUnit", + "initMethod": "fromSource", + "path": "./src/cfe/YAXUnit", + "stages": ["yaxunit"] + }, + { + "name": "BDD", + "initMethod": "fromSource", + "path": "./src/cfe/bdd", + "stages": ["bdd"] + } ] }, "sonarqube": { From e92dc314d3bae354f6fac8e7035e587c69138b25 Mon Sep 17 00:00:00 2001 From: Dima Date: Tue, 9 Apr 2024 15:24:57 +0300 Subject: [PATCH 23/26] add safe unstash --- vars/unzipInfobase.groovy | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/vars/unzipInfobase.groovy b/vars/unzipInfobase.groovy index 27c74f4a..342e1be8 100644 --- a/vars/unzipInfobase.groovy +++ b/vars/unzipInfobase.groovy @@ -3,5 +3,9 @@ import ru.pulsar.jenkins.library.steps.GetExtensions def call() { unstash '1Cv8.1CD.zip' unzip dir: 'build/ib', zipFile: '1Cv8.1CD.zip' - unstash GetExtensions.EXTENSIONS_STASH + try { + unstash GetExtensions.EXTENSIONS_STASH + } catch (Exception e) { + echo e.toString() + } } \ No newline at end of file From 1e8a4ef99ce418bab68fc76d3855f0ea48bebe3a Mon Sep 17 00:00:00 2001 From: Dima Date: Tue, 7 May 2024 13:47:47 +0300 Subject: [PATCH 24/26] fix and add more tests --- .../library/steps/LoadExtensions.groovy | 2 +- .../library/steps/LoadExtensionsTest.java | 19 ++++++++++++++++--- test/unit/resources/jobConfiguration.json | 11 +++++++++++ 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy b/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy index 2b92ffe1..ced8c88b 100644 --- a/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy +++ b/src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy @@ -38,7 +38,7 @@ class LoadExtensions implements Serializable { } } else { - this.extensionsFiltered = extensions.findAll { extension -> extension.stages.empty || extension.stages.contains("initInfoBase") } + this.extensionsFiltered = extensions.findAll { extension -> extension.stages.length == 0 || extension.stages.contains("initInfoBase") } } def env = steps.env() diff --git a/test/unit/groovy/ru/pulsar/jenkins/library/steps/LoadExtensionsTest.java b/test/unit/groovy/ru/pulsar/jenkins/library/steps/LoadExtensionsTest.java index 4b6bf534..d4eb1271 100644 --- a/test/unit/groovy/ru/pulsar/jenkins/library/steps/LoadExtensionsTest.java +++ b/test/unit/groovy/ru/pulsar/jenkins/library/steps/LoadExtensionsTest.java @@ -8,6 +8,7 @@ import org.mockito.MockedStatic; import org.mockito.Mockito; import ru.pulsar.jenkins.library.configuration.ConfigurationReader; +import ru.pulsar.jenkins.library.configuration.InitInfoBaseOptions; import ru.pulsar.jenkins.library.configuration.JobConfiguration; import ru.pulsar.jenkins.library.utils.FileUtils; import ru.pulsar.jenkins.library.utils.TestUtils; @@ -34,20 +35,32 @@ void runYaxunit() throws IOException { .thenReturn(new FilePath(new File("/"))); // given - // файл содержит 2 расширения для двух стейджей + // файл содержит 4 расширения для разных стейджей String config = IOUtils.resourceToString( "jobConfiguration.json", StandardCharsets.UTF_8, this.getClass().getClassLoader() ); JobConfiguration jobConfiguration = ConfigurationReader.create(config); - LoadExtensions loadExtensions = new LoadExtensions(jobConfiguration, "yaxunit"); // when + LoadExtensions loadExtensions = new LoadExtensions(jobConfiguration); loadExtensions.run(); // then - assertThat(loadExtensions.getExtensionsFiltered().length).isEqualTo(1); + InitInfoBaseOptions.Extension[] extensions = loadExtensions.getExtensionsFiltered(); + assertThat(extensions.length).isEqualTo(2); + assertThat(extensions[0].getName()).isEqualTo("mods"); + assertThat(extensions[1].getName()).isEqualTo("mods2"); + + // when + LoadExtensions loadExtensionsWithStage = new LoadExtensions(jobConfiguration, "yaxunit"); + loadExtensionsWithStage.run(); + + // then + extensions = loadExtensionsWithStage.getExtensionsFiltered(); + assertThat(extensions.length).isEqualTo(1); + assertThat(extensions[0].getName()).isEqualTo("YAXUnit"); } } } diff --git a/test/unit/resources/jobConfiguration.json b/test/unit/resources/jobConfiguration.json index 794de67b..803b75ea 100644 --- a/test/unit/resources/jobConfiguration.json +++ b/test/unit/resources/jobConfiguration.json @@ -27,6 +27,17 @@ "initMethod": "fromSource", "path": "./src/cfe/bdd", "stages": ["bdd"] + }, + { + "name": "mods", + "initMethod": "fromSource", + "path": "./src/cfe/mods" + }, + { + "name": "mods2", + "initMethod": "fromSource", + "path": "./src/cfe/mods2", + "stages": ["initInfoBase"] } ] }, From 18c2ade56adb285c6bfe33e341f9dcae16d34ea6 Mon Sep 17 00:00:00 2001 From: Dima Date: Wed, 8 May 2024 13:14:02 +0300 Subject: [PATCH 25/26] upd README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e52120ed..e1a2760d 100644 --- a/README.md +++ b/README.md @@ -208,3 +208,4 @@ pipeline1C() * Добавить расширение `YAXUnit` и дополнительные расширения с тестами можно в `jobConfiguration.json` -> `initInfobase` -> `extensions`. Они будут загружены при инициализации ИБ. * Если ваши тесты размещены в отдельных расширениях, скопируйте файл `./resources/yaxunit.json` из текущей библиотеки в свой репозиторий (`./tools/yaxunit.json`) и перечислите в нем имена ваших расширений. + * Если используется собственный файл `tools/yaxunit.json`, то значение параметра reportPath в нем должно быть равно `./build/out/yaxunit/junit.xml` From 317d39f55b5c69c38ca0fa50979afd4280fbf823 Mon Sep 17 00:00:00 2001 From: Dima Ovcharenko Date: Wed, 8 May 2024 17:47:14 +0300 Subject: [PATCH 26/26] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e1a2760d..d9f27e27 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,8 @@ pipeline1C() ## Внешний вид пайплайна в интерфейсе Blue Ocean -![image](https://github.com/firstBitMarksistskaya/jenkins-lib/assets/80944823/a8d5bdff-3267-4744-a613-8c3d445b767f) +![image](https://github.com/ovcharenko-di/jenkins-lib/assets/24920942/19eabbc3-e33e-44f5-8f23-142f44817628) + ## Конфигурирование