diff --git a/README.md b/README.md index 97343aa..1837f41 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 fffe032..18a8cca 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 acc82d0..500468b 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 e9f9cb5..05222ce 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 e8ffe04..1995ebb 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 7b28579..b3dca8f 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 0000000..51e04d2 --- /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 72a008c..f3a1232 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 b6086ac..1d8c21c 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 d08c67d..900f6a9 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 2c8e357..1001187 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 af1f861..7549ed1 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 e3ded0b..33caabc 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 38b207a..6b3e9d1 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 6fdc856..573586d 100644 --- a/vars/pipeline1C.groovy +++ b/vars/pipeline1C.groovy @@ -244,7 +244,7 @@ void call() { } } - stage('Юнит тесты') { + stage('YAXUnit тесты') { agent { label agent1C }