You've already forked jenkins-lib
forked from jenkins/jenkins-lib
Merge pull request #104 from Segate-ekb/develop
Загрузка расширений в конфигурацию для прогона тестов.
This commit is contained in:
37
README.md
37
README.md
@@ -30,6 +30,7 @@
|
|||||||
1. Все шаги можно запустить на базе docker-образов из https://github.com/firstBitMarksistskaya/onec-docker. См. [памятку по слоям и последовательности сборки](https://github.com/firstBitMarksistskaya/onec-docker/blob/feature/first-bit/Layers.md).
|
1. Все шаги можно запустить на базе docker-образов из https://github.com/firstBitMarksistskaya/onec-docker. См. [памятку по слоям и последовательности сборки](https://github.com/firstBitMarksistskaya/onec-docker/blob/feature/first-bit/Layers.md).
|
||||||
1. Поддержка как формата выгрузки из Конфигуратора, так и формата EDT.
|
1. Поддержка как формата выгрузки из Конфигуратора, так и формата EDT.
|
||||||
1. Подготовка информационной базы по версии из хранилища конфигурации, из исходных файлов конфигурации, комбинированный режим (основная ветка - из хранилища, остальные - из исходников).
|
1. Подготовка информационной базы по версии из хранилища конфигурации, из исходных файлов конфигурации, комбинированный режим (основная ветка - из хранилища, остальные - из исходников).
|
||||||
|
1. Подготовка и загрузка расширений конфигурации из исходных файлов расширения, из cfe-файлов.
|
||||||
1. Запуск ИБ в режиме выполнения обработчиков обновления БСП.
|
1. Запуск ИБ в режиме выполнения обработчиков обновления БСП.
|
||||||
1. Дополнительные шаги инициализации данных в ИБ.
|
1. Дополнительные шаги инициализации данных в ИБ.
|
||||||
1. Трансформация кода из формата конфигуратора в формат EDT.
|
1. Трансформация кода из формата конфигуратора в формат EDT.
|
||||||
@@ -66,7 +67,7 @@ pipeline1C()
|
|||||||
|
|
||||||
## Внешний вид пайплайна в интерфейсе Blue Ocean
|
## Внешний вид пайплайна в интерфейсе Blue Ocean
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## Конфигурирование
|
## Конфигурирование
|
||||||
|
|
||||||
@@ -165,3 +166,37 @@ pipeline1C()
|
|||||||
* Прямые получатели уведомлений не заполнены (`notifications` -> `email` -> `*options` -> `directRecipients`).
|
* Прямые получатели уведомлений не заполнены (`notifications` -> `email` -> `*options` -> `directRecipients`).
|
||||||
* Telegram:
|
* Telegram:
|
||||||
* Уведомления о результатах сборки по умолчанию рассылаются всегда (`notifications` -> `telegram` -> `onAlways`, `onFailure`, `onUnstable`, `onSuccess`).
|
* Уведомления о результатах сборки по умолчанию рассылаются всегда (`notifications` -> `telegram` -> `onAlways`, `onFailure`, `onUnstable`, `onSuccess`).
|
||||||
|
|
||||||
|
## Конфигурирование загрузки расширений
|
||||||
|
|
||||||
|
Если у вас есть расширения которые необходимо загрузить в базу для проведения тестов и проверок, это можно сделать на этапе подготовки базы.
|
||||||
|
* При загрузке из исходников расширения должны быть в том же формате(edt или конфигуратора) что и основная конфигурация.
|
||||||
|
* Для загрузки расширений необходимо описать каждое из них в массиве (`initInfobase` -> `extensions`)
|
||||||
|
|
||||||
|
Для загрузки расширений в информационную базу необходимо выполнить следующие шаги:
|
||||||
|
|
||||||
|
1. Укажите имя расширения(`extensions` -> `name`).
|
||||||
|
1. Определите метод загрузки для каждого расширения(`extensions` -> `initMethod`). Поддерживаются два метода загрузки:
|
||||||
|
- `fromSource` - загрузка из исходников;
|
||||||
|
- `fromFile` - загрузка cfe-файла.
|
||||||
|
1. Укажите путь до расширения или URL для скачивания cfe-файла(`extensions` -> `path`).
|
||||||
|
- В случае загрузки из исходников - необходимо указать путь к исходникам расширения
|
||||||
|
- В случае загрузки cfe - Укажите путь по которому будет скачан cfe. На данный момент можно указывать как локальный путь, так и url для скачивания cfe(Прим.: https://github.com/bia-technologies/yaxunit/releases/download/23.05/YAXUNIT-23.05.cfe)
|
||||||
|
|
||||||
|
Пример конфигурации для загрузки расширений:
|
||||||
|
```json
|
||||||
|
"initInfobase": {
|
||||||
|
"extensions": [
|
||||||
|
{
|
||||||
|
"name": "ИмяРасширения1",
|
||||||
|
"initMethod": "fromSource",
|
||||||
|
"path": "путь/до/исходников/расширения"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ИмяРасширения2",
|
||||||
|
"initMethod": "fromFile",
|
||||||
|
"path": "https://example.com/path/to/extension.cfe"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
@@ -24,11 +24,13 @@
|
|||||||
"timeout": {
|
"timeout": {
|
||||||
"smoke": 240,
|
"smoke": 240,
|
||||||
"bdd": 120,
|
"bdd": 120,
|
||||||
|
"getBinaries": 60,
|
||||||
"createInfoBase": 60,
|
"createInfoBase": 60,
|
||||||
"designerToEdtFormatTransformation": 60,
|
"designerToEdtFormatTransformation": 60,
|
||||||
"edtToDesignerFormatTransformation": 60,
|
"edtToDesignerFormatTransformation": 60,
|
||||||
"edtValidate": 240,
|
"edtValidate": 240,
|
||||||
"initInfoBase": 60,
|
"initInfoBase": 60,
|
||||||
|
"loadExtensions": 60,
|
||||||
"resultTransformation": 10,
|
"resultTransformation": 10,
|
||||||
"sonarqube": 90,
|
"sonarqube": 90,
|
||||||
"syntaxCheck": 240,
|
"syntaxCheck": 240,
|
||||||
@@ -37,7 +39,8 @@
|
|||||||
"initInfobase": {
|
"initInfobase": {
|
||||||
"initMethod": "fromStorage",
|
"initMethod": "fromStorage",
|
||||||
"runMigration": true,
|
"runMigration": true,
|
||||||
"additionalInitializationSteps": []
|
"additionalInitializationSteps": [],
|
||||||
|
"extensions": []
|
||||||
},
|
},
|
||||||
"bdd": {
|
"bdd": {
|
||||||
"vrunnerSteps": [
|
"vrunnerSteps": [
|
||||||
|
@@ -94,6 +94,10 @@
|
|||||||
"type": "integer",
|
"type": "integer",
|
||||||
"description": "Таймаут шага трансформации исходников из формата EDT в формат Конфигуратора, в минутах.\n По умолчанию содержит значение 60.\n "
|
"description": "Таймаут шага трансформации исходников из формата EDT в формат Конфигуратора, в минутах.\n По умолчанию содержит значение 60.\n "
|
||||||
},
|
},
|
||||||
|
"getBinaries": {
|
||||||
|
"type": "integer",
|
||||||
|
"description": "Таймаут шага получения бинарников, в минутах.\n По умолчанию содержит значение 60.\n "
|
||||||
|
},
|
||||||
"createInfoBase": {
|
"createInfoBase": {
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"description": "Таймаут шага создания информационной базы, в минутах.\n По умолчанию содержит значение 60.\n "
|
"description": "Таймаут шага создания информационной базы, в минутах.\n По умолчанию содержит значение 60.\n "
|
||||||
@@ -102,6 +106,10 @@
|
|||||||
"type": "integer",
|
"type": "integer",
|
||||||
"description": "Таймаут шага инициализации информационной базы, в минутах.\n По умолчанию содержит значение 60.\n "
|
"description": "Таймаут шага инициализации информационной базы, в минутах.\n По умолчанию содержит значение 60.\n "
|
||||||
},
|
},
|
||||||
|
"loadExtensions": {
|
||||||
|
"type": "integer",
|
||||||
|
"description": "Таймаут шага загрузки расширений в базу, в минутах.\n По умолчанию содержит значение 60.\n "
|
||||||
|
},
|
||||||
"zipInfoBase": {
|
"zipInfoBase": {
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"description": "Таймаут шага архивирования информационной базы, в минутах.\n По умолчанию содержит значение 60.\n "
|
"description": "Таймаут шага архивирования информационной базы, в минутах.\n По умолчанию содержит значение 60.\n "
|
||||||
@@ -156,6 +164,30 @@
|
|||||||
"items": {
|
"items": {
|
||||||
"type": "string"
|
"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": "Имя расширения с которым оно грузится в конфигурацию"
|
||||||
|
},
|
||||||
|
"initMethod": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "\n Способ инициализации расширения.\n Поддерживается два варианта:\n * fromSource - инициализация расширения из исходников;\n * fromFile - использование скомпилированного cfe.",
|
||||||
|
"enum": ["fromSource", "fromFile"]
|
||||||
|
},
|
||||||
|
"path": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Хранит в себе путь к расширению.\n * В случае если выбран initMethod <fromSource> - указывается путь к исходникам расширения.\n * В случае если выбран initMethod <fromFile> - указывается путь к cfe-файлу"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -316,7 +348,12 @@
|
|||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum" : [ "developers", "requestor", "brokenBuildSuspects", "brokenTestsSuspects" ]
|
"enum": [
|
||||||
|
"developers",
|
||||||
|
"requestor",
|
||||||
|
"brokenBuildSuspects",
|
||||||
|
"brokenTestsSuspects"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -61,6 +61,7 @@ class ConfigurationReader implements Serializable {
|
|||||||
"stageFlags",
|
"stageFlags",
|
||||||
"timeoutOptions",
|
"timeoutOptions",
|
||||||
"initInfoBaseOptions",
|
"initInfoBaseOptions",
|
||||||
|
"extensions",
|
||||||
"bddOptions",
|
"bddOptions",
|
||||||
"sonarQubeOptions",
|
"sonarQubeOptions",
|
||||||
"smokeTestOptions",
|
"smokeTestOptions",
|
||||||
@@ -113,12 +114,30 @@ class ConfigurationReader implements Serializable {
|
|||||||
|
|
||||||
@NonCPS
|
@NonCPS
|
||||||
private static void mergeInitInfoBaseOptions(InitInfoBaseOptions baseObject, InitInfoBaseOptions objectToMerge) {
|
private static void mergeInitInfoBaseOptions(InitInfoBaseOptions baseObject, InitInfoBaseOptions objectToMerge) {
|
||||||
if (objectToMerge == null || objectToMerge.additionalInitializationSteps == null) {
|
if (objectToMerge == null) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
mergeInitInfoBaseAdditionalInitializationSteps(baseObject, objectToMerge)
|
||||||
|
mergeInitInfoBaseExtensions(baseObject, objectToMerge)
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonCPS
|
||||||
|
private static void mergeInitInfoBaseAdditionalInitializationSteps(InitInfoBaseOptions baseObject, InitInfoBaseOptions objectToMerge) {
|
||||||
|
if (objectToMerge.additionalInitializationSteps == null) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
baseObject.additionalInitializationSteps = objectToMerge.additionalInitializationSteps.clone()
|
baseObject.additionalInitializationSteps = objectToMerge.additionalInitializationSteps.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@NonCPS
|
||||||
|
private static void mergeInitInfoBaseExtensions(InitInfoBaseOptions baseObject, InitInfoBaseOptions objectToMerge) {
|
||||||
|
if (objectToMerge.extensions == null) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
baseObject.extensions = objectToMerge.extensions.clone()
|
||||||
|
}
|
||||||
|
|
||||||
@NonCPS
|
@NonCPS
|
||||||
private static void mergeBddOptions(BddOptions baseObject, BddOptions objectToMerge) {
|
private static void mergeBddOptions(BddOptions baseObject, BddOptions objectToMerge) {
|
||||||
if (objectToMerge == null || objectToMerge.vrunnerSteps == null) {
|
if (objectToMerge == null || objectToMerge.vrunnerSteps == null) {
|
||||||
|
@@ -0,0 +1,12 @@
|
|||||||
|
package ru.pulsar.jenkins.library.configuration
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty
|
||||||
|
|
||||||
|
enum InitExtensionMethod {
|
||||||
|
@JsonProperty("fromSource")
|
||||||
|
SOURCE,
|
||||||
|
|
||||||
|
@JsonProperty("fromFile")
|
||||||
|
FILE
|
||||||
|
|
||||||
|
}
|
@@ -25,6 +25,30 @@ class InitInfoBaseOptions implements Serializable {
|
|||||||
""")
|
""")
|
||||||
String[] additionalInitializationSteps
|
String[] additionalInitializationSteps
|
||||||
|
|
||||||
|
@JsonPropertyDescription("Массив расширений для загрузки в конфигурацию.")
|
||||||
|
Extension[] extensions;
|
||||||
|
|
||||||
|
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||||
|
static class Extension implements Serializable {
|
||||||
|
@JsonPropertyDescription("Имя расширения, используемое при его загрузке в конфигурацию.")
|
||||||
|
String name = "extension";
|
||||||
|
|
||||||
|
@JsonPropertyDescription("""
|
||||||
|
Способ инициализации расширения.
|
||||||
|
Поддерживается два варианта:
|
||||||
|
* fromSource - инициализация расширения из исходников;
|
||||||
|
* fromFile - скачивание скомпилированного cfe по ссылке.
|
||||||
|
""")
|
||||||
|
InitExtensionMethod initMethod = InitExtensionMethod.SOURCE;
|
||||||
|
|
||||||
|
@JsonPropertyDescription("""
|
||||||
|
Хранит в себе путь к расширению.
|
||||||
|
* В случае если выбран initMethod <fromSource> - указывается путь к исходникам расширения.
|
||||||
|
* В случае если выбран initMethod <fromFile> - указывается путь к cfe-файлу
|
||||||
|
""")
|
||||||
|
String path = "src/cfe/extension";
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@NonCPS
|
@NonCPS
|
||||||
String toString() {
|
String toString() {
|
||||||
@@ -32,6 +56,7 @@ class InitInfoBaseOptions implements Serializable {
|
|||||||
"initMethod=" + initMethod +
|
"initMethod=" + initMethod +
|
||||||
", runMigration=" + runMigration +
|
", runMigration=" + runMigration +
|
||||||
", additionalInitializationSteps=" + additionalInitializationSteps +
|
", additionalInitializationSteps=" + additionalInitializationSteps +
|
||||||
|
", extensions=" + extensions +
|
||||||
'}';
|
'}';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -100,6 +100,10 @@ class JobConfiguration implements Serializable {
|
|||||||
(initMethod == InitInfoBaseMethod.DEFAULT_BRANCH_FROM_STORAGE && branchName != defaultBranch)
|
(initMethod == InitInfoBaseMethod.DEFAULT_BRANCH_FROM_STORAGE && branchName != defaultBranch)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean needLoadExtensions() {
|
||||||
|
return initInfoBaseOptions.extensions.length != 0
|
||||||
|
}
|
||||||
|
|
||||||
String v8AgentLabel() {
|
String v8AgentLabel() {
|
||||||
return v8version
|
return v8version
|
||||||
}
|
}
|
||||||
|
@@ -11,6 +11,11 @@ class TimeoutOptions implements Serializable {
|
|||||||
''')
|
''')
|
||||||
Integer edtToDesignerFormatTransformation
|
Integer edtToDesignerFormatTransformation
|
||||||
|
|
||||||
|
@JsonPropertyDescription('''Таймаут шага получения бинарников, в минутах.
|
||||||
|
По умолчанию содержит значение 60.
|
||||||
|
''')
|
||||||
|
Integer getBinaries
|
||||||
|
|
||||||
@JsonPropertyDescription('''Таймаут шага создания информационной базы, в минутах.
|
@JsonPropertyDescription('''Таймаут шага создания информационной базы, в минутах.
|
||||||
По умолчанию содержит значение 60.
|
По умолчанию содержит значение 60.
|
||||||
''')
|
''')
|
||||||
@@ -21,6 +26,11 @@ class TimeoutOptions implements Serializable {
|
|||||||
''')
|
''')
|
||||||
Integer initInfoBase
|
Integer initInfoBase
|
||||||
|
|
||||||
|
@JsonPropertyDescription('''Таймаут шага загрузки расширений в базу, в минутах.
|
||||||
|
По умолчанию содержит значение 60.
|
||||||
|
''')
|
||||||
|
Integer loadExtensions
|
||||||
|
|
||||||
@JsonPropertyDescription('''Таймаут шага архивирования информационной базы, в минутах.
|
@JsonPropertyDescription('''Таймаут шага архивирования информационной базы, в минутах.
|
||||||
По умолчанию содержит значение 60.
|
По умолчанию содержит значение 60.
|
||||||
''')
|
''')
|
||||||
|
@@ -4,6 +4,7 @@ package ru.pulsar.jenkins.library.steps
|
|||||||
import ru.pulsar.jenkins.library.IStepExecutor
|
import ru.pulsar.jenkins.library.IStepExecutor
|
||||||
import ru.pulsar.jenkins.library.configuration.JobConfiguration
|
import ru.pulsar.jenkins.library.configuration.JobConfiguration
|
||||||
import ru.pulsar.jenkins.library.configuration.SourceFormat
|
import ru.pulsar.jenkins.library.configuration.SourceFormat
|
||||||
|
import ru.pulsar.jenkins.library.configuration.InitExtensionMethod
|
||||||
import ru.pulsar.jenkins.library.ioc.ContextRegistry
|
import ru.pulsar.jenkins.library.ioc.ContextRegistry
|
||||||
import ru.pulsar.jenkins.library.utils.EDT
|
import ru.pulsar.jenkins.library.utils.EDT
|
||||||
import ru.pulsar.jenkins.library.utils.FileUtils
|
import ru.pulsar.jenkins.library.utils.FileUtils
|
||||||
@@ -15,6 +16,9 @@ class EdtToDesignerFormatTransformation implements Serializable {
|
|||||||
public static final String CONFIGURATION_DIR = 'build/cfg'
|
public static final String CONFIGURATION_DIR = 'build/cfg'
|
||||||
public static final String CONFIGURATION_ZIP = 'build/cfg.zip'
|
public static final String CONFIGURATION_ZIP = 'build/cfg.zip'
|
||||||
public static final String CONFIGURATION_ZIP_STASH = 'cfg-zip'
|
public static final String CONFIGURATION_ZIP_STASH = 'cfg-zip'
|
||||||
|
public static final String EXTENSION_DIR = 'build/cfe_src'
|
||||||
|
public static final String EXTENSION_ZIP = 'build/cfe_src.zip'
|
||||||
|
public static final String EXTENSION_ZIP_STASH = 'cfe_src-zip'
|
||||||
|
|
||||||
private final JobConfiguration config;
|
private final JobConfiguration config;
|
||||||
|
|
||||||
@@ -34,18 +38,29 @@ class EdtToDesignerFormatTransformation implements Serializable {
|
|||||||
|
|
||||||
def env = steps.env();
|
def env = steps.env();
|
||||||
|
|
||||||
def srcDir = config.srcDir
|
String srcDir = config.srcDir
|
||||||
def projectDir = FileUtils.getFilePath("$env.WORKSPACE/$srcDir")
|
String workspaceDir = FileUtils.getFilePath("$env.WORKSPACE/$WORKSPACE").getRemote()
|
||||||
def workspaceDir = FileUtils.getFilePath("$env.WORKSPACE/$WORKSPACE")
|
|
||||||
def configurationRoot = FileUtils.getFilePath("$env.WORKSPACE/$CONFIGURATION_DIR")
|
String projectWorkspaceDir = FileUtils.getFilePath("$workspaceDir/cf").getRemote()
|
||||||
|
String projectDir = FileUtils.getFilePath("$env.WORKSPACE/$srcDir").getRemote()
|
||||||
|
String configurationRoot = FileUtils.getFilePath("$env.WORKSPACE/$CONFIGURATION_DIR").getRemote()
|
||||||
|
|
||||||
|
|
||||||
|
String extensionRoot = FileUtils.getFilePath("$env.WORKSPACE/$EXTENSION_DIR").getRemote()
|
||||||
def edtVersionForRing = EDT.ringModule(config)
|
def edtVersionForRing = EDT.ringModule(config)
|
||||||
|
|
||||||
steps.deleteDir(workspaceDir)
|
steps.deleteDir(workspaceDir)
|
||||||
|
|
||||||
|
transformConfiguration(steps, projectDir, projectWorkspaceDir, configurationRoot, edtVersionForRing)
|
||||||
|
transformExtensions(steps, workspaceDir, extensionRoot, edtVersionForRing)
|
||||||
|
}
|
||||||
|
|
||||||
|
private void transformConfiguration(IStepExecutor steps, String projectDir, String projectWorkspaceDir, String configurationRoot, String edtVersionForRing) {
|
||||||
|
|
||||||
|
Logger.println("Конвертация исходников конфигурации из формата EDT в формат Конфигуратора")
|
||||||
steps.deleteDir(configurationRoot)
|
steps.deleteDir(configurationRoot)
|
||||||
|
|
||||||
Logger.println("Конвертация исходников из формата EDT в формат Конфигуратора")
|
def ringCommand = "ring $edtVersionForRing workspace export --workspace-location \"$projectWorkspaceDir\" --project \"$projectDir\" --configuration-files \"$configurationRoot\""
|
||||||
|
|
||||||
def ringCommand = "ring $edtVersionForRing workspace export --workspace-location \"$workspaceDir\" --project \"$projectDir\" --configuration-files \"$configurationRoot\""
|
|
||||||
|
|
||||||
steps.ringCommand(ringCommand)
|
steps.ringCommand(ringCommand)
|
||||||
|
|
||||||
@@ -53,4 +68,27 @@ class EdtToDesignerFormatTransformation implements Serializable {
|
|||||||
steps.stash(CONFIGURATION_ZIP_STASH, CONFIGURATION_ZIP)
|
steps.stash(CONFIGURATION_ZIP_STASH, CONFIGURATION_ZIP)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void transformExtensions(IStepExecutor steps, String workspaceDir, String extensionRoot, String edtVersionForRing) {
|
||||||
|
steps.deleteDir(extensionRoot)
|
||||||
|
|
||||||
|
config.initInfoBaseOptions.extensions.each {
|
||||||
|
|
||||||
|
if (it.initMethod != InitExtensionMethod.SOURCE) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
Logger.println("Конвертация исходников расширения ${it.name} из формата EDT в формат Конфигуратора")
|
||||||
|
|
||||||
|
def env = steps.env();
|
||||||
|
def projectDir = FileUtils.getFilePath("$env.WORKSPACE/${it.path}")
|
||||||
|
def currentExtensionWorkspaceDir = FileUtils.getFilePath("$workspaceDir/cfe/${it.name}")
|
||||||
|
|
||||||
|
def ringCommand = "ring $edtVersionForRing workspace export --workspace-location \"$currentExtensionWorkspaceDir\" --project \"$projectDir\" --configuration-files \"$extensionRoot/${it.name}\""
|
||||||
|
|
||||||
|
steps.ringCommand(ringCommand)
|
||||||
|
}
|
||||||
|
steps.zip(EXTENSION_DIR, EXTENSION_ZIP)
|
||||||
|
steps.stash(EXTENSION_ZIP_STASH, EXTENSION_ZIP)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
124
src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy
Normal file
124
src/ru/pulsar/jenkins/library/steps/GetExtensions.groovy
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
package ru.pulsar.jenkins.library.steps
|
||||||
|
|
||||||
|
import ru.pulsar.jenkins.library.IStepExecutor
|
||||||
|
import ru.pulsar.jenkins.library.configuration.JobConfiguration
|
||||||
|
import ru.pulsar.jenkins.library.configuration.SourceFormat
|
||||||
|
import ru.pulsar.jenkins.library.configuration.InitExtensionMethod
|
||||||
|
import ru.pulsar.jenkins.library.configuration.InitInfoBaseOptions.Extension
|
||||||
|
import ru.pulsar.jenkins.library.ioc.ContextRegistry
|
||||||
|
import ru.pulsar.jenkins.library.utils.Logger
|
||||||
|
import ru.pulsar.jenkins.library.utils.VRunner
|
||||||
|
import hudson.FilePath
|
||||||
|
import ru.pulsar.jenkins.library.utils.FileUtils
|
||||||
|
|
||||||
|
class GetExtensions implements Serializable {
|
||||||
|
|
||||||
|
public static final String EXTENSIONS_OUT_DIR = 'build/out/cfe'
|
||||||
|
|
||||||
|
private final JobConfiguration config;
|
||||||
|
|
||||||
|
GetExtensions(JobConfiguration config) {
|
||||||
|
this.config = config
|
||||||
|
}
|
||||||
|
|
||||||
|
def run() {
|
||||||
|
IStepExecutor steps = ContextRegistry.getContext().getStepExecutor()
|
||||||
|
|
||||||
|
Logger.printLocation()
|
||||||
|
|
||||||
|
def env = steps.env()
|
||||||
|
|
||||||
|
steps.installLocalDependencies();
|
||||||
|
|
||||||
|
String vrunnerPath = initVRunnerPath();
|
||||||
|
|
||||||
|
Logger.println("Сборка расширений")
|
||||||
|
|
||||||
|
String sourceDirName = ""
|
||||||
|
if (config.sourceFormat == SourceFormat.EDT) {
|
||||||
|
sourceDirName = "$env.WORKSPACE/$EdtToDesignerFormatTransformation.EXTENSION_DIR"
|
||||||
|
} else {
|
||||||
|
sourceDirName = "$env.WORKSPACE"
|
||||||
|
}
|
||||||
|
extractConvertedExtensions(sourceDirName, steps)
|
||||||
|
|
||||||
|
String pathToExtensionDir = "$env.WORKSPACE/${EXTENSIONS_OUT_DIR}/"
|
||||||
|
FilePath localPathToExtensionDir = FileUtils.getFilePath(pathToExtensionDir)
|
||||||
|
localPathToExtensionDir.mkdirs()
|
||||||
|
|
||||||
|
config.initInfoBaseOptions.extensions.each {
|
||||||
|
if (it.initMethod == InitExtensionMethod.SOURCE) {
|
||||||
|
Logger.println("Сборка расширения ${it.name} из исходников")
|
||||||
|
String srcDir = getSrcDir(it, sourceDirName)
|
||||||
|
buildExtension(it, srcDir, vrunnerPath, steps)
|
||||||
|
} else if (it.initMethod == InitExtensionMethod.FILE){
|
||||||
|
Logger.println("Загрузка расширения ${it.name} из ${it.path}")
|
||||||
|
loadExtension(it, env)
|
||||||
|
} else {
|
||||||
|
Logger.println("Неизвестный метод инициализации расширения ${it.name}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void buildExtension(Extension extension, String srcDir, String vrunnerPath, IStepExecutor steps) {
|
||||||
|
|
||||||
|
def compileExtCommand = "$vrunnerPath compileexttocfe --src ${srcDir} --out $EXTENSIONS_OUT_DIR/${extension.name}.cfe"
|
||||||
|
List<String> logosConfig = ["LOGOS_CONFIG=$config.logosConfig"]
|
||||||
|
steps.withEnv(logosConfig) {
|
||||||
|
VRunner.exec(compileExtCommand)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadExtension(Extension extension, def env) {
|
||||||
|
String pathToExtension = "$env.WORKSPACE/${EXTENSIONS_OUT_DIR}/${extension.name}.cfe"
|
||||||
|
FilePath localPathToExtension = FileUtils.getFilePath(pathToExtension)
|
||||||
|
|
||||||
|
if (isValidUrl(extension.path)) {
|
||||||
|
// If the path is a URL, download the file
|
||||||
|
localPathToExtension.copyFrom(new URL(extension.path))
|
||||||
|
} else {
|
||||||
|
// If the path is a local file, copy the file
|
||||||
|
String localPath = getAbsolutePath(extension.path, env)
|
||||||
|
FilePath localFilePath = FileUtils.getFilePath(localPath)
|
||||||
|
localPathToExtension.copyFrom(localFilePath)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private String initVRunnerPath() {
|
||||||
|
return VRunner.getVRunnerPath()
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getSrcDir(Extension extension, String sourceDirName) {
|
||||||
|
if (config.sourceFormat == SourceFormat.EDT) {
|
||||||
|
return "${sourceDirName}/${extension.name}"
|
||||||
|
} else {
|
||||||
|
return "${sourceDirName}/${extension.path}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void extractConvertedExtensions(String sourceDirName, IStepExecutor steps) {
|
||||||
|
if (config.sourceFormat == SourceFormat.EDT) {
|
||||||
|
// usntash and unzip the edt to designer format transformation
|
||||||
|
steps.unstash(EdtToDesignerFormatTransformation.EXTENSION_ZIP_STASH)
|
||||||
|
steps.unzip(sourceDirName, EdtToDesignerFormatTransformation.EXTENSION_ZIP)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isValidUrl(String url) {
|
||||||
|
try {
|
||||||
|
new URL(url)
|
||||||
|
return true
|
||||||
|
} catch (MalformedURLException e) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getAbsolutePath(String path, def env) {
|
||||||
|
if (path.startsWith("/") || path.startsWith("\\") || path.matches("^[A-Za-z]:.*")) {
|
||||||
|
return path
|
||||||
|
} else {
|
||||||
|
return "${env.WORKSPACE}/${path}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
55
src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy
Normal file
55
src/ru/pulsar/jenkins/library/steps/LoadExtensions.groovy
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
package ru.pulsar.jenkins.library.steps
|
||||||
|
|
||||||
|
import ru.pulsar.jenkins.library.IStepExecutor
|
||||||
|
import ru.pulsar.jenkins.library.configuration.JobConfiguration
|
||||||
|
import ru.pulsar.jenkins.library.configuration.InitInfoBaseOptions.Extension
|
||||||
|
import ru.pulsar.jenkins.library.ioc.ContextRegistry
|
||||||
|
import ru.pulsar.jenkins.library.utils.Logger
|
||||||
|
import ru.pulsar.jenkins.library.utils.VRunner
|
||||||
|
import hudson.FilePath
|
||||||
|
import ru.pulsar.jenkins.library.utils.FileUtils
|
||||||
|
|
||||||
|
class LoadExtensions implements Serializable {
|
||||||
|
|
||||||
|
private final JobConfiguration config;
|
||||||
|
|
||||||
|
LoadExtensions(JobConfiguration config) {
|
||||||
|
this.config = config
|
||||||
|
}
|
||||||
|
|
||||||
|
def run() {
|
||||||
|
IStepExecutor steps = ContextRegistry.getContext().getStepExecutor()
|
||||||
|
|
||||||
|
Logger.printLocation()
|
||||||
|
|
||||||
|
def env = steps.env();
|
||||||
|
String cfeDir = "$env.WORKSPACE/$GetExtensions.EXTENSIONS_OUT_DIR"
|
||||||
|
|
||||||
|
String vrunnerPath = VRunner.getVRunnerPath();
|
||||||
|
|
||||||
|
config.initInfoBaseOptions.extensions.each {
|
||||||
|
Logger.println("Установим расширение ${it.name}")
|
||||||
|
loadExtension(it, vrunnerPath, steps, cfeDir)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadExtension (Extension extension, String vrunnerPath, IStepExecutor steps, String cfeDir) {
|
||||||
|
|
||||||
|
String pathToExt = "$cfeDir/${extension.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"'
|
||||||
|
|
||||||
|
List<String> logosConfig = ["LOGOS_CONFIG=$config.logosConfig"]
|
||||||
|
steps.withEnv(logosConfig) {
|
||||||
|
VRunner.exec(loadCommand)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -1,6 +1,11 @@
|
|||||||
{
|
{
|
||||||
"v8version": "8.3.12.1500",
|
"v8version": "8.3.12.1500",
|
||||||
"initInfobase": {
|
"initInfobase": {
|
||||||
"initMethod": "fromSource"
|
"initMethod": "fromSource",
|
||||||
|
"extensions": [{
|
||||||
|
"name": "Тест",
|
||||||
|
"initMethod": "fromSource",
|
||||||
|
"path": "/src/cfe/тест"
|
||||||
|
}]
|
||||||
}
|
}
|
||||||
}
|
}
|
10
vars/getExtensions.groovy
Normal file
10
vars/getExtensions.groovy
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
import ru.pulsar.jenkins.library.configuration.JobConfiguration
|
||||||
|
import ru.pulsar.jenkins.library.ioc.ContextRegistry
|
||||||
|
import ru.pulsar.jenkins.library.steps.GetExtensions
|
||||||
|
|
||||||
|
def call(JobConfiguration config) {
|
||||||
|
ContextRegistry.registerDefaultContext(this)
|
||||||
|
|
||||||
|
def getExtensions = new GetExtensions(config)
|
||||||
|
getExtensions.run()
|
||||||
|
}
|
10
vars/loadExtensions.groovy
Normal file
10
vars/loadExtensions.groovy
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
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) {
|
||||||
|
ContextRegistry.registerDefaultContext(this)
|
||||||
|
|
||||||
|
def loadExtensions = new LoadExtensions(config)
|
||||||
|
loadExtensions.run()
|
||||||
|
}
|
@@ -76,10 +76,22 @@ void call() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
stages {
|
stages {
|
||||||
|
stage('Сборка расширений из исходников') {
|
||||||
|
when {
|
||||||
|
expression { config.needLoadExtensions() }
|
||||||
|
}
|
||||||
|
steps {
|
||||||
|
timeout(time: config.timeoutOptions.getBinaries, unit: TimeUnit.MINUTES) {
|
||||||
|
createDir('build/out/cfe')
|
||||||
|
// Соберем или загрузим cfe из исходников и положим их в папку build/out/cfe
|
||||||
|
getExtensions config
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
stage('Создание ИБ') {
|
stage('Создание ИБ') {
|
||||||
steps {
|
steps {
|
||||||
timeout(time: config.timeoutOptions.createInfoBase, unit: TimeUnit.MINUTES) {
|
timeout(time: config.timeoutOptions.createInfoBase, unit: TimeUnit.MINUTES) {
|
||||||
createDir('build/out')
|
createDir('build/out/')
|
||||||
|
|
||||||
script {
|
script {
|
||||||
if (config.infoBaseFromFiles()) {
|
if (config.infoBaseFromFiles()) {
|
||||||
@@ -107,6 +119,18 @@ void call() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
stage('Загрузка расширений в конфигурацию'){
|
||||||
|
when {
|
||||||
|
beforeAgent true
|
||||||
|
expression { config.needLoadExtensions() }
|
||||||
|
}
|
||||||
|
steps {
|
||||||
|
timeout(time: config.timeoutOptions.loadExtensions, unit: TimeUnit.MINUTES) {
|
||||||
|
loadExtensions config
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
stage('Архивация ИБ') {
|
stage('Архивация ИБ') {
|
||||||
steps {
|
steps {
|
||||||
timeout(time: config.timeoutOptions.zipInfoBase, unit: TimeUnit.MINUTES) {
|
timeout(time: config.timeoutOptions.zipInfoBase, unit: TimeUnit.MINUTES) {
|
||||||
|
Reference in New Issue
Block a user