1
0

подключение расширений на разных шагах

исправление замечаний
This commit is contained in:
Dima
2024-03-19 14:54:33 +03:00
parent 13ce9cfcf8
commit 9f0a9221dd
11 changed files with 185 additions and 58 deletions

View File

@@ -108,7 +108,7 @@ pipeline1C()
* Общее: * Общее:
* В качестве маски версии платформы используется строка "8.3" (`v8version`). * В качестве маски версии платформы используется строка "8.3" (`v8version`).
* По-умолчанию версия модуля EDT не заполнена, т.к. в случае единственной версии для утилиты ring дополнительного указания не требуется (`edtVersion`). * По умолчанию версия модуля EDT не заполнена, т.к. в случае единственной версии для утилиты ring дополнительного указания не требуется (`edtVersion`).
* Исходники конфигурации ожидаются в каталоге `src/cf` (`srcDir`). * Исходники конфигурации ожидаются в каталоге `src/cf` (`srcDir`).
* Формат исходников - выгрузка из Конфигуратора (`sourceFormat`). * Формат исходников - выгрузка из Конфигуратора (`sourceFormat`).
* Ветка по умолчанию (для комбинированного режима загрузки конфигурации) - "main" (`defaultBranch`). * Ветка по умолчанию (для комбинированного режима загрузки конфигурации) - "main" (`defaultBranch`).
@@ -133,8 +133,7 @@ pipeline1C()
* BDD: * BDD:
* Если в конфигурационном файле проекта не заполнена настройка `bdd` -> `vrunnerSteps`, то автоматически выполняется запуск `vrunner vanessa --settings tools/vrunner.json`. * Если в конфигурационном файле проекта не заполнена настройка `bdd` -> `vrunnerSteps`, то автоматически выполняется запуск `vrunner vanessa --settings tools/vrunner.json`.
* YAXUnit: * YAXUnit:
* Необходимо указать расширение YAXUnit и дополнительные расширения с тестами (опционально) в `jobConfiguration.json` -> `initInfobase` -> `extensions`. Они будут загружены при инициализации ИБ. * Если в репозитории существует файл `tools/yaxunit.json`, то он будет передан в качестве параметра для YAXUnit при запуске тестов. Если файла с таким именем нет, то в YAXUnit будет передан файл из текущей библиотеки `resources/yaxunit.json`. Он содержит минимально необходимые параметры и настроен на поиск сценариев в расширении с именем `YAXUnit`.
* Если ваши тесты размещены в отдельных расширениях, скопируйте файл `./resources/yaxunit.json` из текущей библиотеки в свой репозиторий (`./tools/yaxunit.json`) и перечислите в нем имена ваших расширений.
* Дымовые тесты: * Дымовые тесты:
* Если в репозитории существует файл `tools/vrunner.json`, то запуск дымовых тестов будет выполняться с передачей файла в параметры запуска `vrunner xunit --settings tools/vrunner.json` (`smoke` -> `vrunnerSettings`). * Если в репозитории существует файл `tools/vrunner.json`, то запуск дымовых тестов будет выполняться с передачей файла в параметры запуска `vrunner xunit --settings tools/vrunner.json` (`smoke` -> `vrunnerSettings`).
* Если установка локальных зависимостей `opm` установит пакет `add`, то будет использоваться обработка `xddTestRunner.epf` из локальных зависимостей. * Если установка локальных зависимостей `opm` установит пакет `add`, то будет использоваться обработка `xddTestRunner.epf` из локальных зависимостей.
@@ -171,7 +170,7 @@ pipeline1C()
* Telegram: * Telegram:
* Уведомления о результатах сборки по умолчанию рассылаются всегда (`notifications` -> `telegram` -> `onAlways`, `onFailure`, `onUnstable`, `onSuccess`). * Уведомления о результатах сборки по умолчанию рассылаются всегда (`notifications` -> `telegram` -> `onAlways`, `onFailure`, `onUnstable`, `onSuccess`).
## Конфигурирование загрузки расширений ## Настройка загрузки расширений
Если у вас есть расширения которые необходимо загрузить в базу для проведения тестов и проверок, это можно сделать на этапе подготовки базы. Если у вас есть расширения которые необходимо загрузить в базу для проведения тестов и проверок, это можно сделать на этапе подготовки базы.
* При загрузке из исходников расширения должны быть в том же формате(edt или конфигуратора) что и основная конфигурация. * При загрузке из исходников расширения должны быть в том же формате(edt или конфигуратора) что и основная конфигурация.
@@ -203,4 +202,9 @@ pipeline1C()
} }
] ]
} }
``` ```
## Настройка шага YAXUnit
* Добавить расширение `YAXUnit` и дополнительные расширения с тестами можно в `jobConfiguration.json` -> `initInfobase` -> `extensions`. Они будут загружены при инициализации ИБ.
* Если ваши тесты размещены в отдельных расширениях, скопируйте файл `./resources/yaxunit.json` из текущей библиотеки в свой репозиторий (`./tools/yaxunit.json`) и перечислите в нем имена ваших расширений.

View File

@@ -61,7 +61,6 @@ dependencies {
integrationTestImplementation("org.slf4j", "slf4j-api", slf4jVersion) integrationTestImplementation("org.slf4j", "slf4j-api", slf4jVersion)
integrationTestImplementation("org.slf4j", "slf4j-simple", slf4jVersion) integrationTestImplementation("org.slf4j", "slf4j-simple", slf4jVersion)
integrationTestImplementation("org.springframework.security", "spring-security-core", "5.1.13.RELEASE")
} }

View File

@@ -42,8 +42,7 @@
"initMethod": "fromStorage", "initMethod": "fromStorage",
"runMigration": true, "runMigration": true,
"additionalInitializationSteps": [], "additionalInitializationSteps": [],
"extensions": [], "extensions": []
"vrunnerSettings": "./tools/vrunner.json"
}, },
"bdd": { "bdd": {
"vrunnerSteps": [ "vrunnerSteps": [

View File

@@ -65,8 +65,6 @@ class ConfigurationReader implements Serializable {
"bddOptions", "bddOptions",
"sonarQubeOptions", "sonarQubeOptions",
"smokeTestOptions", "smokeTestOptions",
"yaxunitOptions",
"extensions",
"syntaxCheckOptions", "syntaxCheckOptions",
"resultsTransformOptions", "resultsTransformOptions",
"notificationsOptions", "notificationsOptions",

View File

@@ -28,11 +28,6 @@ class InitInfoBaseOptions implements Serializable {
@JsonPropertyDescription("Массив расширений для загрузки в конфигурацию.") @JsonPropertyDescription("Массив расширений для загрузки в конфигурацию.")
Extension[] extensions Extension[] extensions
@JsonPropertyDescription("""Путь к конфигурационному файлу vanessa-runner.
По умолчанию содержит значение "./tools/vrunner.json".
""")
String vrunnerSettings
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
static class Extension implements Serializable { static class Extension implements Serializable {
@JsonPropertyDescription("Имя расширения, используемое при его загрузке в конфигурацию.") @JsonPropertyDescription("Имя расширения, используемое при его загрузке в конфигурацию.")
@@ -47,11 +42,18 @@ class InitInfoBaseOptions implements Serializable {
InitExtensionMethod initMethod = InitExtensionMethod.SOURCE InitExtensionMethod initMethod = InitExtensionMethod.SOURCE
@JsonPropertyDescription(""" @JsonPropertyDescription("""
Хранит в себе путь к расширению. Путь к расширению.
* В случае если выбран initMethod <fromSource> - указывается путь к исходникам расширения. * В случае если выбран initMethod <fromSource> - указывается путь к исходникам расширения.
* В случае если выбран initMethod <fromFile> - указывается путь к cfe-файлу * В случае если выбран initMethod <fromFile> - указывается путь к cfe-файлу
""") """)
String path = "src/cfe/extension" String path = "src/cfe/extension"
@JsonPropertyDescription("""
Шаги, на которых необходимо использовать расширение
* Если не заполнено, то расширение будет подключено при инициализации базы и останется в базе на всех последующих шагах.
* Если заполнено, то расширение будет подключено только на соответствующих шагах.
""")
String[] stages = ["initInfoBase"]
} }
@Override @Override

View File

@@ -105,8 +105,14 @@ class JobConfiguration implements Serializable {
(initMethod == InitInfoBaseMethod.DEFAULT_BRANCH_FROM_STORAGE && branchName != defaultBranch) (initMethod == InitInfoBaseMethod.DEFAULT_BRANCH_FROM_STORAGE && branchName != defaultBranch)
} }
boolean needLoadExtensions() { boolean needLoadExtensions(String stageName = "") {
return initInfoBaseOptions.extensions.length != 0 if (stageName.isEmpty()) {
return initInfoBaseOptions.extensions.length != 0
} else {
return initInfoBaseOptions.extensions.any { extension ->
extension.stages.contains(stageName)
}
}
} }
String v8AgentLabel() { String v8AgentLabel() {

View File

@@ -12,9 +12,11 @@ import ru.pulsar.jenkins.library.utils.FileUtils
class LoadExtensions implements Serializable { class LoadExtensions implements Serializable {
private final JobConfiguration config private final JobConfiguration config
private final String stageName
LoadExtensions(JobConfiguration config) { LoadExtensions(JobConfiguration config, String stageName = "") {
this.config = config this.config = config
this.stageName = stageName
} }
def run() { def run() {
@@ -22,12 +24,25 @@ class LoadExtensions implements Serializable {
Logger.printLocation() 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() def env = steps.env()
String cfeDir = "$env.WORKSPACE/$GetExtensions.EXTENSIONS_OUT_DIR" String cfeDir = "$env.WORKSPACE/$GetExtensions.EXTENSIONS_OUT_DIR"
String vrunnerPath = VRunner.getVRunnerPath() String vrunnerPath = VRunner.getVRunnerPath()
config.initInfoBaseOptions.extensions.each { filteredExtensions.each {
Logger.println("Установим расширение ${it.name}") Logger.println("Установим расширение ${it.name}")
loadExtension(it, vrunnerPath, steps, cfeDir) loadExtension(it, vrunnerPath, steps, cfeDir)
} }
@@ -47,7 +62,7 @@ class LoadExtensions implements Serializable {
loadCommand += executeParameter loadCommand += executeParameter
loadCommand += ' --ibconnection "/F./build/ib"' loadCommand += ' --ibconnection "/F./build/ib"'
String vrunnerSettings = config.initInfoBaseOptions.vrunnerSettings String vrunnerSettings = getVrunnerSettings(this.config, stageName)
if (steps.fileExists(vrunnerSettings)) { if (steps.fileExists(vrunnerSettings)) {
loadCommand += " --settings $vrunnerSettings" loadCommand += " --settings $vrunnerSettings"
} }
@@ -57,4 +72,17 @@ class LoadExtensions implements Serializable {
VRunner.exec(loadCommand) 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 ""
}
}
} }

View File

@@ -33,7 +33,7 @@ class PublishAllure implements Serializable {
if (config.stageFlags.bdd) { if (config.stageFlags.bdd) {
safeUnstash('bdd-allure') safeUnstash('bdd-allure')
} }
if (config.stageFlags.yaxunit) { if (config.stageFlags.yaxunit && config.yaxunitOptions.publishToAllureReport) {
safeUnstash(Yaxunit.YAXUNIT_ALLURE_STASH) safeUnstash(Yaxunit.YAXUNIT_ALLURE_STASH)
} }
if (config.stageFlags.smoke && config.smokeTestOptions.publishToAllureReport) { if (config.stageFlags.smoke && config.smokeTestOptions.publishToAllureReport) {

View File

@@ -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);
}
}

View File

@@ -2,9 +2,9 @@ import ru.pulsar.jenkins.library.configuration.JobConfiguration
import ru.pulsar.jenkins.library.ioc.ContextRegistry import ru.pulsar.jenkins.library.ioc.ContextRegistry
import ru.pulsar.jenkins.library.steps.LoadExtensions import ru.pulsar.jenkins.library.steps.LoadExtensions
def call(JobConfiguration config) { def call(JobConfiguration config, String stageName = "") {
ContextRegistry.registerDefaultContext(this) ContextRegistry.registerDefaultContext(this)
def loadExtensions = new LoadExtensions(config) def loadExtensions = new LoadExtensions(config, stageName)
loadExtensions.run() loadExtensions.run()
} }

View File

@@ -196,18 +196,33 @@ void call() {
} }
stage('BDD сценарии') { stage('BDD сценарии') {
agent {
label agent1C
}
when {
beforeAgent true
expression { config.stageFlags.bdd }
}
steps {
timeout(time: config.timeoutOptions.bdd, unit: TimeUnit.MINUTES) {
unzipInfobase()
bdd config stage('Загрузка расширений в конфигурацию'){
when {
beforeAgent true
expression { config.needLoadExtensions('bdd') }
}
steps {
timeout(time: config.timeoutOptions.loadExtensions, unit: TimeUnit.MINUTES) {
loadExtensions config 'bdd'
}
}
}
stage('Выполнение BDD сценариев') {
agent {
label agent1C
}
when {
beforeAgent true
expression { config.stageFlags.bdd }
}
steps {
timeout(time: config.timeoutOptions.bdd, unit: TimeUnit.MINUTES) {
unzipInfobase()
bdd config
}
} }
} }
} }
@@ -228,35 +243,66 @@ void call() {
} }
stage('Дымовые тесты') { stage('Дымовые тесты') {
agent {
label agent1C
}
when {
beforeAgent true
expression { config.stageFlags.smoke }
}
steps {
timeout(time: config.timeoutOptions.smoke, unit: TimeUnit.MINUTES) {
unzipInfobase()
smoke config stage('Загрузка расширений в конфигурацию') {
when {
beforeAgent true
expression { config.needLoadExtensions('smoke') }
}
steps {
timeout(time: config.timeoutOptions.loadExtensions, unit: TimeUnit.MINUTES) {
loadExtensions config 'smoke'
}
}
}
stage('Выполнение дымовых тестов') {
agent {
label agent1C
}
when {
beforeAgent true
expression { config.stageFlags.smoke }
}
steps {
timeout(time: config.timeoutOptions.smoke, unit: TimeUnit.MINUTES) {
unzipInfobase()
smoke config
}
} }
} }
} }
stage('YAXUnit тесты') { stage('YAXUnit тесты') {
agent {
label agent1C
}
when {
beforeAgent true
expression { config.stageFlags.yaxunit }
}
steps {
timeout(time: config.timeoutOptions.yaxunit, unit: TimeUnit.MINUTES) {
unzipInfobase()
yaxunit config stage('Загрузка расширений в конфигурацию') {
when {
beforeAgent true
expression { config.needLoadExtensions('yaxunit') }
}
steps {
timeout(time: config.timeoutOptions.loadExtensions, unit: TimeUnit.MINUTES) {
loadExtensions config 'yaxunit'
}
}
}
stage('Выполнение YAXUnit тестов') {
agent {
label agent1C
}
when {
beforeAgent true
expression { config.stageFlags.yaxunit }
}
steps {
timeout(time: config.timeoutOptions.yaxunit, unit: TimeUnit.MINUTES) {
unzipInfobase()
yaxunit config
}
} }
} }
} }