Хранилище процесса — это JSON-объект, общий для одного запуска процесса. Через него задачи передают друг другу данные: идентификаторы, массивы для обхода в цикле, промежуточные результаты и сформированные тексты.
Запись выполняется только по правилам в конфигурации действий и элементов «Шаблон». Чтение — через Go-шаблоны {{ .store.<путь> }} в теле запроса, условиях шлюзов и других полях с поддержкой шаблонизации.
Модель данных
- Одно хранилище на запуск — у каждого экземпляра процесса своё хранилище; оно сохраняется между шагами и доступно при просмотре запуска.
- Вложенные пути — ключи задаются dot-path без ведущей точки:
notification.module_name,ctx.job.id. Промежуточные объекты создаются автоматически. - Индексы массивов — в пути можно указывать элемент массива:
items[0].status,branches[2].name. - Типы значений — в зависимости от операции в хранилище попадают строки, числа, объекты и массивы JSON. Операции «Записать строку» и «Добавить строку» всегда работают со строками; операции с суффиксом JSON сохраняют разобранную структуру.
Служебный ключ _loop заполняется движком процесса во время выполнения цикла. Не записывайте в _loop вручную правилами действий — используйте его только для чтения в шаблонах.
Правила обновления хранилища
Правила настраиваются в действии: «Конфигурация» → «Обновление» → «Обновление хранилища процесса». Они выполняются после успешного завершения действия, в порядке списка. Каждое следующее правило видит изменения, внесённые предыдущими правилами того же действия.
В конфигурации задачи процесса правила отображаются в режиме только для чтения; для изменения откройте действие из боковой панели задачи.
Поля правила
| Поле | Обязательность | Описание |
|---|---|---|
| Условие | Нет | Go-шаблон. Пустое значение — правило выполняется всегда. После рендеринга результат должен быть true, false, 1 или 0; иначе правило пропускается |
| Операция | Да | Способ изменения значения по пути «Цель» |
| Цель | Да | Dot-path в хранилище без ведущей точки |
| Источник | Да* | Go-шаблон значения. Для операции «Удалить» не используется |
Операции
| Операция | Результат |
|---|---|
| Записать строку | Заменить значение по пути текстовой строкой из источника; JSON не разбирается |
| Записать JSON | Заменить значение разобранным JSON (объект, массив, число, булево) из шаблона источника |
| Добавить строку | Дописать текст к существующей строке по пути; если ключа нет — создаётся строка. Не применяется к числам и массивам |
| Добавить JSON | Добавить один JSON-элемент в массив по пути; если массива нет — создаётся пустой массив |
| Слить JSON (поверхностно) | Объединить JSON-объект из источника с объектом по пути: ключи верхнего уровня перезаписываются, вложенные объекты заменяются целиком |
| Удалить | Удалить ключ по пути |
Для операций Записать JSON, Добавить JSON и Слить JSON удобно использовать функцию toJSON и прямую ссылку на поле ответа, например {{ .response.items }} — платформа подставит значение без лишней сериализации.
Примеры правил
Сохранить идентификатор из ответа действия:
| Условие | Операция | Цель | Источник |
|---|---|---|---|
| Записать строку | deploy.job_id | {{ .response.id }} |
Записать массив для последующего цикла:
| Условие | Операция | Цель | Источник |
|---|---|---|---|
| Записать JSON | notification.engagements | {{ toJSON .response.engagements }} |
Дописать строку в лог:
| Условие | Операция | Цель | Источник |
|---|---|---|---|
| Добавить строку | run.log | step {{ .store._loop.index }}: ok\n |
Обновить только часть объекта:
| Условие | Операция | Цель | Источник |
|---|---|---|---|
| Слить JSON (поверхностно) | meta | {{ toJSON (dict "status" "ready" "updated_by" .entity.slug) }} |
Выполнить правило только на первой итерации цикла:
| Условие | Операция | Цель | Источник |
|---|---|---|---|
{{ .store._loop.first }} | Записать строку | run.started_at | {{ now }} |
Удалить временный ключ после использования:
| Условие | Операция | Цель | Источник |
|---|---|---|---|
| Удалить | temp.payload |
Панель «Пути хранилища»
В редакторе правил действия доступна панель Пути хранилища: она показывает ключи контекста цикла (_loop.item, _loop.index и др.).
Чтение из хранилища
В шаблонах процесса используйте:
{{ .store.<путь> }}Для вложенных полей путь совпадает с «Целью» в правилах записи:
{{ .store.notification.module_name }}
{{ .store.items[0].id }}Параметры запуска процесса доступны отдельным контекстом:
{{ .process.<идентификатор_параметра> }}Подробнее о контекстах шаблонизации — в разделе «Шаблонизация».
Если ключа нет в хранилище (действие ещё не выполнялось, правило не сработало или условие было ложным), шаблон {{ .store.<путь> }} завершит шаг с ошибкой. Убедитесь, что предшествующие задачи записали нужные данные.
Контекст цикла _loop
Пока выполняется тело цикла, в хранилище доступен объект _loop:
| Ключ | Описание |
|---|---|
_loop.item | Текущий элемент коллекции (режим «По коллекции») или номер итерации, начиная с 1 (режим «Фиксированное число») |
_loop.index | Индекс итерации, начиная с 0 |
_loop.total | Общее число итераций |
_loop.first | true на первой итерации |
_loop.last | true на последней итерации |
_loop.parent | Контекст родительского цикла при вложенных циклах |
_loop.loop_element_uuid | UUID элемента «Цикл» |
Примеры в шаблонах:
{{ .store._loop.item.name }}
{{ .store._loop.item.scan_type }}
{{ .store._loop.index }}В условиях эксклюзивного шлюза внутри цикла:
{{ eq .store._loop.item.branch .store.current_branch_tag }}Цикл по коллекции из хранилища
Элемент «Цикл» поддерживает два режима (поле «Режим цикла»):
- Фиксированное число — тело выполняется заданное количество раз (1–10000). В
_loop.item— номер итерации (1, 2, 3…). - По коллекции — при входе в цикл вычисляется Go-шаблон «Шаблон коллекции»; каждый элемент полученного JSON-массива — одна итерация.
Шаблон коллекции
Рекомендуемый вариант — путь к массиву, уже записанному в хранилище предыдущей задачей:
{{ .store.notification.engagements }}Альтернатива — собрать массив в шаблоне:
{{ toJSON .store.modules }}Граничные случаи:
- Пустой массив или отсутствующий ключ — 0 итераций, переход по связи «Выход из цикла»; в логе процесса появится предупреждение.
- Значение по пути не является JSON-массивом — ошибка валидации или выполнения цикла.
Сценарий: обход списка из API
- Задача «Получить engagements» — правило Записать JSON, цель
notification.engagements, источник{{ toJSON .response.engagements }}. - Цикл, режим По коллекции, шаблон коллекции
{{ .store.notification.engagements }}. - Задача в теле цикла — в теле запроса использовать
{{ .store._loop.item.id }},{{ .store._loop.item.name }}. - Эксклюзивный шлюз в теле — условие по полю элемента, например левое значение
{{ .store._loop.item.status }}, правоеactive. - Связь Выход из цикла — продолжение после обхода всех элементов.
Элемент «Шаблон»
Элемент «Шаблон» вычисляет Go-шаблон при проходе процесса и записывает строку в хранилище. JSON из результата не разбирается — в store сохраняется текст как есть.
| Поле | Описание |
|---|---|
| Тело шаблона | Go-шаблон; доступны {{ .store.* }}, {{ .process.* }}, внутри цикла — {{ .store._loop.* }} |
| Ключ в хранилище | Dot-path назначения, например rendered_message или notification.summary |
| Подсказка формата | Подсказка при просмотре запуска (text, markdown, html, json); на запись не влияет |
Пример тела:
## Отчёт по {{ .store._loop.item.name }}
Статус: {{ .store._loop.item.status }}
Владелец: {{ .store._loop.item.owner }}Последующие задачи читают результат через {{ .store.rendered_message }} или соответствующий путь.
Просмотр хранилища при выполнении
На экране визуализации запуска процесса откройте вкладку Хранилище:
- Дерево — навигация по вложенным ключам; справа — тип и значение выбранного узла.
- JSON — полное содержимое хранилища в формате JSON.
Доступны копирование значения, обновление данных и скачивание JSON запуска (кнопка на панели диалога запуска).
В боковой панели задачи на схеме запуска отображаются Правила обновления хранилища выбранного действия — удобно сверять фактическое содержимое store с конфигурацией.
Лог процесса и отладка
На панели визуализации доступны:
- вкладка Лог выполнения (в том числе в отдельном окне или снизу схемы);
- Скачать лог — текстовый лог запуска;
- сообщения о пустой коллекции цикла и пропущенных правилах хранилища.
При ошибке шаблона или невалидном JSON в правиле с операцией JSON соответствующее правило может быть пропущено (с предупреждением в логе), остальные правила того же действия продолжают выполняться.
Связанные разделы
- Обзор — элементы схемы, запуск и управление.
- Обновление хранилища в действиях — где включаются правила.
- Шаблонизация — синтаксис Go-шаблонов и контексты.