You've already forked jenkins-lib
forked from jenkins/jenkins-lib
подключение расширений на разных шагах
исправление замечаний
This commit is contained in:
14
README.md
14
README.md
@@ -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`) и перечислите в нем имена ваших расширений.
|
||||||
|
@@ -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")
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -42,8 +42,7 @@
|
|||||||
"initMethod": "fromStorage",
|
"initMethod": "fromStorage",
|
||||||
"runMigration": true,
|
"runMigration": true,
|
||||||
"additionalInitializationSteps": [],
|
"additionalInitializationSteps": [],
|
||||||
"extensions": [],
|
"extensions": []
|
||||||
"vrunnerSettings": "./tools/vrunner.json"
|
|
||||||
},
|
},
|
||||||
"bdd": {
|
"bdd": {
|
||||||
"vrunnerSteps": [
|
"vrunnerSteps": [
|
||||||
|
@@ -65,8 +65,6 @@ class ConfigurationReader implements Serializable {
|
|||||||
"bddOptions",
|
"bddOptions",
|
||||||
"sonarQubeOptions",
|
"sonarQubeOptions",
|
||||||
"smokeTestOptions",
|
"smokeTestOptions",
|
||||||
"yaxunitOptions",
|
|
||||||
"extensions",
|
|
||||||
"syntaxCheckOptions",
|
"syntaxCheckOptions",
|
||||||
"resultsTransformOptions",
|
"resultsTransformOptions",
|
||||||
"notificationsOptions",
|
"notificationsOptions",
|
||||||
|
@@ -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
|
||||||
|
@@ -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() {
|
||||||
|
@@ -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 ""
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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) {
|
||||||
|
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
@@ -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()
|
||||||
}
|
}
|
@@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user