Deckhouse Development Platform поддерживает шаблонизацию на базе Go template: выражения в фигурных скобках подставляются в полях конфигурации, где это предусмотрено (действия, виджеты, источники данных и т.д.). Ниже — встроенные функции и контекстные переменные ({{ .property.* }}, {{ .entity.* }} и другие).
Помимо стандартных функций доступны:
- Встроенные функции платформы.
- Функции библиотеки sprig.
Функции библиотеки sprig не поддерживаются в источниках данных.
Встроенные функции
extractPart
extractPart разделяет входную строку s по указанному разделителю delimiter и возвращает часть по указанному индексу index. Если индекс выходит за пределы массива, то возвращается ошибка.
Параметры:
s— входная строка, которую нужно разделить.delimiter— разделитель, используемый для разделения входной строки.index— индекс части, которую нужно вернуть после разделения.
Возвращает:
- Строку, представляющую часть с указанным индексом после разделения входной строки.
- Если индекс выходит за пределы, возвращается ошибка.
Пример в шаблоне:
{{ extractPart "ddp/demo-service" "/" 1 }} // Вывод: "demo-service"extractLastPart
extractLastPart разделяет входную строку s по указанному разделителю delimiter и возвращает последнюю часть. Если строка пустая или разделитель не найден, возвращается оригинальная строка.
Параметры:
s— входная строка, которую нужно разделить.delimiter— разделитель, используемый для разделения входной строки.
Возвращает:
- Строку, представляющую последнюю часть после разделения входной строки.
Пример в шаблоне:
{{ extractLastPart "ddp/demo-service" "/" }} // Вывод: "demo-service"toJSON
toJSON сериализует заданное значение в строку JSON. Принимает любой тип данных. При невозможности сериализации возвращается ошибка.
Параметры:
v— значение, которое нужно сериализовать в JSON.
Возвращает:
- JSON-строку, представляющую входное значение.
- Ошибку, возникшую в ходе сериализации.
Пример в шаблоне:
{{ toJSON . }} // Вывод: JSON-представление объекта в контекстеtoYAML
toYAML сериализует заданное значение в строку YAML. Принимает любой тип данных. При невозможности сериализации возвращается ошибка.
Параметры:
v— значение, которое нужно сериализовать в YAML.
Возвращает:
- Строку с YAML-представлением входного значения.
- Ошибку, возникшую в ходе сериализации.
Пример в шаблоне:
{{ toYAML . }} // Вывод: YAML-представление объекта в контекстеfromYAML
fromYAML разбирает строку с YAML в map для использования в шаблоне (например, для объединения с dict или доступа по ключам).
Параметры:
s— строка с YAML.
Возвращает:
mapс данными из строки.- Пустой
map, если строка пустая. - Ошибку, если YAML некорректен.
Пример в шаблоне:
{{ index (fromYAML "first: a\nsecond: b\n") "first" }} // Вывод: "a"replaceChar
replaceChar заменяет все вхождения указанного символа в строке на другой указанный символ.
Параметры:
s— исходная строка, в которой нужно выполнить замену.oldChar— символ, который нужно заменить.newChar— символ, на который нужно заменить.
Возвращает:
- Изменённую строку, где все вхождения
oldCharзаменены наnewChar.
Пример в шаблоне:
{{ replaceChar "hello/world" "/" "-" }} // Вывод: "hello-world"toSlug
toSlug приводит произвольную строку к виду, допустимому для идентификатора:
- В результате остаются строчные латинские буквы и цифры, между фрагментами — дефисы.
- Ведущий дефис в результате отсутствует.
- Длина результата не больше 64 символов.
- Символы вне допустимого набора заменяются одним дефисом.
- Крайние дефисы удаляются.
Параметры:
s— исходная строка.
Возвращает:
- Строку в форме идентификатора или пустую строку.
Пример в шаблоне:
{{ toSlug "My Service/Name!" }} // Вывод: "my-service-name"filteredItems
filteredItems фильтрует массив элементов (maps) по запрашиваемому значению ключа. Возвращает массив элементов, у которых значение по заданному ключу соответствует целевому значению.
Параметры:
data— массив данных, в котором выполняется фильтрация.key— ключ, по которому будет выполнена проверка значения.value— целевое значение для сравнения.
Возвращает:
- Массив элементов, у которых значение по заданному ключу соответствует целевому значению.
- Ошибку, если возникает проблема во время фильтрации.
Пример в шаблоне:
{{ filteredItems .items "name" "Alice" }} // Вывод: [{"name": "Alice", "age": 30}]anyOf
anyOf проверяет, соответствует ли хотя бы один элемент массива условию сравнения.
Параметры:
operator— оператор сравнения (eq, ne, lt, le, gt, ge).value— целевое значение для сравнения.key— ключ, по которому будет извлечено значение для сравнения.data— массив данных (maps).
Возвращает:
true, если хотя бы одно значение из массива данных соответствует условию.
Пример в шаблоне:
{{ anyOf "eq" "value" "key" .data }} // Вывод: true, если хотя бы одна запись удовлетворяет условиюallOf
allOf проверяет, соответствуют ли все элементы массива условию сравнения.
Параметры:
operator— оператор сравнения (eq, ne, lt, le, gt, ge).value— целевое значение для сравнения.key— ключ, по которому будет извлечено значение для сравнения.data— массив данных (maps).
Возвращает:
true, только если все значения соответствуют условию.
Пример в шаблоне:
{{ allOf "gt" 10 "age" .users }} // Вывод: true, если все пользователи старше 10 летgetFieldValue
getFieldValue получает значение поля по ключу из структуры, представленной в виде map.
Параметры:
items— структура данных в видеmap.key— ключ, по которому нужно получить значение.
Возвращает:
- Значение, полученное по ключу.
- Ошибку, если структура отсутствует или ключ не найден.
Пример в шаблоне:
{{ getFieldValue .item "name" }} // Вывод: Значение поля "name" из структуры .itemfindValueInDictArray
findValueInDictArray ищет в массиве словарей элемент, где значение по заданному ключу соответствует указанному значению, и возвращает значение другого ключа.
Параметры:
data— массив словарей (map[string]interface{}), в которых выполняется поиск.filterKey— ключ, по которому выполняется фильтрация.filterValue— значение, с которым должно совпадать значение по filterKey.targetKey— ключ, значение которого требуется получить из найденного элемента.
Возвращает:
- Значение, соответствующее targetKey в найденном словаре.
- Ошибку, если элемент не найден или targetKey отсутствует.
Пример в шаблоне:
{{ findValueInDictArray .items "environment" "test" "url" }} // Вывод: Значение ключа "url" из первого найденного словаря, где "environment" равно "test".generatePassword
generatePassword генерирует случайный пароль с заданными параметрами.
Параметры:
length— длина пароля (по умолчанию: 16).includeUppercase— включать заглавные буквы A-Z (по умолчанию: true).includeLowercase— включать строчные буквы a-z (по умолчанию: true).includeNumbers— включать цифры 0-9 (по умолчанию: true).
Возвращает:
- Строку со сгенерированным паролем.
- Ошибку, если невозможно сгенерировать пароль с заданными параметрами.
Примеры в шаблоне:
{{ generatePassword }} // Вывод: Случайный пароль длиной 16 символов
{{ generatePassword 12 }} // Вывод: Случайный пароль длиной 12 символов
{{ generatePassword 8 true true true }} // Вывод: Пароль длиной 8 символов
{{ generatePassword 10 false true true }} // Вывод: Пароль длиной 10 символов только из строчных букв и цифрencodeUnicode
encodeUnicode преобразует строку в последовательность Unicode escape-последовательностей. Каждый символ строки кодируется в формате \uXXXX, где XXXX - четырехзначное шестнадцатеричное представление кодовой точки символа.
Параметры:
s— строка, которую нужно закодировать в Unicode escape-последовательности.
Возвращает:
- Строку, где каждый символ представлен в виде
\uXXXXescape-последовательности.
Пример в шаблоне:
{{ encodeUnicode "Привет" }} // Вывод: "\u041f\u0440\u0438\u0432\u0435\u0442"
{{ encodeUnicode "Hello" }} // Вывод: "\u0048\u0065\u006c\u006c\u006f"decodeUnicode
decodeUnicode декодирует строку, содержащую Unicode escape-последовательности, обратно в обычную строку. Функция обрабатывает escape-последовательности вида \uXXXX, где XXXX - четырехзначное шестнадцатеричное число, представляющее кодовую точку Unicode.
Параметры:
s— строка с Unicode escape-последовательностями, которую нужно декодировать.
Возвращает:
- Декодированную строку, где все Unicode escape-последовательности преобразованы в символы.
- Ошибку, если декодирование не удалось (например, при некорректном формате escape-последовательностей).
Пример в шаблоне:
{{ decodeUnicode "\u041f\u0440\u0438\u0432\u0435\u0442" }} // Вывод: "Привет"
{{ decodeUnicode "\u0048\u0065\u006c\u006c\u006f" }} // Вывод: "Hello"jwtSign
jwtSign формирует подписанный JWT по переданным claims, ключу подписи и алгоритму.
Параметры:
claims—mapили JSON-строка. Стандартные поля: «sub», «iss», «aud», «exp», «iat», «nbf».signingKey— ключ подписи: для HS256/HS384/HS512 строка-секрет, для RS256/ES256 и др. — PEM закрытого ключа.algorithm— алгоритм подписи: HS256, HS384, HS512, RS256, RS384, RS512, ES256, ES384, ES512, PS256 и др.headers— заголовки JWT (опционально):mapили JSON-строка, например «kid», «cty». Пустая строка или пустойmap— заголовки не задаются.
Возвращает:
- Строку с подписанным JWT.
- Ошибку при неверных параметрах или ключе.
Примеры в шаблоне:
{{ jwtSign (dict "sub" "user-123" "iss" "ddp") .credentials.secret "HS256" "" }}Глобальные переменные
Глобальные переменные — общие переменные, которые могут быть переиспользованы в шаблонизации при запуске действий.
Чтобы подставить значение глобальной переменной, в поле с поддержкой шаблонов укажите конструкцию вида:
{{ .global.<slug>.<key> }}где:
global— указывает на то, что идёт обращение к глобальным переменным.slug— идентификатор набора глобальных переменных.key— ключ переменной, значение которой необходимо подставить.
Глобальные переменные хранятся в базе данных DDP в открытом виде, их значение может быть получено пользователями через веб-интерфейс. Не рекомендуется помещать конфиденциальные данные в глобальные переменные.
Настройка глобальных переменных
Настройка глобальных переменных производится в разделе «Самообслуживание» → «Глобальные переменные».
Применяются следующие правила именования:
- Название набора глобальных переменных не должно быть пустым.
- Идентификатор набора глобальных переменных не может быть пустым и должен соответствовать следующим условиям:
- Содержать символы
a-z,A-Z, цифры, либо подчеркивания. - Не начинаться с цифры.
- Содержать символы
- Ключ каждой переменной набора не должен быть пустым и должен соответствовать следующим условиям:
- Содержать символы
a-z,A-Z, цифры, либо подчеркивания. - Не начинаться с цифры.
- Содержать символы
- Значение каждой переменной набора не должно быть пустым.
Командные переменные
Во всех действиях, сценариях и процессах можно использовать командные переменные.
Командные переменные настраиваются в разделе «Администрирование» → «Команды» в меню редактирования команды.
Каждый пользователь может редактировать переменные тех команд, в которые он входит - это можно сделать в профиле пользователя.
Чтобы получить значение командной переменной, используйте конструкцию:
{{ .team.<variable_name> }}При запуске действия пользователь должен выбрать команду, чьи переменные будут подставлены.
При запуске сценария или процесса команда выбирается один раз — её переменные используются во всех действиях внутри.
Переменные действий
Параметры действия
Параметры действия доступны через контекст {{ .property.* }} и содержат значения, переданные при запуске действия.
Чтобы получить значение параметра действия, используйте конструкцию:
{{ .property.<property_slug> }}где:
property— указывает на то, что идёт обращение к параметрам действия.property_slug— идентификатор параметра, значение которого необходимо подставить.
Идентификаторы параметров можно посмотреть на вкладке Пользовательская форма в окне конфигурации действия.
Примеры использования:
{{ .property.environment }} // Значение параметра "environment"
{{ .property.count }} // Значение параметра "count"
{{ .property.url }} // Значение параметра "url"Ответ действия
Ответ действия доступен через контекст {{ .response.* }} и содержит данные, возвращённые после выполнения действия.
Чтобы взять значение из ответа действия, используйте конструкцию:
{{ .response.<field_name> }}где:
response— указывает на то, что идёт обращение к ответу действия.field_name— название поля в ответе, значение которого необходимо подставить.
Формат ответа смотрите в документации по конкретному действию или в интерфейсе DDP:
- Откройте меню действия (кнопка с тремя точками в карточке действия).
- Выберите пункт «Запуски действия».
- Откройте конфигурацию одного из запусков действия.
- Найдите в таблице колонку «Response».
Примеры использования:
{{ .response.status }} // Статус ответа
{{ .response.data.id }} // ID из данных ответа
{{ .response.headers.auth }} // Значение заголовка авторизацииКонтекст {{ .response.* }} может использоваться только в полях, описывающих правила обновления сущности после запуска действия.
Учётные данные
Учётные данные доступны во всех действиях, сценариях, процессах, виджетах, источниках данных и внешних сервисах через контекст {{ .credentials.* }}.
Для получения значения учётных данных используйте следующую конструкцию:
{{ .credentials.<credentials_slug> }}где:
credentials— указывает на то, что идёт обращение к учётным данным.credentials_slug— идентификатор учётных данных, значение которого необходимо подставить.
Идентификатор credentials_slug совпадает с тем, что задаётся во вкладке «Авторизация» в разделе «Учётные данные» в диалогах конфигурации объектов DDP.
Примеры использования:
{{ .credentials.token }} // Токен доступа
{{ .credentials.username }} // Имя пользователя
{{ .credentials.password }} // Пароль
{{ .credentials.accessKeyId }} // Access Key ID для S3
{{ .credentials.secretAccessKey }} // Secret Access Key для S3
{{ .credentials.apiKey }} // API ключ
{{ .credentials.bearerToken }} // Bearer-токенСущность (entity)
Сущность доступна в виджетах с областью видимости Resource, действиях, процессах и сценариях через контекст {{ .entity.* }}.
Чтобы получить значение поля сущности, используйте конструкцию:
{{ .entity.<field_name> }}где:
entity— указывает на то, что идёт обращение к сущности.field_name— название поля сущности, значение которого необходимо подставить.
Основные поля сущности
{{ .entity.uuid }} // UUID сущности
{{ .entity.slug }} // Идентификатор сущности
{{ .entity.name }} // Название сущности
{{ .entity.description }} // Описание сущностиПараметры сущности
Параметры сущности доступны через контекст {{ .entity.properties.* }} и содержат пользовательские параметры, настроенные для конкретной сущности.
Чтобы получить значение параметра сущности, используйте конструкцию:
{{ .entity.properties.<property_slug> }}где:
entity— указывает на то, что идёт обращение к сущности.properties— указывает на параметры сущности.property_slug— идентификатор параметра сущности, значение которого необходимо подставить.
Примеры использования:
{{ .entity.properties.projectId }} // ID проекта из параметров сущности
{{ .entity.properties.branch }} // Ветка Git из параметров сущности
{{ .entity.properties.environment }} // Окружение из параметров сущности
{{ .entity.properties.apiUrl }} // URL API из параметров сущности
{{ .entity.properties.version }} // Версия из параметров сущностиПараметры процесса
Для каждого процесса доступно задание общих параметров, значения которых могут быть использованы во всех действиях, входящих в процесс.
Чтобы получить значение параметра процесса, используйте конструкцию:
{{ .process.<property_slug> }}где:
process— указывает на то, что идёт обращение к процессу.property_slug— идентификатор параметра процесса, значение которого необходимо подставить.
Тип и значение по умолчанию параметров задаются в интерфейсе редактирования процесса. При этом для каждого конкретного параметра пользователь может при запуске процесса переопределить значение по умолчанию, если редактирование параметра разрешено.
Примеры использования:
{{ .process.deploymentUrl }} // URL для деплоя из параметров процесса
{{ .process.branch }} // Ветка Git из параметров процесса
{{ .process.environment }} // Окружение из параметров процессаПараметры сценария
Для каждого сценария доступно задание общих параметров, значения которых могут быть использованы во всех действиях, входящих в сценарий.
Чтобы получить значение параметра сценария, используйте конструкцию:
{{ .workflow.<property_slug> }}где:
workflow— указывает на то, что идёт обращение к сценарию.property_slug— идентификатор параметра сценария, значение которого необходимо подставить.
Тип и значение по умолчанию параметров задаются в интерфейсе редактирования сценария. При этом для каждого конкретного параметра пользователь может при запуске сценария переопределить значение по умолчанию, если редактирование параметра разрешено.
Примеры использования:
{{ .workflow.apiEndpoint }} // API-эндпоинт из параметров сценария
{{ .workflow.notificationEmail }} // Email для уведомлений из параметров сценария
{{ .workflow.retryAttempts }} // Количество попыток повтора из параметров сценарияХранилище процесса
Хранилище доступно только в процессах и используется для передачи данных между действиями. В настройках действия задаются правила записи в хранилище (подробнее — в разделе «Обновление хранилища процесса»), а в конфигурации последующих действий используются плейсхолдеры для чтения данных.
Чтобы прочитать значение из хранилища, используйте конструкцию:
{{ .store.<key> }}где:
store— указывает на то, что идёт обращение к хранилищу процесса.key— ключ в хранилище, под которым сохранено значение (то же имя, что в поле «Ключ в хранилище» в правилах записи; в примерах ниже —projectId,orderRef).
Особенности использования:
- Хранилище доступно только в процессах, в обычных действиях и сценариях плейсхолдеры
{{ .store.* }}не работают. - Если ключа нет в хранилище (действие ещё не выполнялось, не имело правил записи или запись не произошла), действие завершится с ошибкой.
- Если для одного и того же ключа пишут несколько действий, остаётся последнее записанное значение.
Примеры использования:
{{ .store.projectId }} // ID проекта из хранилища
{{ .store.orderRef }} // Референс заказа из хранилища