DevCommon.groovy#

Jenkins библиотека с общими и часто используемыми функциями.

Подключение библиотеки к Step/Pipeline осуществляется с помощью конструкции: import ru.sbrf.devops.DevCommon

Допустимо два варианта инициализации библиотеки:

  1. Обращение с объявлением config:

    1. С включенной валидацией параметров: def dev = new DevCommon(this, config, config.paramsForValid)

    2. С выключенной валидацией параметров: def dev = new DevCommon(this, config)

    Пример вызова метода:

    dev.syncRemoteRepo(workspace, needVault, GitUrlSourcesFrom, GitBranchSourcesFrom, GitUrlSourcesTo, GitBranchSourcesTo, GitCredentialsId)

  2. Обращение без объявления config:

    1. С включенной валидацией параметров: def dev = new DevCommon(this, null, paramsForValid)

    2. С выключенной валидацией параметров: def dev = new DevCommon(this)

    Пример вызова метода (в данном случае требуется заполнять все параметры вызываемых методов библиотеки):

    dev.syncRemoteRepo(workspace, needVault, GitUrlSourcesFrom, GitBranchSourcesFrom, GitUrlSourcesTo, GitBranchSourcesTo, GitCredentialsId, credentialTypes, configurationBlock)

Методы с входными параметрами

Описание

def mapToList(depmap)

/**
* Метод преобразования словаря в список
* @param depmap - словарь для преобразования
*/

def getValidatedParams()

/**
* Метод возвращения провалидированных параметров
* @return провалидированные параметры
*/

def checkoutRepo(GitUrlSources, GitBranchSources, GitCredentialsId)

/**
* Метод checkout репозитория
* @param GitUrlSources - ssh ссылка на репозиторий
* @param GitBranchSources - ветка в репозитории
* @param GitCredentialsId - credential для доступа в репозиторий
*/

def checkoutRepoWithRefspec(GitUrlSources, GitBranchSources, GitCredentialsId)

/**
* Метод checkout репозитория с использованием refspec
* @param GitUrlSources - ssh ссылка на репозиторий
* @param GitBranchSources - ветка в репозитории
* @param GitCredentialsId - credential для доступа в репозиторий
*/

def pushRepo(String GitUrlSources, String GitBranchSources, String GitCredentialsId, String commitMessage, String AddOptions = "*", Boolean pullRepo = false, String GitBranchSourcesPullRepo = null, String addATag = null)

/**
* Метод push'а изменений в репозиторий
* @param GitUrlSources - ssh ссылка на репозиторий
* @param GitBranchSources - ветка в репозитории
* @param GitCredentialsId - credential для доступа в репозиторий
* @param commitMessage - сообщение в commit
* @param AddOptions - опции для git add. Если не указывать, то выполнится git add
* @param pullRepo - сделать предварительный pull из ветки
* @param GitBranchSourcesPullRepo - ветка в репозитории источника pull
* @param addATag - добавляемый к коммиту тег
*/

def syncRemoteRepo(GitUrlSourcesFrom, GitBranchSourcesFrom, GitUrlSourcesTo, GitBranchSourcesTo, GitCredentialsId)

/**
* Метод синхронизации двух репозиториев
* @param GitUrlSourcesFrom - ssh ссылка на репозиторий из которого брать исходники
* @param GitBranchSourcesFrom - ветка в репозитории из которого брать исходники
* @param GitUrlSourcesTo - ветка в репозитории в которую заливать исходники
* @param GitBranchSourcesTo - ветка в репозитории в которую заливать исходники
* @param GitCredentialsId - credential для доступа в репозиторий
*/

def sendHtmlLetter(def mailList, def title = null, def body, def ccList = null, def needReplaceNewLine = true)

/**
* Метод отправки письма
* @param mailList - список email получателей
* @param title - тема
* @param body - тело письма
* @param ccList - список email получателей (Копия)
* @param needReplaceNewLine - нужно ли заменять символы новой строки
*/

def sendHtmlLetterWithAttach(def mailList, def style = null, def title = null, def body, attachmentsPattern, sendEmail = false, def ccList = null)

/**
* Метод отправки письма с вложением
* @param mailList - список email получателей
* @param style - стили html элементов
* @param title - тема
* @param body - тело письма
* @param attachmentsPattern - вложение. Не содержит символа ':'
* @param sendEmail - условие отправлять ответ запустившему Jenkins Job
*/

def checkFileExists(path)

/**
* Метод проверки существования файла
* @param path - путь до файла
*/

def requestInput(Map args)

/**
* Метод вывода input окна
* @param args - аргументы для окна ввода
* @return результат input
*/

def requestPassword(msg, fields_array, submitterParameter, defaultValue)

/**
* Функция для безопасного запроса пароля, С возможностью работы в job-ах автопроверки PR
* @param msg - сообщение в input
* @param fields_array - поля в input
* @param submitterParameter - разрешенные approvers
* @param defaultValue - значение по умолчанию
* @return результат input
*/

def shellHandler(shellCmd)

/**
* Метод для обработки shell команд. Для случаев когда status code != 0. Иначе в Jenkins выводится не информативная ошибка
* @param shellCmd - Команда для выполнения
* @return Возвращает ответ команды, либо текст ошибки, если статус код != 0
*/

def ansible_vault(String mode, src, String mask = 'secret*.y*ml', String ansibleVaultCredentialsId = config.AnsibleVaultCredentialsId, needInputVault = config.needInputVault, def needPrintOutput = true, DevOpsVenvDir = config.DevOpsVenvDir, pyCMD = config.pyCMD, verbose = config.verbose)

/**
* Метод запуска ansible-vault
* @param mode - Режим работы: decrypt, encrypt
* @param src - Каталог для обработки
* @param mask - Маска поиска файлов для обработки
* @param ansibleVaultCredentialsId - ID credential для шифровки, расшифровки
* @param needInputVault - Флаг самостоятельного ввода пароля для расшифровки secret(s)
* @param needPrintOutput - нужен ли вывод
* @param DevOpsVenvDir - папка DevOpsVenv
* @param pyCMD - версия python
* @param verbose - расширенное логирование
* @return - список путей файлов secret(s) в рабочем пространстве
*/

def ansible_vault_backup(String mode, ArrayList list, String ansibleVaultCredentialsId = config.AnsibleVaultCredentialsId)

/**
* Метод запуска ansible-vault
* @param mode - Режим работы: decrypt, encrypt
* @param list - список файлов для расшифровки
* @param ansibleVaultCredentialsId - ID credential для шифровки, расшифровки
* @return - список путей файлов secret(s) в рабочем пространстве
*/

def sendStashComment(stashCredentialsId, commentText, urlStashApi, needVault = config.needVault, workspace = config.workspace, credentialTypes = config.credentialTypes, configurationBlock = config.configurationVault)

/**
* Метод для отправки комментария в Stash
* @param stashCredentialsId - credential для работы с Stash
* @param commentText - Текст комментария
* @param urlStashApi - ссылка на rest api Stash
* @param needVault - требуется хранилище
* @param workspace - рабочее пространство
* @param credentialTypes - Типы Credential - Jenkins : Vault
* @param configurationBlock - настройки для HashiCorp Vault
*/

def changeApproveStatus(stashCredentialsId, stash, project, repo, prId, status, needVault = config.needVault, workspace = config.workspace, credentialTypes = config.credentialTypes, configurationBlock = config.configurationVault)

/**
* Метод для изменения approve на merge технической учетной записью
* @param stashCredentialsId - credential для работы с Stash
* @param stash - ссылка на stash
* @param project - проект в stash
* @param repo - репозиторий проекта в stash
* @param prID - Id pull-request в stash,
* @param status - Статус, в который нужно перевести approve технической учетной записи: [NEEDS_WORK,APPROVED]
* @param needVault - требуется хранилище
* @param workspace - рабочее пространство
* @param credentialTypes - Типы Credential - Jenkins : Vault
* @param configurationBlock - настройки для HashiCorp Vault
*/

def changeStashUrlApproveStatus(stashCredentialsId, stashUrl, status, needVault = config.needVault, workspace = config.workspace, credentialTypes = config.credentialTypes, configurationBlock = config.configurationVault)

/**
* Метод для изменения approve на merge технической учетной записью по URL
* @param stashCredentialsId - credential для работы с Stash
* @param stashUrl - ссылка Stash
* @param status - Статус, в который нужно перевести approve технической учетной записи: [NEEDS_WORK,APPROVED]
* @param needVault - требуется хранилище
* @param workspace - рабочее пространство
* @param credentialTypes - Типы Credential - Jenkins : Vault
* @param configurationBlock - настройки для HashiCorp Vault
*/

def checkPyV(version, pyCMD = config.pyCMD, verbose = config.verbose)

/**
* Метод получения нужной версии python на slave
* @param version - версия python для проверки
* @param pyCMD - версия python
* @param verbose - расширенное логирование
*/

def convertMapToJson(map)

/**
* Метод преобразования словаря в строку
* @param map - словарь для преобразования
* @return словарь в виде строки
* WARNING: при выводе словаря, созданного этим методом, в лог Jenkins кириллические символы заменяются соответствующим utf-кодом
* Лучше использовать метод Jenkins writeJSON
*/

def getFileName(def path)

/**
* Метод получения имени файла по пути
* @param path - путь к файлу
* @return имя файла
*/

def runPythonLib(String name, def parametes = "", def pythonVersion = 0, def needPrintOutput = true, DevOpsVenvDir = config.DevOpsVenvDir, pyCMD = config.pyCMD, verbose = config.verbose)

/**
* Метод запуска библиотеки python
* @param name - имя запускаемого скрипта
* @param parametes - параметры для запуска
* @param pythonVersion - версия Python
* @param needPrintOutput - нужен ли вывод
* @param DevOpsVenvDir - папка DevOpsVenv
* @param pyCMD - версия python
* @param verbose - расширенное логирование
* @return вывод результата работы python скрипта
*/

def useAdditionalFile(String name, String encoding = null)

/**
* Метод чтения дополнительных файлов
* @param name - имя файла
* @param encoding - кодировка
* @return возвращает содержимое файла
*/

def installDevOpsPyLib(pyCMD = config.pyCMD, DevOpsVenvDir = null)

/**
* Метод установки Python библиотеки
* @param pyCMD - версия python
* @param DevOpsVenvDir - папка DevOpsVenv
*/

def requiredNotEmpty(name, configParam)

/**
* Метод валидации, что параметр не пустой
* @param name - имя параметра
* @param configParam - параметр из словаря config
*/

def requiredNotEmptySCM(git, value, validation)

/**
* Метод валидации, что параметр для репозитория не пустой
* @param git - репозиторий
* @param value - значение
* @param validation - валидация
*/

def requiredLimitedValues(name, allowed_values, configParam, description = "")

/**
* Метод валидации, разрешенных значений для параметра
* @param name - имя параметра
* @param allowed_values - разрешенные значения
* @param configParam - параметр словаря config
* @param description - описание параметра
*/

def optionalParam(name, configParam)

/**
* Метод валидации, что параметр опциональный
* @param name - имя параметра
* @param configParam - параметр словаря config
*/

def setPropsIfNotExist(key, default_value, configParam, description = "")

/**
* Метод валидации, что параметру задается значение по умолчанию, если не задано обратного
* @param key - имя параметра
* @param default_value - значение по умолчанию
* @param configParam - параметр словаря config
* @param description - описание параметра
*/

def git_files_compare(git_list, find_list, int last_remove = 1)

/**
* Метод сравнения списка файлов
* @param git_list - список из Git
* @param find_list - найденный список
* @param last_remove - индекс до которого удалять сегмент пути
* @return возвращает список файлов
*/

def createPullRequest(String stashCredentialsId, String stash, String project, String repo, String from_branch, String to_branch, ArrayList reviewers = [], String title = "", String description = "", ArrayList validResponseCodes = null, ArrayList customHeader = [], Boolean needVault = config.needVault, String workspace = config.workspace, LinkedHashMap credentialTypes = config.credentialTypes, LinkedHashMap configurationBlock = config.configurationVault)

/**
* Создание pull-request для сравнения
* @param stashCredentialsId
* @param stash - HTTP ссылка на stash
* @param project - проект в stash
* @param repo - репозиторий в stash
* @param from_branch - из какой ветки
* @param to_branch - в какую ветку
* @param reviewers - подтверждающие изменения
* @param title - заголовок pull-request
* @param description - описание pull-request
* @param validResponseCodes - отрезок кодов запросов, которые будут считаться успешными
* @param customHeader - персональный заголовок
* @param needVault - требуется хранилище
* @param workspace - рабочее пространство
* @param credentialTypes - Типы Credential - Jenkins : Vault
* @param configurationBlock - настройки для HashiCorp Vault
*/

def getPullRequestActivities(stashCredentialsId, stash, project, repo, pullRequestID, customHeader = [], needVault = config.needVault, workspace = config.workspace, credentialTypes = config.credentialTypes, configurationBlock = config.configurationVault)

/**
* Получения списка активностей pull-request из Bitbucket
* @param stashCredentialsId - credential для работы с Stash
* @param stash - ссылка Stash
* @param project - проект в stash
* @param repo - имя nexus репозитория
* @param pullRequestID - ID pull-request
* @param customHeader - персональный заголовок
* @param needVault - требуется хранилище
* @param workspace - рабочее пространство
* @param credentialTypes - Типы Credential - Jenkins : Vault
* @param configurationBlock - настройки для HashiCorp Vault
* @return Список активностей
*/

def getDiffFromStash(stashCredentialsId, stash, project, repo, path, from, to, customHeader = [], needVault = config.needVault, workspace = config.workspace, credentialTypes = config.credentialTypes, configurationBlock = config.configurationVault)

/**
* Получение diff-а
* @param stashCredentialsId - credential для работы с Stash
* @param stash - ссылка Stash
* @param project - проект в stash
* @param repo - имя nexus репозитория
* @param path - путь до папки или файла из корня git репозитория для которого хотим получить diff
* @param from - ветка в репозитории или commit, начиная с которой отслеживаем изменения
* @param to - ветка в репозитории или commit, до которой отслеживаем изменения
* @param customHeader - персональный заголовок
* @param needVault - требуется хранилище
* @param workspace - рабочее пространство
* @param credentialTypes - Типы Credential - Jenkins : Vault
* @param configurationBlock - настройки для HashiCorp Vault
* @return список с diff-ом
*/

def getPrInfo(stashCredentialsId, stash, id, project, repo, what = '', customHeader = [], needVault = config.needVault, workspace = config.workspace, credentialTypes = config.credentialTypes, configurationBlock = config.configurationVault)

/**
* Метод получения информации о pull-request
* @param stashCredentialsId - Credential для доступа к stash
* @param stash - HTTP ссылка на stash
* @param id - номер pull-request
* @param project - проект в stash
* @param repo - репозиторий в stash
* @param what - что получать
* @param customHeader - персональный заголовок
* @param needVault - требуется хранилище
* @param workspace - рабочее пространство
* @param credentialTypes - Типы Credential - Jenkins : Vault
* @param configurationBlock - настройки для HashiCorp Vault
* @return
*/

def findAllInString(configFile, regularExp, notFind = "")

/**
* Поиск строк, которые удовлетворяют регулярному выражению
* @param configFile - содержимое текстового файла
* @param regularExp - регулярное выражение, по-которому будет выполняться поиск совпадений в строчке
* @param notFind - что не должно быть в строчке
* @return found список строк, удовлетворяющих условиям
*/

def sort2Dmap(map)

/**
* Сортировка 2D map по значениям
* @param map - структура, которую нужно отсортировать
* @return result отсортированный словарь
*/

String getStyleHtml()

/**
* Получение стиля оформления html страницы
* @return стиль оформления html страницы
*/

def findLinesWithDate(def log, def listenersSetting, def minutes)

/**
* Подтверждение отключения шлюзов
* @param log - лог Pod
* @param listenersSetting - настройки слушателя
* @param minutes - время отключения
*/

def sdpFolderExist(cluster, project, path, returnStdout = true)

/**
* Метод проверки наличия каталога для стендозависимых параметров
* @param cluster - имя кластера
* @param project - название системы оркестрации приложений проекта
* @param path - путь к репозиторию стендозависимых в Jenkins Job
* @param returnStdout - отвечает за вывод сообщений
* @return результат true/false, в случае true заполняется переменная sdpFolder
*/

def splitString(stringData, String separator = "")

/**
* Метод разделения текста на список по указанному разделителю
* @param stringData - строка которую нужно разбить
* @param separator - разделитель по которому нужно провести split
* @return список
*/

def getExpirationDate(Date date, int daysPeriod, holidays = '01-01-2021,23-02-2021,08-03-2021,01-05-2021,09-05-2021,12-06-2021,04-11-2021')

/**
* Метод для определения периода действия (будние дни)
* @param date - дата начала периода
* @param daysPeriod - количество дней периода
* @holidays - праздничные дни
* @return результат - [date: 'dd-MM-yyyy', status: true/false]
* @result date - дата окончания периода
* @result status - (true - период закончен, false - период не закончен(активен))
*/

def findParameterValues(section, pattern, group = 1)

/**
* Метод поиска значений для параметра (поиск по регулярному выражению)
* @param section - секция(блок) в yml-файла для поиска параметра
* @param pattern - регулярное выражение для поиска параметра
* @param group - группа в регулярном выражении (значение параметра)
* @return result - список значений параметра
*/

def isCorrectParameterValues(listValues, checkValues)

/**
* Метод проверки значений параметра с рекомендуемым
* @param listValues - список проверяемых значений
* @param checkValues - список рекомендуемых значений
* @return результат true\false
*/

def getGavParamsNexus(String gavParam, String ciXml)

/**
* Метод для формирования имени архива, ссылки и nexusGroupId, на основании GAV параметра
* @param gavParam - GAV параметр
* @param ciXml - xml с информацией по КЭ
* @return результат словарь с извлеченными параметрами
*/

def PublishQGNameForDistrib(distribName, nexusGroupId, nexusUrl, QGname = config.QGName, gavParam = null, nexusSegment = config.nexusSegment, nexusReleaseRepo = config.nexusReleaseRepo, version = null, nexusQGCredentialsId = config.nexusQGCredentialsId, needVault = config.needVault)

/**
* Метод публикации QG в QGM для дистрибутива (контроля прохождения соответствующей проверки в методе нет)
* @param distribName - Наименование дистрибутива в Nexus
* @param nexusGroupID - Группа в Nexus
* @param nexusUrl - Nexus Url
* @param QGname - имя флага для публикации
* @param gavParam - gav параметры
* @param nexusSegment - nexus сегмент
* @param nexusReleaseRepo - имя репозитория Sonatype Nexus, в который будут публиковаться собранные дистрибутивы
* @param version - версия дистрибутива
* @param nexusQGCredentialsId - QG credentialsId
* @param needVault - требуется хранилище
* @return результат публикации QGnames в QGM
*/

def getKeyMap(map, value)

/**
* Метод: получить ключ в словаре по значению
* @param map - словарь [key: value]
* @param value - значение, по которому нужно получить key
* @return
*/

def isEmptyValueMap(value)

/**
* Метод: проверить значение в словаре
* @param value - значение
* @return true/false - значения нет/значение есть
*/

def addValueForKey(map, key, value)

/**
* Метод добавления значения для ключа словаря
* @param map - словарь [key: value]
* @param key - ключ для которого добавить значение
* @param value - добавляемое значение
*/

def getPrLinksLotIssue(stashCredentialsId, domainName, project, repo, lotIssue, customHeader = [], needVault = config.needVault, workspace = config.workspace, credentialTypes = config.credentialTypes, configurationBlock = config.configurationVault)

/**
* Метод получения ссылок pull-request для списка issue
* @param stashCredentialsId - credential для работы с Stash
* @param project - проект pull-request
* @param repo - репозиторий pull-request
* @param issues - список задач, в рамках которых создан pull-request
* @param customHeader персональный заголовок
* @param needVault - требуется хранилище
* @param workspace - рабочее пространство
* @param credentialTypes - Типы Credential - Jenkins : Vault
* @param configurationBlock - настройки для HashiCorp Vault
* @return список ссылок на pull-request
*/

def curlWithTLS(cacertCredId, certCredId, keyCredId, urlWithFlags)

/**
* Функция вызова curl запроса с сертификатами
* @param cacertCredId - Id credential цепочки сертификатов
* @param certCredId - Id credential сертификата
* @param keyCredId - Id credential ключа
* @param urlWithFlags - url и доп флаги для запроса
*/

def getClusterUrl(clusterName, ClustersXml)

/**
* Метод получения ссылки на API кластера
* @param clusterName - Имя кластера
* @param ClustersXml - Список кластеров
* @return - ссылки на API кластера
*/

def getFullFoldersName(mainFolder, pathes)

/**
* Метод получения списка полных наименований каталогов/файлов
* @param mainFolder - основной каталог
* @param pathes - пути подкаталогов/файлов
* @return - словарь наименований [каталог: маска файлов(файл)]
*/

def findEnvParamsFromConfig(Map configYaml, Map pathesList = [:], List pathToEnvParam = [])

/**
* Метод поиска в глубину. Ищет стендозависимые параметры и запоминает пути для них.
* @param configYaml - yml словарь конфигурации, который надо проанализировать
* @param pathesList - карта в которой для каждой стендозависимой лежит список всех путей
* @param pathToEnvParam - путь до стендозависимого параметра
* @return - карта путей до стендозависимых параметров
*/

def getValueConfigByPath(Map configYaml, List path = [])

/**
* Метод получения значения в конфигурации по пути, переданному в виде списка
* @param configYaml - yml словарь конфигурации, который надо проанализировать
* @param path - путь (переданный в виде списка) до нужного элемента/секции
* @return - конфигурация найденная по пути
*/

def checkerRequest(cacertCredId, certCredId, keyCredId, operation, requestJson)

/**
* Метод запроса в Checker
* @param cacertCredId - Id credential цепочки сертификатов
* @param certCredId - Id credential сертификата
* @param keyCredId - Id credential ключа
* @param operation - тип запроса в checker
* @params requestJson - форма запроса
*/

def returnChangedFilesList(ciCred, projectsConfigGitStash, prId, project, repo, excludedFolders, customHeader = [])

/**
* Метод возващения измененных файлов из pull-request
* @param ciCred - Id credential для работы со stash
* @param projectsConfigGitStash - HTTP ссылка на stash
* @param prId - Id pull-request
* @param project - проект в stash
* @param repo - репозиторий в stash
* @param excludedFolders - тип запроса в checker
* @params repo - форма запроса
* @param customHeader персональный заголовок
*/

def compareRegistryVersions(Nexus nexus, String dockerCred, imageVersion, mainImageVersion, String dockerRegistryRepo, LinkedHashMap dockerRestApi, Boolean needVault, String workspace)

/**
* Метод сравнения версий образов
* @param nexus - библиотека Nexus
* @param dockerCred - credential для доступа в Registry
* @param imageVersion - ссылка (тег) образа, который будет сравниваться
* @param mainImageVersion - ссылка (тег) основного образа, с которым производится сравнение
* @param dockerRegistryRepo - репозиторий Docker Registry
* @param dockerRestApi - Api registry
* @param needVault - требуется хранилище
* @param workspace - рабочее пространство
* @return - результат сравнение (true/false)
*/

def getApiVar(def url, def parameters, def credentialsId, customHeader = [], needVault = config.needVault, workspace = config.workspace, credentialTypes = config.credentialTypes, configurationBlock = config.configurationVault)

/**
* Метод получения rest jenkinsApi
* @param url - ссылка Jenkins
* @param parameters - список через, какие параметры нужно получить
* @param credentialsId - credential Jenkins
* @param customHeader - персональный заголовок
* @param needVault - требуется хранилище
* @param workspace - рабочее пространство
* @param credentialTypes - Типы Credential - Jenkins : Vault
* @param configurationBlock - настройки для HashiCorp Vault
* @return - content ответ от Jenkins
*/

def inputControl(def url, def inputToMonitor, def credentialsId, def parameterToEnter = [:], def crumb = "", customHeader = [], needVault = config.needVault, workspace = config.workspace, credentialTypes = config.credentialTypes, configurationBlock = config.configurationVault)

/**
* Метод сравнения версий образов
* @param url - ссылка Jenkins
* @param inputToMonitor - id input для контроля
* @param credentialsId - credential Jenkins
* @param parameterToEnter - параметры для ввода в input
* @param crumb - crumb Jenkins
* @param customHeader - персональный заголовок
* @param needVault - требуется хранилище
* @param workspace - рабочее пространство
* @param credentialTypes - Типы Credential - Jenkins : Vault
* @param configurationBlock - настройки для HashiCorp Vault
* @return - возвращает статус сборки или null
*/

String getJenkinsURL(Boolean needAddProjectNameToHost)

/**
* Метод получения Jenkins URL для работы с Jenkins API
* @param needAddProjectNameToHost - нужно ли добавлять имя проектной области Jenkins Job к хосту
* @return Jenkins URL для работы с Jenkins API
*/

def getJenkinsCrumb(apiTokenCred = config.apiTokenCred, Boolean needAddProjectNameToHost = config.needAddProjectNameToHost)

/**
* Метод получения Jenkins Crumb
* @param apiTokenCred - CredentialsId для доступа к Jenkins по Token
* @param needAddProjectNameToHost - нужно ли добавлять имя проектной области Jenkins Job к хосту
* @return - результат получения Crumb
*/

def triggerJobs(def jobName, def parameters = [], propagate = false, wait = false, customHeader = [], apiTokenCred = config.apiTokenCred, time = 40)

/**
* Метод триггера Jenkins Job
* @param jobName - имя Jenkins Job для триггера
* @param parameters - параметры экрана запуска Jenkins Job
* @param propagate - передавать ли результат запуска Jenkins Job в инициирующий Jenkins Job
* @param wait - нужно ли ждать завершения работы вызванного Jenkins Job
* @param customHeader - персональный заголовок
* @param apiTokenCred - CredentialsId для доступа к Jenkins по Token
* @param time - время ожидания после триггера Jenkins Job
* @return - возвращает ссылку на запустившуюся сборку
*/

def saveBuildLog(def url, def GitCredentialsIdPasswordLogin, pipeline = config.pipeline, starter_email = config.starter_email, def needArhiveArtifact = true, workspace = config.workspace)

/**
* Метод сохранения лога сборки
* @param url - ссылка на сборку в Jenkins
* @param GitCredentialsIdPasswordLogin - параметры экрана запуска Jenkins Job
* @param pipeline - имя pipeline
* @param starter_email - пользователь запустивший сборку в Jenkins
* @param workspace - рабочее пространство
*/

def withCred(credentialType, credentialId, needVault = config.needVault, workspace = config.workspace, credentialTypes = config.credentialTypes, configurationBlock = config.configurationVault)

/**
* Метод получения идентификационных данных по credential
* @param credentialType - тип credential в Jenkins
* @param credentialId - credential
* @param needVault - требуется хранилище
* @param workspace - рабочее пространство
* @param credentialTypes - Типы Credential - Jenkins : Vault
* @param configurationBlock - настройки для HashiCorp Vault
* @return - возвращает словарь с идентификационными данными credential
*/

def customSshagent(credentialId, needVault = config.needVault, workspace = config.workspace, Closure closure /** всегда располагать крайним параметром */)

/**
* Вызывает ssh-агент используя ключ из Jenkins или Vault
* @param credentialId - credential
* @param needVault - требуется хранилище
* @param workspace - рабочее пространство
* @param closure - Функция, вызываемая внутри ssh-agent (вызывается аналогично ssh-agent)
*/

def secretfileTuning(IDsVariables, needVault = config.needVault, workspace = config.workspace)

/**
* Метод надстройки для работы с credential тип file
* @param IDsVariables - credential, значение переменной в credential (формат Credential:Variable)
* @param needVault - требуется хранилище
* @param workspace - рабочее пространство
* @return - возвращает словарь с данными credential тип file
*/

def httpRequestTuning(credentialId, customHeader = [], needVault = config.needVault, workspace = config.workspace, credentialTypes = config.credentialTypes, configurationBlock = config.configurationVault)

/**
* Метод надстройки для работы с httpRequest
* @param credentialId - credential
* @param needVault - требуется хранилище
* @param workspace - рабочее пространство
* @param credentialTypes - Типы Credential - Jenkins : Vault
* @param configurationBlock - настройки для HashiCorp Vault
* @return - возвращает словарь данных для идентификации(credential в Jenkins) \ авторизации(credential в HashiCorp Vault)
*/

def saveLogInDiffFiles(log, fileName)

/**
* Метод разбора и сохранения ответ от системы оркестрации приложений
* @param log - ответ от системы оркестрации приложений
* @param fileName - имя файлов, к которому будут добавляться суффиксы
*/

def saveMailInfo(String recipients, String mailText, String mailTheme, String fileName, String directoryToZip, String globFiles, Boolean needArhiveArtifact = true, String workspace = config.workspace, String style = null)

/**
* Метод сохранения информации о письме, архивация выбранной директории и перенос вложений в отдельную папку
* @param recipients - получатели письма
* @param mailText - текст письма
* @param mailTheme - тема письма
* @param fileName - имя файла (одного без архивации/имя архива при отправке нескольких файлов)
* @param directoryToZip - директория для архивации
* @param globFiles - маска файлов
* @param needArhiveArtifact - нужно заархивировать артефакты
* @param workspace - рабочее пространство
* @param style - стили html элементов
*/

def withCustomCreds(creds, additionalEnvsWithTuning = [], additionalEnvsWithoutTuning = [], needVault = config.needVault, workspace = config.workspace, credentialTypes = config.credentialTypes, configurationBlock = config.configurationVault, Closure closure /** всегда располагать крайним параметром */)

/**
* Метод, который получает credentials из Jenkins или Vault и вызывает блок withEnv. Пароли при этом скрываются
* @param creds - список credentials
* @param additionalEnvs - дополнительный список env (не маскируется)
* @param needVault - требуется хранилище
* @param workspace - рабочее пространство
* @param credentialTypes - Типы Credential - Jenkins : Vault
* @param configurationBlock - настройки для HashiCorp Vault
* @param closure - функция, которую нужно запустить в withEnv блоке
*/

def withEnvTuning(envsWithTuning, envsWithoutTuning = [], Closure closure /** всегда располагать крайним параметром */)

/**
* Метод, вызывающий withEnv и скрывающий все переданные параметры
* @param envsWithTuning - список параметров которые будут скрыты (заполняется аналогично withEnv)
* @param envsWithoutTuning - список параметров без скрытия (заполняется аналогично withEnv)
* @param closure - функция, которую нужно запустить в withEnv блоке
*/

def sendMailInfo()

/**
* Метод отправки писем, накопленных за время сборки
*/

def checkDefaultValues(param, paramName)

/**
* Проверка что в параметре указан корректные имена значений по умолчанию
* @param param - описание параметра
* @param paramName - имя параметра
* @return сообщение с ошибкой
*/

def checkReferencedParameters(param, paramName, paramsList)

/**
* Проверка что указаны все необходимые зависимые параметры для главного параметра
* @param param - описание параметра
* @param paramName - имя параметра
* @param paramsList - список уже заданных параметров
* @return сообщение с ошибкой
*/

def updatingSecrets(String clusterName, String projectName, List listFiles, String ClustersXml, String workspace = config.workspace, Map configurationBlock = config.configurationVault, String yq = config.yq)

/**
* Метод обновления secret(s) в HashiCorp Vault-хранилище
* @param clusterName - наименование кластера
* @param projectName - наименование проекта
* @param listFiles - список файлов secret(s)
* @param ClustersXml - Список кластеров
* @param workspace - рабочее пространство
* @param configurationBlock - настройки для HashiCorp Vault
*/

def curlForVault(request, pathKV, data = '', workspace = config.workspace, configurationBlock = config.configurationVault, vaultUrlUI = config.vaultUrlUI)

/**
* Метод для работы с secret(s) в HashiCorp Vault-хранилище
* @param request - тип curl-запроса : 'LIST', 'GET', 'POST', 'PUT', 'DELETE'
* @param pathKV - относительный путь хранилища\secret(s) в хранилище HashiCorp Vault
* @param data - данные secret(s) в формате json {"key": "value"}
* @param workspace - рабочее пространство
* @param configurationBlock - настройки для HashiCorp Vault
* @param vaultUrlUI - адрес HashiCorp Vault Web UI (HTTP)
* @return - результат выполнения запроса
*/

def checkHttpStatus(response, validResponseCodes = null, Map excludeCheckParams = null)

/**
* Метод проверки HTTP кода
* @param response - ответ HTTP запроса (ответ httpRequest или словарь с результатами ответа)
* @param validResponseCodes - успешные HTTP коды (список интервалов и одиночных значений)
* @param excludeCheckParams - параметры для проверки исключений (possibleRetryFl - возможен повтор для некоторых ошибочных статусов)
* @return - действие, которое нужно выполнить
*/

def compare2Dmap(mapOne, mapTwo, condition = null)

/**
* Сравнение двух map типа ключ=значение.
* @param mapOne - структура, которую нужно сравнить
* @param mapTwo - структура, которую нужно сравнить
* @param condition - условие сравнения двух структур
* @return результат о равенстве mapOne по отношению к mapTwo
*/

def sortByDESC(list)

/**
* Метод обратной сортировки списка (аннотация @NonCPS обязательна)
* @param list - список
* @result отсортированный список
*/

def addMetadataInHelmChartsTemplates(helmChartsDir, Map labels, tabString = " ")

/**
* Добавление меток в Helm Charts template, в формате yml
* @param helmChartsDir - директория Helm Charts
* @param labels - метки, которые нужно добавить
* @param tabString - отступ в yml файле
* @return Перезаписывает yml template, добавляя в них все переданные метки
*/

def httpRequestCustom(httpReqParams, tuningParams = [], tun = null)

/**
* Расширенный метод httpRequest с обработкой возвращаемого HTTP-кода
* @param httpReqParams - словарь параметров для httpRequest (validResponseCodes имеет тип список интервалов и одиночных значений, пример: [200…201, 404]) и дополнительных необязательных параметров
* @param tuningParams - словарь параметров для httpRequestTuning
* @param tun - результат выполнения httpRequestTuning для повторных инициализаций
*/

def sortListByElement(ArrayList list, element, direction = "-")

/**
* Метод сортировки списка по названию поля с возможностью изменения направления.
* @param list - список для преобразования
* @param element - наименование параметра по которому осуществить сортировку
* @param direction - направление сортировки: + (по возрастанию), - (по убыванию)
*/

def toolResolver(String tool, String toolType, String toolDir)

/**
* Метод работы с tool Jenkins
* @param tool - имя tool
* @param toolType - тип tool
* @param toolDir - директория с tool
* @return путь до исполняемого поля tool
*/

def toolResolver(String toolName, Map tools = config.tools)

/**
* Метод работы с tool Jenkins
* @param toolName - имя tool
* @param tools - список tools
* @return путь до исполняемого поля tool
*/

String unarchive(String fileName, String dirName = "distrib", Boolean quiet = false)

/**
* Метод распаковки архива
* @param fileName - имя файла архива
* @param dirName - каталог для распаковки
* @param quiet - каталог для распаковки
* @return - имя каталога в котором распакован дистрибутив
*/

String whatEndsWith(String distrPath)

/**
* Метод определения расширения архива
* @param distrPath - путь до архива
* @return - расширение архива
*/

def getErrHttpStatusMsg(httpStatusParams)

/**
* Метод получения информации по неуспешному HTTP статусу
* @param httpStatusParams - словарь параметров HTTP статуса ( status - код, content - содержание)
* @return результат - информация по статусу
*/

def configurationTuning(
needConfiguration = config.needNexus,
configurationBlock = config.configurationVaultNexus,
credentialType = 'usernamePassword',
subpath = '',
fields = [namefield: 'nexus_user_cred_name', passwordfield: 'nexus_user_cred_password'],
needVault = config.needVault,
configurationVault = config.configurationVault,
credentialTypes = config.credentialTypes
)

/**
* Метод: подменить блок конфигурации настроек HashiCorp Vault
* @param needConfiguration - флаг активности подменной конфигурации
* @param configurationBlock - подменный блок конфигурации
* @param credentialType - тип credential для secret(s)
* @param subpath - подкаталог расположения secret(s) в хранилище
* @param fields - словарь подменных(персонализированных) ключей
* @param needVault - требуется хранилище
* @param configurationVault - настройки для базового блока конфигураций настроек HashiCorp Vault
* @param credentialTypes - Типы credential - Jenkins : Vault
*/

def getTypeFromCfgFile(configFile)

/**
* Метод получения типа на основании имени конфигурационного файла
* @param configFile - имя конфигурационного файла
* @return результат - тип конфигурационного файла
*/

String archiveDistrib(String formatDistrib, String nameDistrib, String filesToArchiveStr, List excludeFiles = [])

/**
* Метод формирования архива
* @param formatDistrib - формат дистрибутива
* @param nameDistrib - имя архива
* @param filesToArchiveStr - файлы, которые нужно положить в архив
* @param excludeFiles - список файлов, которые нужно исключить из архива
* @return полное имя архива
*/

Map getParamsFromCIXml(String CIXmlString, String ciNumber)

/**
* Метод получения параметров из CIXml на основе файла CIXmlParams.json
* @param CIXmlString - CIXml в формате строки
* @param ciNumber - КЭ, для которого нужно найти параметры
*/

def getHashForReleaseNote(jiraTicketKey)

/**
* Метод определения списка commit для сборки
* @param jiraTicketKey - ключ задачи Jira
* @return список commit
*/

def isCurlWithGetHttpCode(scriptCurl)

/**
* Проверка наличия в curl запросе кода получения HTTP кода
* @param scriptCurl - curl запрос
* @return результат проверки
*/

def expandCurlWithGetHttpCode(scriptCurl)

/**
* Расширение curl запроса кодом получения HTTP кода, возвращает исходный запрос если добавление не произошло (в данный момент не используется)
* @param scriptCurl - curl запрос
* @return результат - расширенный запрос
*/

def getCurlResponseHttpCode(response)

/**
* Метод получения HTTP статуса из ответа curl запроса
* @param response - ответ curl запроса
* @return - результат (словарь: httpCode - HTTP код, response - ответ без HTTP кода)
*/

def shCurlWithCheckHttpCode(shCurlParams)

/**
* Расширенный метод curl запроса с обработкой возвращаемого HTTP статуса
* @param shCurlParams - словарь параметров для curl запроса (параметры для sh curl (returnStdout, script), validResponseCodes - валидные коды (по умолчанию null), retryCount - число запусков в случае возникновения ошибки, которая может быть решена повторным запуском (по умолчанию 3))
* @return - результат выполнения
*/

def generateBuildDescriptionWithDistribInfo(listDistribInfo = [])

/**
* Метод формирования HTML таблицы с информацией по дистрибутивам для добавления в описание сборки
* @param listDistribInfo - список словарей с информацией по дистрибутивам
* @return - HTML для добавления в описание сборки
*/

String getStackTraceException(Exception ex)

/**
* Метод получения stackTrace Exception в виде String
* @param ex - Exception
* @return stackTrace в виде строки
*/

String getCurrentTime(long time, String format)

/**
* Метод получения даты в нужном String формате
* @param time - дата типа long
* @param format - формат даты (например: "yyyy-MM-dd_hh:mm")
* @return дата типа String
*/

def approveInput(String submitterAllowed, Boolean needSecondApprove, String secondSubmitterAllowed, String inputText = "Предварительная проверка выполнена\n\nНажмите Proceed, если вы уверены в правильности")

/**
* Метод подтверждения дальнейшей работы джобы
* @param submitterAllowed - список пользователей, которые могут подтвердить дальнейшую работу джобы
* @param needSecondApprove - нужно ли второе подтверждение
* @param secondSubmitterAllowed - список пользователей, которые могут подтвердить дальнейшую работу джобы во второй раз (инициатор запуска джобы будет игнорироваться)
* @param inputText - текст сообщения input
* @return результат DevCommon.requestInput
*/

def approveInputWithParameters(String submitterAllowed, Boolean needSecondApprove, String secondSubmitterAllowed, List parameters, String inputText = "Предварительная проверка выполнена\n\nНажмите Proceed, если вы уверены в правильности")

/**
* Метод подтверждения дальнейшей работы джобы
* @param submitterAllowed - список пользователей, которые могут подтвердить дальнейшую работу джобы
* @param needSecondApprove - нужно ли второе подтверждение
* @param secondSubmitterAllowed - список пользователей, которые могут подтвердить дальнейшую работу джобы во второй раз (инициатор запуска джобы будет игнорироваться)
* @param parameters - параметры для экрана input
* @param inputText - текст сообщения input
* @return результат DevCommon.requestInput
*/

def readYaml(LinkedHashMap args)

/**
* Метод запуска readYaml для текста/файла
* @param args - Map с параметрами для плагина readYaml Jenkins
* @return объект yaml
*/

def readYaml(String file, String yqPath, int divisionNumber)

/**
* Метод чтения из файла kind: List через разделение списка
* @param file - имя YAML файла
* @param yqPath - путь до yq tool
* @param readFile - флаг подтверждения использования этого метода
* @return объект yaml
*/

def readYaml(String text,String yqPath = config.yq)

/**
* Метод чтения из текста kind: List через разделение списка
* @param file - текст YAML
* @param yqPath - путь до yq tool
* @return объект yaml
*/

static String readSMDLXml(jenkinsEnv, String path, String xml)

/**
* Метод чтения Xml
* @param path - текст YAML
* @return объект yaml
*/

void additionalConfirm(Map additionalConfirm, String starter_id, Boolean needSecondApprove, String submitterAllowed)

/**
* Метод дополнительного подтверждения установки конфигурационных файлов в проект оркестрации
* @param additionalConfirm - map, где ключ - тип конфигурационного файла, значение - строка с сообщением, которые добавятся в input
* @param starter_id - автор сборки
* @param needSecondApprove - флаг подтверждения второй рукой
* @param submitterAllowed - строка-список с логинами пользователей, которые могут подтвердить input
*/

String getFileFromJenkinsParam(String parameterName, String destPath)

/**
* Метод получения файла из Jenkins параметра с типом stashedFile
* @param parameterName - имя Jenkins параметра
* @param destPath - путь по которому его нужно сохранить
* @return путь до файла, если файл был задан в параметрах. Иначе возвращается null
*/