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" из структуры .item

findValueInDictArray

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-последовательности.

Возвращает:

  • Строку, где каждый символ представлен в виде \uXXXX escape-последовательности.

Пример в шаблоне:

{{ 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, ключу подписи и алгоритму.

Параметры:

  • claimsmap или 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:

  1. Откройте меню действия (кнопка с тремя точками в карточке действия).
  2. Выберите пункт «Запуски действия».
  3. Откройте конфигурацию одного из запусков действия.
  4. Найдите в таблице колонку «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 }}  // Референс заказа из хранилища