1
0

Merge pull request #104 from Segate-ekb/develop

Загрузка расширений в конфигурацию для прогона тестов.
This commit is contained in:
Nikita Fedkin
2024-03-17 10:04:26 +03:00
committed by GitHub
16 changed files with 695 additions and 284 deletions

View File

@@ -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
![image](https://user-images.githubusercontent.com/1132840/140793320-d0856afe-0864-4f0e-8964-6a9d6d5822b4.png) ![image](https://github.com/firstBitMarksistskaya/jenkins-lib/assets/80944823/e34a0112-2fe5-4116-92ac-8fcca08bba43)
## Конфигурирование ## Конфигурирование
@@ -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"
}
]
}
```

View File

@@ -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": [

View File

@@ -1,368 +1,405 @@
{ {
"type" : "object", "type": "object",
"id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:JobConfiguration", "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:JobConfiguration",
"properties" : { "properties": {
"v8version" : { "v8version": {
"type" : "string", "type": "string",
"description" : "Версия платформы 1С:Предприятие в формате 8.3.хх.хххх." "description": "Версия платформы 1С:Предприятие в формате 8.3.хх.хххх."
}, },
"edtVersion" : { "edtVersion": {
"type" : "string", "type": "string",
"description" : "Версия модуля 1C:Enterprise Development Tools формате xxxx.x.x:x86_64" "description": "Версия модуля 1C:Enterprise Development Tools формате xxxx.x.x:x86_64"
}, },
"srcDir" : { "srcDir": {
"type" : "string", "type": "string",
"description" : "Путь к корневому каталогу с исходниками конфигурации, в случае хранения исходников в формате EDT, необходимо указать путь к проекту" "description": "Путь к корневому каталогу с исходниками конфигурации, в случае хранения исходников в формате EDT, необходимо указать путь к проекту"
}, },
"sourceFormat" : { "sourceFormat": {
"type" : "string", "type": "string",
"description" : "Формат исходников конфигурации", "description": "Формат исходников конфигурации",
"enum" : [ "edt", "designer" ] "enum": ["edt", "designer"]
}, },
"defaultBranch" : { "defaultBranch": {
"type" : "string", "type": "string",
"description" : "Имя ветки по умолчанию. Значение по умолчанию - main." "description": "Имя ветки по умолчанию. Значение по умолчанию - main."
}, },
"secrets" : { "secrets": {
"type" : "object", "type": "object",
"id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:Secrets", "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:Secrets",
"description" : "Идентификаторы сохраненных секретов", "description": "Идентификаторы сохраненных секретов",
"properties" : { "properties": {
"storagePath" : { "storagePath": {
"type" : "string", "type": "string",
"description" : "Путь к хранилищу конфигурации" "description": "Путь к хранилищу конфигурации"
}, },
"storage" : { "storage": {
"type" : "string", "type": "string",
"description" : "Данные авторизации в хранилище конфигурации" "description": "Данные авторизации в хранилище конфигурации"
}, },
"telegramChatId" : { "telegramChatId": {
"type" : "string", "type": "string",
"description" : "Идентификатор telegram-чата для отправки уведомлений" "description": "Идентификатор telegram-чата для отправки уведомлений"
}, },
"telegramBotToken" : { "telegramBotToken": {
"type" : "string", "type": "string",
"description" : "Токен авторизации telegram-бота для отправки уведомлений" "description": "Токен авторизации telegram-бота для отправки уведомлений"
} }
} }
}, },
"stages" : { "stages": {
"type" : "object", "type": "object",
"id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:StageFlags", "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:StageFlags",
"description" : "Включение этапов сборок", "description": "Включение этапов сборок",
"properties" : { "properties": {
"sonarqube" : { "sonarqube": {
"type" : "boolean", "type": "boolean",
"description" : "Анализ SonarQube включен" "description": "Анализ SonarQube включен"
}, },
"syntaxCheck" : { "syntaxCheck": {
"type" : "boolean", "type": "boolean",
"description" : "Синтаксический контроль включен" "description": "Синтаксический контроль включен"
}, },
"edtValidate" : { "edtValidate": {
"type" : "boolean", "type": "boolean",
"description" : "Валидация EDT включена" "description": "Валидация EDT включена"
}, },
"smoke" : { "smoke": {
"type" : "boolean", "type": "boolean",
"description" : "Дымовые тесты включены" "description": "Дымовые тесты включены"
}, },
"initSteps" : { "initSteps": {
"type" : "boolean", "type": "boolean",
"description" : "Предварительные шаги инициализации включены" "description": "Предварительные шаги инициализации включены"
}, },
"bdd" : { "bdd": {
"type" : "boolean", "type": "boolean",
"description" : "Запуск BDD сценариев включен" "description": "Запуск BDD сценариев включен"
}, },
"email" : { "email": {
"type" : "boolean", "type": "boolean",
"description" : "Выполнять рассылку результатов сборки на email" "description": "Выполнять рассылку результатов сборки на email"
}, },
"telegram" : { "telegram": {
"type" : "boolean", "type": "boolean",
"description" : "Выполнять рассылку результатов сборки в telegram" "description": "Выполнять рассылку результатов сборки в telegram"
} }
} }
}, },
"timeout" : { "timeout": {
"type" : "object", "type": "object",
"id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:TimeoutOptions", "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:TimeoutOptions",
"description" : "Настройка таймаутов для шагов", "description": "Настройка таймаутов для шагов",
"properties" : { "properties": {
"edtToDesignerFormatTransformation" : { "edtToDesignerFormatTransformation": {
"type" : "integer", "type": "integer",
"description" : "Таймаут шага трансформации исходников из формата EDT в формат Конфигуратора, в минутах.\n По умолчанию содержит значение 60.\n " "description": "Таймаут шага трансформации исходников из формата EDT в формат Конфигуратора, в минутах.\n По умолчанию содержит значение 60.\n "
}, },
"createInfoBase" : { "getBinaries": {
"type" : "integer", "type": "integer",
"description" : "Таймаут шага создания информационной базы, в минутах.\n По умолчанию содержит значение 60.\n " "description": "Таймаут шага получения бинарников, в минутах.\n По умолчанию содержит значение 60.\n "
}, },
"initInfoBase" : { "createInfoBase": {
"type" : "integer", "type": "integer",
"description" : "Таймаут шага инициализации информационной базы, в минутах.\n По умолчанию содержит значение 60.\n " "description": "Таймаут шага создания информационной базы, в минутах.\n По умолчанию содержит значение 60.\n "
}, },
"zipInfoBase" : { "initInfoBase": {
"type" : "integer", "type": "integer",
"description" : "Таймаут шага архивирования информационной базы, в минутах.\n По умолчанию содержит значение 60.\n " "description": "Таймаут шага инициализации информационной базы, в минутах.\n По умолчанию содержит значение 60.\n "
}, },
"designerToEdtFormatTransformation" : { "loadExtensions": {
"type" : "integer", "type": "integer",
"description" : "Таймаут шага трансформации исходников из формата Конфигуратора в формат EDT, в минутах.\n По умолчанию содержит значение 60.\n " "description": "Таймаут шага загрузки расширений в базу, в минутах.\n По умолчанию содержит значение 60.\n "
}, },
"edtValidate" : { "zipInfoBase": {
"type" : "integer", "type": "integer",
"description" : "Таймаут шага валидации EDT, в минутах.\n По умолчанию содержит значение 240.\n " "description": "Таймаут шага архивирования информационной базы, в минутах.\n По умолчанию содержит значение 60.\n "
}, },
"resultTransformation" : { "designerToEdtFormatTransformation": {
"type" : "integer", "type": "integer",
"description" : "Таймаут шага трансформации результатов EDT, в минутах.\n По умолчанию содержит значение 10.\n " "description": "Таймаут шага трансформации исходников из формата Конфигуратора в формат EDT, в минутах.\n По умолчанию содержит значение 60.\n "
}, },
"bdd" : { "edtValidate": {
"type" : "integer", "type": "integer",
"description" : "Таймаут шага проверки сценариев поведения, в минутах.\n По умолчанию содержит значение 120.\n " "description": "Таймаут шага валидации EDT, в минутах.\n По умолчанию содержит значение 240.\n "
}, },
"syntaxCheck" : { "resultTransformation": {
"type" : "integer", "type": "integer",
"description" : "Таймаут шага синтаксического контроля, в минутах.\n По умолчанию содержит значение 240.\n " "description": "Таймаут шага трансформации результатов EDT, в минутах.\n По умолчанию содержит значение 10.\n "
}, },
"smoke" : { "bdd": {
"type" : "integer", "type": "integer",
"description" : "Таймаут шага дымовых тестов, в минутах.\n По умолчанию содержит значение 240.\n " "description": "Таймаут шага проверки сценариев поведения, в минутах.\n По умолчанию содержит значение 120.\n "
}, },
"sonarqube" : { "syntaxCheck": {
"type" : "integer", "type": "integer",
"description" : "Таймаут шага статического анализа SonarQube, в минутах.\n По умолчанию содержит значение 90.\n " "description": "Таймаут шага синтаксического контроля, в минутах.\n По умолчанию содержит значение 240.\n "
},
"smoke": {
"type": "integer",
"description": "Таймаут шага дымовых тестов, в минутах.\n По умолчанию содержит значение 240.\n "
},
"sonarqube": {
"type": "integer",
"description": "Таймаут шага статического анализа SonarQube, в минутах.\n По умолчанию содержит значение 90.\n "
} }
} }
}, },
"initInfobase" : { "initInfobase": {
"type" : "object", "type": "object",
"id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:InitInfoBaseOptions", "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:InitInfoBaseOptions",
"description" : "Настройки шага инициализации ИБ", "description": "Настройки шага инициализации ИБ",
"properties" : { "properties": {
"initMethod" : { "initMethod": {
"type" : "string", "type": "string",
"description" : "\n Способ инициализации информационной базы.\n Поддерживается три варианта:\n * fromStorage - инициализация информационной базы из хранилища конфигурации;\n * fromSource - инициализация информационной базы из исходников конфигурации;\n * defaultBranchFromStorage - инициализация основной ветки из хранилища конфигурации, остальных - из исходников конфигурации.\n По умолчанию содержит значение \"fromStorage\".", "description": "\n Способ инициализации информационной базы.\n Поддерживается три варианта:\n * fromStorage - инициализация информационной базы из хранилища конфигурации;\n * fromSource - инициализация информационной базы из исходников конфигурации;\n * defaultBranchFromStorage - инициализация основной ветки из хранилища конфигурации, остальных - из исходников конфигурации.\n По умолчанию содержит значение \"fromStorage\".",
"enum" : [ "fromStorage", "fromSource", "defaultBranchFromStorage" ] "enum": ["fromStorage", "fromSource", "defaultBranchFromStorage"]
}, },
"runMigration" : { "runMigration": {
"type" : "boolean", "type": "boolean",
"description" : "Запустить миграцию ИБ" "description": "Запустить миграцию ИБ"
}, },
"additionalInitializationSteps" : { "additionalInitializationSteps": {
"type" : "array", "type": "array",
"description" : "Дополнительные шаги, запускаемые через vrunner.\n В каждой строке передается отдельная команда \n vrunner и ее аргументы (например, \"vanessa --settings ./tools/vrunner.first.json\")\n ", "description": "Дополнительные шаги, запускаемые через vrunner.\n В каждой строке передается отдельная команда \n vrunner и ее аргументы (например, \"vanessa --settings ./tools/vrunner.first.json\")\n ",
"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-файлу"
}
}
} }
} }
} }
}, },
"bdd" : { "bdd": {
"type" : "object", "type": "object",
"id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:BddOptions", "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:BddOptions",
"description" : "Настройки шага запуска BDD сценариев", "description": "Настройки шага запуска BDD сценариев",
"properties" : { "properties": {
"vrunnerSteps" : { "vrunnerSteps": {
"type" : "array", "type": "array",
"description" : "Шаги, запускаемые через vrunner.\n В каждой строке передается отдельная команда \n vrunner и ее аргументы (например, \"vanessa --settings ./tools/vrunner.json\").\n По умолчанию содержит одну команду \"vanessa --settings ./tools/vrunner.json\".\n ", "description": "Шаги, запускаемые через vrunner.\n В каждой строке передается отдельная команда \n vrunner и ее аргументы (например, \"vanessa --settings ./tools/vrunner.json\").\n По умолчанию содержит одну команду \"vanessa --settings ./tools/vrunner.json\".\n ",
"items" : { "items": {
"type" : "string" "type": "string"
} }
} }
} }
}, },
"sonarqube" : { "sonarqube": {
"type" : "object", "type": "object",
"id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:SonarQubeOptions", "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:SonarQubeOptions",
"description" : "Настройки анализа SonarQube", "description": "Настройки анализа SonarQube",
"properties" : { "properties": {
"sonarQubeInstallation" : { "sonarQubeInstallation": {
"type" : "string", "type": "string",
"description" : "Имя настроенного SonarQube-сервера (SonarQube installations).\nЕсли настроен только один сервер, то может быть оставлено пустым." "description": "Имя настроенного SonarQube-сервера (SonarQube installations).\nЕсли настроен только один сервер, то может быть оставлено пустым."
}, },
"useSonarScannerFromPath" : { "useSonarScannerFromPath": {
"type" : "boolean", "type": "boolean",
"description" : "Использовать sonar-scanner, доступный в PATH" "description": "Использовать sonar-scanner, доступный в PATH"
}, },
"sonarScannerToolName" : { "sonarScannerToolName": {
"type" : "string", "type": "string",
"description" : "Имя настроенной утилиты sonar-scanner.\nПрименяется, если useSonarScannerFromPath установлено в false." "description": "Имя настроенной утилиты sonar-scanner.\nПрименяется, если useSonarScannerFromPath установлено в false."
}, },
"infoBaseUpdateModuleName" : { "infoBaseUpdateModuleName": {
"type" : "string", "type": "string",
"description" : "Имя общего модуля (например, ОбновлениеИнформационнойБазыXXX), в котором указана версия библиотеки.\n Версия должна задаваться в виде присвоения `Описание.Версия = \"ваш номер версии\";`\n " "description": "Имя общего модуля (например, ОбновлениеИнформационнойБазыXXX), в котором указана версия библиотеки.\n Версия должна задаваться в виде присвоения `Описание.Версия = \"ваш номер версии\";`\n "
}, },
"branchAnalysisConfiguration" : { "branchAnalysisConfiguration": {
"type" : "string", "type": "string",
"description" : "Вариант конфигурации branch plugin.\n Поддерживаемые варианты:\n * auto - применяется автоконфигурация sonar-scanner силами branchplugin. Так же может применяться для отключения конфигурирования, если branch plugin отсутствует;\n * fromEnv - применяется ручная конфигурация sonar-scanner на основе переменных среды.\n Значение по умолчанию: fromEnv.", "description": "Вариант конфигурации branch plugin.\n Поддерживаемые варианты:\n * auto - применяется автоконфигурация sonar-scanner силами branchplugin. Так же может применяться для отключения конфигурирования, если branch plugin отсутствует;\n * fromEnv - применяется ручная конфигурация sonar-scanner на основе переменных среды.\n Значение по умолчанию: fromEnv.",
"enum" : [ "auto", "fromEnv" ] "enum": ["auto", "fromEnv"]
}, },
"waitForQualityGate" : { "waitForQualityGate": {
"type" : "boolean", "type": "boolean",
"description" : "Ожидать состояние Quality Gate от SonarQube после загрузки анализа. По умолчанию `false`.\n Таймаут ожидания состояния равен таймауту шага.\n " "description": "Ожидать состояние Quality Gate от SonarQube после загрузки анализа. По умолчанию `false`.\n Таймаут ожидания состояния равен таймауту шага.\n "
} }
} }
}, },
"syntaxCheck" : { "syntaxCheck": {
"type" : "object", "type": "object",
"id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:SyntaxCheckOptions", "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:SyntaxCheckOptions",
"description" : "Настройки синтаксического контроля", "description": "Настройки синтаксического контроля",
"properties" : { "properties": {
"pathToJUnitReport" : { "pathToJUnitReport": {
"type" : "string", "type": "string",
"description" : "Путь к файлу отчета jUnit\n По умолчанию содержит значение \"./build/out/jUnit/syntax.xml\"\n " "description": "Путь к файлу отчета jUnit\n По умолчанию содержит значение \"./build/out/jUnit/syntax.xml\"\n "
}, },
"groupErrorsByMetadata" : { "groupErrorsByMetadata": {
"type" : "boolean", "type": "boolean",
"description" : "Группировать выявленные ошибки по объектам метаданных.\n По умолчанию включено.\n " "description": "Группировать выявленные ошибки по объектам метаданных.\n По умолчанию включено.\n "
}, },
"checkModes" : { "checkModes": {
"type" : "array", "type": "array",
"description" : "Режимы проверки конфигурации", "description": "Режимы проверки конфигурации",
"items" : { "items": {
"type" : "string" "type": "string"
} }
}, },
"exceptionFile" : { "exceptionFile": {
"type" : "string", "type": "string",
"description" : "Путь к файлу с указанием пропускаемых ошибок.\n Формат файла: в каждой строке файла указан текст пропускаемого исключения или его часть\n Кодировка: UTF-8\n " "description": "Путь к файлу с указанием пропускаемых ошибок.\n Формат файла: в каждой строке файла указан текст пропускаемого исключения или его часть\n Кодировка: UTF-8\n "
}, },
"vrunnerSettings" : { "vrunnerSettings": {
"type" : "string", "type": "string",
"description" : "Путь к конфигурационному файлу vanessa-runner.\n По умолчанию содержит значение \"./tools/vrunner.json\".\n " "description": "Путь к конфигурационному файлу vanessa-runner.\n По умолчанию содержит значение \"./tools/vrunner.json\".\n "
} }
} }
}, },
"smoke" : { "smoke": {
"type" : "object", "type": "object",
"id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:SmokeTestOptions", "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:SmokeTestOptions",
"description" : "Настройки дымового тестирования", "description": "Настройки дымового тестирования",
"properties" : { "properties": {
"vrunnerSettings" : { "vrunnerSettings": {
"type" : "string", "type": "string",
"description" : "Путь к конфигурационному файлу vanessa-runner.\n По умолчанию содержит значение \"./tools/vrunner.json\".\n " "description": "Путь к конфигурационному файлу vanessa-runner.\n По умолчанию содержит значение \"./tools/vrunner.json\".\n "
}, },
"xddConfigPath" : { "xddConfigPath": {
"type" : "string", "type": "string",
"description" : "Путь к конфигурационному файлу для xddTestRunner.\n По умолчанию содержит значение \"./tools/xUnitParams.json\".\n " "description": "Путь к конфигурационному файлу для xddTestRunner.\n По умолчанию содержит значение \"./tools/xUnitParams.json\".\n "
}, },
"publishToAllureReport" : { "publishToAllureReport": {
"type" : "boolean", "type": "boolean",
"description" : "Выполнять публикацию результатов в отчет Allure.\n По умолчанию выключено.\n " "description": "Выполнять публикацию результатов в отчет Allure.\n По умолчанию выключено.\n "
}, },
"publishToJUnitReport" : { "publishToJUnitReport": {
"type" : "boolean", "type": "boolean",
"description" : "Выполнять публикацию результатов в отчет JUnit.\n По умолчанию включено.\n " "description": "Выполнять публикацию результатов в отчет JUnit.\n По умолчанию включено.\n "
} }
} }
}, },
"resultsTransform" : { "resultsTransform": {
"type" : "object", "type": "object",
"id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:ResultsTransformOptions", "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:ResultsTransformOptions",
"description" : "Настройки трансформации результатов анализа", "description": "Настройки трансформации результатов анализа",
"properties" : { "properties": {
"removeSupport" : { "removeSupport": {
"type" : "boolean", "type": "boolean",
"description" : "Фильтровать замечания по уровню поддержки модуля. По умолчанию включено." "description": "Фильтровать замечания по уровню поддержки модуля. По умолчанию включено."
}, },
"supportLevel" : { "supportLevel": {
"type" : "integer", "type": "integer",
"description" : "Настройка фильтрации замечаний по уровню поддержки.\n 0 - удалить файлы на замке;\n 1 - удалить файлы на замке и на поддержке;\n 2 - удалить файлы на замке, на поддержке и снятые с поддержки.\n " "description": "Настройка фильтрации замечаний по уровню поддержки.\n 0 - удалить файлы на замке;\n 1 - удалить файлы на замке и на поддержке;\n 2 - удалить файлы на замке, на поддержке и снятые с поддержки.\n "
} }
} }
}, },
"notifications" : { "notifications": {
"type" : "object", "type": "object",
"id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:NotificationsOptions", "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:NotificationsOptions",
"description" : "Настройки рассылки результатов сборки", "description": "Настройки рассылки результатов сборки",
"properties" : { "properties": {
"email" : { "email": {
"type" : "object", "type": "object",
"id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:EmailNotificationOptions", "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:EmailNotificationOptions",
"description" : "Настройки рассылки результатов сборки через email", "description": "Настройки рассылки результатов сборки через email",
"properties" : { "properties": {
"onAlways" : { "onAlways": {
"type" : "boolean", "type": "boolean",
"description" : "Отправлять всегда" "description": "Отправлять всегда"
}, },
"onSuccess" : { "onSuccess": {
"type" : "boolean", "type": "boolean",
"description" : "Отправлять при успешной сборке" "description": "Отправлять при успешной сборке"
}, },
"onFailure" : { "onFailure": {
"type" : "boolean", "type": "boolean",
"description" : "Отправлять при падении сборки" "description": "Отправлять при падении сборки"
}, },
"onUnstable" : { "onUnstable": {
"type" : "boolean", "type": "boolean",
"description" : "Отправлять при нестабильной сборке" "description": "Отправлять при нестабильной сборке"
}, },
"alwaysOptions" : { "alwaysOptions": {
"type" : "object", "type": "object",
"id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:email:EmailExtConfiguration", "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:email:EmailExtConfiguration",
"properties" : { "properties": {
"attachLog" : { "attachLog": {
"type" : "boolean" "type": "boolean"
}, },
"directRecipients" : { "directRecipients": {
"type" : "array", "type": "array",
"items" : { "items": {
"type" : "string" "type": "string"
} }
}, },
"recipientProviders" : { "recipientProviders": {
"type" : "array", "type": "array",
"items" : { "items": {
"type" : "string", "type": "string",
"enum" : [ "developers", "requestor", "brokenBuildSuspects", "brokenTestsSuspects" ] "enum": [
"developers",
"requestor",
"brokenBuildSuspects",
"brokenTestsSuspects"
]
} }
} }
} }
}, },
"successOptions" : { "successOptions": {
"type" : "object", "type": "object",
"$ref" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:email:EmailExtConfiguration" "$ref": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:email:EmailExtConfiguration"
}, },
"failureOptions" : { "failureOptions": {
"type" : "object", "type": "object",
"$ref" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:email:EmailExtConfiguration" "$ref": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:email:EmailExtConfiguration"
}, },
"unstableOptions" : { "unstableOptions": {
"type" : "object", "type": "object",
"$ref" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:email:EmailExtConfiguration" "$ref": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:email:EmailExtConfiguration"
} }
} }
}, },
"telegram" : { "telegram": {
"type" : "object", "type": "object",
"id" : "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:TelegramNotificationOptions", "id": "urn:jsonschema:ru:pulsar:jenkins:library:configuration:notification:TelegramNotificationOptions",
"description" : "Настройки рассылки результатов сборки через telegram", "description": "Настройки рассылки результатов сборки через telegram",
"properties" : { "properties": {
"onAlways" : { "onAlways": {
"type" : "boolean", "type": "boolean",
"description" : "Отправлять всегда" "description": "Отправлять всегда"
}, },
"onSuccess" : { "onSuccess": {
"type" : "boolean", "type": "boolean",
"description" : "Отправлять при успешной сборке" "description": "Отправлять при успешной сборке"
}, },
"onFailure" : { "onFailure": {
"type" : "boolean", "type": "boolean",
"description" : "Отправлять при падении сборки" "description": "Отправлять при падении сборки"
}, },
"onUnstable" : { "onUnstable": {
"type" : "boolean", "type": "boolean",
"description" : "Отправлять при нестабильной сборке" "description": "Отправлять при нестабильной сборке"
} }
} }
} }
} }
}, },
"logosConfig" : { "logosConfig": {
"type" : "string", "type": "string",
"description" : "Конфигурация библиотеки logos. Применяется перед запуском каждой стадии сборки" "description": "Конфигурация библиотеки logos. Применяется перед запуском каждой стадии сборки"
} }
} }
} }

View File

@@ -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) {

View File

@@ -0,0 +1,12 @@
package ru.pulsar.jenkins.library.configuration
import com.fasterxml.jackson.annotation.JsonProperty
enum InitExtensionMethod {
@JsonProperty("fromSource")
SOURCE,
@JsonProperty("fromFile")
FILE
}

View 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 +
'}'; '}';
} }
} }

View File

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

View File

@@ -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.
''') ''')

View File

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

View 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}"
}
}
}

View 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)
}
}
}

View File

@@ -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
View 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()
}

View 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()
}

View File

@@ -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) {