Оформление
Конвейеры развёртывания
Конвейер продвигает готовые объекты между пространствами по цепочке Разработка → Тест → Прод. Источник, датасет, виджет и дашборд копируются из одного пространства в следующее вместе со своими зависимостями, а подключения к базам по дороге подменяются на те, что положены принимающему пространству: тестовый отчёт смотрит в тестовую базу, рабочий — в рабочую.
Так отчётность переносят между контурами, не собирая её заново в каждом пространстве.
Раздел открывается из меню слева вверху, рядом с логотипом, — пункт Конвейеры развёртывания. Пункта нет, если у вас нет ни одного общего пространства: сначала попросите завести их — это делают участники группы «Менеджеры рабочих пространств», см. Пространства.

Что нужно, чтобы собрать конвейер
Три общих пространства — по одному на стадию, и в каждом из них у вас должна быть роль Администратор. Личное пространство к стадии не привязывается: попытка отвечает «К стадии можно привязать только командное пространство» — «командным» платформа называет в сообщениях тот же тип, который в списке пространств подписан Общее.
Одно пространство участвует не более чем в одном конвейере. Если пространство уже стоит в чьей-то стадии, платформа откажет: «Пространство уже участвует в другом пайплайне».
Пространства заводит менеджер рабочих пространств
Создавать общие пространства могут только участники системной группы Менеджеры рабочих пространств — Пользователи и группы. Сам конвейер заводит любой пользователь, но привязать к стадии он сможет только те пространства, где администрирует.
Создать конвейер
- Нажмите Создать конвейер.
- Укажите Название и, если нужно, Описание.
- Нажмите Создать.
Конвейер заводится сразу с тремя пустыми стадиями — Разработка, Тест и Прод. Пространства к ним привязываются потом, названия стадий не меняются.
После создания вы остаётесь в списке: новая карточка помечена Не настроен, пока не привязано ни одной стадии, и Привязано N из 3, пока привязаны не все. Щёлкните по названию, чтобы открыть конвейер.
На странице конвейера в каждой колонке нажмите кнопку с плюсом и выберите пространство — список можно отфильтровать полем Поиск пространства. В нём только свободные командные пространства, где вы администратор; если список пуст, платформа так и пишет: «Нет свободного командного пространства, где вы администратор». Меню ⋯ у привязанной стадии позволяет Сменить пространство или Отвязать его.
Привязанное пространство не удаляется
Пока пространство стоит в стадии, его удаление отвечает отказом — и причина в сообщении не называется. Сначала отвяжите стадию, потом удаляйте пространство.
Отвязка стадии разрывает связь копий
Объекты и правила подмены остаются на месте, а вот память о том, какая копия кому соответствует, стирается. Если вернуть то же пространство обратно, платформа перестанет узнавать прежние копии: они станут показываться как Только здесь, а исходные объекты — снова как Новые, и следующее развёртывание создаст в стадии вторые экземпляры вместо обновления прежних. Отвязывайте стадию, только когда пространство выводится из конвейера насовсем.
Доска стадий
Страница конвейера показывает три колонки — по стадии в каждой. Внутри колонки объекты сгруппированы по видам в том порядке, в котором их применяет развёртывание: источники, датасеты, виджеты, дашборды.
Колонка собирается из сравнения соседних стадий, поэтому состав виден, когда рядом есть привязанная стадия. У первых двух это следующая за ними: пока она пуста, вместо списка стоит подсказка «Состав стадии виден через сравнение с соседней». У последней стадии соседняя — предыдущая: её содержимое видно, но без плашек сравнения, а в подвале написано «Последняя стадия — развёртывать дальше некуда».

Плашка рядом с объектом говорит, чем стадия отличается от следующей за ней:
| Плашка | Что означает |
|---|---|
| Новый | Копии в следующей стадии ещё нет — развёртывание её создаст |
| Изменён | Объект правили после последнего развёртывания |
| Без изменений | С последнего развёртывания объект не менялся |
| Только здесь | Из предыдущей стадии объект не приезжал: его завели в этой стадии сами |
Сравнение идёт по времени правки, а не по содержимому
Объект, сохранённый без единого изменения, тоже станет Изменён. У источников эта плашка появляется сразу после развёртывания: платформа отмечает оригинал как изменённый в тот же момент, когда создаёт копию. Ориентируйтесь на то, правили вы объект или нет, а не на цвет плашки.
Развернуть объекты в следующую стадию
Развёртывание идёт только вперёд и только на один шаг: из «Разработки» в «Тест», из «Теста» в «Прод». Перепрыгнуть через стадию нельзя.
- В колонке-источнике отметьте объекты. Ссылка все над группой отмечает вид целиком. Сколько выбрано, показывают подвал колонки и счётчик рядом с кнопкой Развернуть.
- Нажмите Развернуть — круглую кнопку между колонками. Таких кнопок две: между «Разработкой» и «Тестом» и между «Тестом» и «Продом»; нажимайте ту, что справа от колонки-источника.
- Проверьте состав в окне и нажмите Развернуть.

Зависимости добавляются сами: с виджетом переносится его датасет, с датасетом — его источники. Отмечать их отдельно не нужно.
Повторное развёртывание того же объекта обновляет копию, а не создаёт вторую: связь оригинала и копии платформа помнит сама. В отчёте после развёртывания у каждого объекта написано, что с ним произошло — «создан» или «обновлён».
Развёртывание идёт одной транзакцией: если хотя бы один объект перенести не удалось, не переносится ничего, и окно сообщает «Ничего не развёрнуто».
Если в принимающей стадии уже есть объект с таким же именем, но не связанный с вашим, платформа предупреждает об этом строкой «В целевой стадии уже есть объект с именем „…“» и всё равно создаёт копию: в стадии окажутся два объекта с одним названием.
Что развёртывание не переносит:
- подключение источника — без правила подмены копия сохраняет подключение исходной стадии, о чём отчёт предупреждает отдельной строкой;
- данные извлечения — материализованному датасету в принимающей стадии нужен первый прогон синхронизации;
- права — в принимающей стадии они настраиваются заново, см. Управление доступом;
- расписание обновления датасета — его задают в копии отдельно, см. Синхронизация и ETL.
Подменить подключение на стадии
Чтобы копия смотрела в базу принимающей стадии, для источника заводится правило подмены подключения. Правило живёт в пространстве стадии и применяется при следующем развёртывании в неё.
- В меню ⋯ нужной стадии выберите Подключения источников.
- Слева выберите источник. Метка рядом показывает, что задано сейчас: правило или как в «Разработка».
- Заполните параметры подключения — хост, порт, базу, учётные данные, при необходимости SSL, SSH-туннель и Initial SQL. Порт подставляется по типу источника.
- Нажмите Проверить подключение, затем Сохранить правило.
Кнопок «Проверить подключение» в окне две — нажимайте нижнюю
В текущей версии работает только та, что стоит рядом с Сохранить правило: при успехе она отвечает сообщением «Подключение успешно», при отказе — текстом ошибки под формой. Верхняя кнопка, сразу под полями подключения, не делает ничего.

Слева перечислены источники предыдущей стадии — те, копии которых сюда попадут. У первой стадии предыдущей нет, поэтому подменять там нечего. Файловому источнику правило не нужно: файл копируется вместе с источником.
Кнопка Удалить правило возвращает источник к подключению исходной стадии: платформа спрашивает подтверждение, после него метка источника снова читается «как в „<имя стадии>“». Правила, чей источник уже удалён, собраны отдельным списком Правила без источника — их можно убрать кнопкой Удалить рядом с каждым.
Кто что может
| Действие | Что требуется |
|---|---|
| Видеть конвейер | Любая роль в любой привязанной стадии либо авторство конвейера |
| Создать конвейер | Любая учётная запись |
| Переименовать и удалить конвейер, привязать стадию | Роль «Администратор» во всех привязанных стадиях |
| Развернуть в стадию | «Администратор» в принимающей стадии и любая роль в исходной |
| Править правила подмены | «Администратор» в стадии, где заводится правило |
Пока к конвейеру не привязано ни одной стадии, проверять нечего: свежесозданный конвейер его автор настраивает сам. Как только появилась первая привязка, каждое следующее действие требует роли «Администратор» в уже привязанных пространствах.
Кнопка Развернуть неактивна, пока чего-то не хватает, и подсказка называет чего: «Обе стадии должны быть привязаны к пространствам», «Нужны права администратора в целевом пространстве», «Выберите объекты в левой колонке». Запрос в обход интерфейса отвечает «Доступ запрещён».
Ограничения текущей версии
Иерархия на вычисляемом поле ломает развёртывание
Если хотя бы один уровень иерархии построен на вычисляемом поле датасета, окно отвечает «Ничего не развёрнуто: Внутренняя ошибка сервера», и не переносится вся пачка целиком. Иерархии из обычных полей таблицы переносятся штатно.
Обход: уберите такой уровень из иерархии, разверните датасет, а в копии соберите иерархию заново — Иерархии, фильтры и параметры.
Кроме этого:
- конвейер не удаляется — кнопка Удалить отвечает «Внутренняя ошибка сервера», конвейер остаётся на месте. Ненужный конвейер можно отвязать от пространств: без привязок он ничего не держит;
- отката нет — вернуть копию к прежней версии нельзя, история копий не хранится;
- объект переносится целиком — доставить часть полей датасета или один виджет из дашборда не получится;
- стадии всегда три, их состав и названия не настраиваются.
Настройка запросами к API
Всё то же делается запросами — это удобно, когда развёртывание встроено в чужой процесс. Токен берётся обычным входом, см. Работа через REST API; $API — адрес установки с /api на конце.
Стадии в запросах адресуются порядковым номером: 0 — Разработка, 1 — Тест, 2 — Прод. Сравнивать и разворачивать можно только соседние: compare?from=2 и deploy с from_stage: 2 отвечают отказом, потому что после последней стадии ничего нет.
bash
# создать конвейер: в ответе сразу три стадии
curl -s -X POST -H "Authorization: Bearer $T" -H "Content-Type: application/json" \
-d '{"name":"Продажи","description":"отчётность отдела продаж"}' "$API/pipeline"
# привязать пространство к стадии — по её порядковому номеру, не по идентификатору
curl -s -X PUT -H "Authorization: Bearer $T" -H "Content-Type: application/json" \
-d '{"workspace_id":5}' "$API/pipeline/1/stage/0"
# что изменилось между стадией и следующей за ней
curl -s -H "Authorization: Bearer $T" "$API/pipeline/1/compare?from=0"
# развернуть выбранное в следующую стадию
curl -s -X POST -H "Authorization: Bearer $T" -H "Content-Type: application/json" \
-d '{"from_stage":0,"objects":[{"type":"dataset","id":1413}]}' "$API/pipeline/1/deploy"Типы объектов в теле: data_source, dataset, widget, dashboard. В ответе compare у каждого объекта поле status — new, changed, same или target_only, в ответе deploy поле action — created или updated.
Пустой список объектов разворачивает стадию целиком
"objects": [] в теле deploy означает «взять всё, что есть в исходной стадии», а не «ничего не делать». Перечисляйте объекты явно.
Правила подмены лежат по адресу $API/pipeline/{id}/stage/{order}/data-source-rule: GET возвращает источники предыдущей стадии вместе с уже заведёнными правилами, PUT создаёт или меняет правило, DELETE с идентификатором правила — удаляет. В теле PUT поле source_uuid — код источника из ответа GET, и settings того же состава, что у источника этого типа, см. Источники данных.
Конвейер и перенос объектов — разные инструменты
Перенос объектов перемещает объект из личного пространства в общее: в исходном его больше нет, и вернуть обратно нельзя. Конвейер копирует объект в соседнюю стадию, оригинал остаётся на месте и продолжает жить своей жизнью — его правят дальше, а изменения доставляют повторным развёртыванием.
Что дальше
- Пространства — как они устроены и как перенести объект между ними.
- Управление доступом — права в принимающей стадии настраиваются заново.
- Синхронизация и ETL — первый прогон извлечения в новой стадии.