Релизы и автоматические переходы
Версии, стенды и правила, которые переводят задачу, когда открыт merge request, пайплайн выложил сборку или вышел релиз.
Из чего это состоит
Задача может двигаться сама: в ревью — когда открыт её merge request, в «выложено на staging» — когда пайплайн её туда выложил, в закрытые — когда вышел релиз, в котором она уехала. Никому не нужно помнить о карточке, а доска показывает, где работа на самом деле.
- Схема статусов со статусом на каждый шаг — готовая «Релизы по стендам» или своя.
- Правила: событие, статус, в котором задача должна стоять, и статус, в который она переходит.
- Вебхук репозитория — чтобы трекер узнавал о ветке и merge request в тот момент, когда они появились.
- Один запрос из пайплайна: что выложено и куда.
- Версии — релизы, в которых задача выходит.
Каждая часть работает и без остальных. Всё на этой странице настраивает лид проекта, из меню ⋯ доски.
Готовая схема
- Откройте доску, затем ⋯ → Статусы и переходы…
- Нажмите Взять другой… и выберите Релизы по стендам.
- Если в проекте уже есть задачи, укажите для каждого статуса, в котором они стоят, новый статус.
- Нажмите Взять Релизы по стендам.
| Статус | Что он значит |
|---|---|
| К выполнению | Не начата. |
| В работе | Кто-то над ней работает. |
| Code Review | Открыт merge request. |
| Ready for testing | Слита; ждёт тестировщика. |
| Testing / QA | Тестируется. |
| Ready for Staging | Проверена; ждёт следующей выкладки на staging. |
| Deployed to Staging | На staging, там ещё не проверена. |
| Ready for Prod | Проверена на staging; ждёт следующей выкладки на прод. |
| Deployed to Production | Выложена, но никто ещё не сказал, что там всё в порядке. Это не завершённый статус. |
| Закрыто | Сделана. |
| Отменено | Делать не будут. Тоже завершённый статус. |
| Заблокировано | Чего-то ждёт. Доступен из любого незавершённого статуса и ведёт обратно в каждый. |
В Закрыто и Отменено можно перейти из любого незавершённого статуса, поэтому работа, которая не едет ни на какой стенд, — рутина, исследование — закрывается оттуда, где стоит. У переходов свои имена («Deploy to Staging», «Preprod verified»), и инструмент читает их в transitions[].name.
Вместе со схемой приходят три стенда — dev, staging, prod — если у проекта их не было, колонка доски на каждый статус, если у доски не было своих колонок, и семь правил, выключенных. Схема становится собственной схемой проекта: дальше её можно править, как любую другую.
Правила приходят выключенными намеренно. Пока вы не включили хотя бы одно, само ничего не двигается — см. следующий раздел.
Правила, которые переводят задачи
⋯ → Правила… показывает правила проекта. Семь, которые приходят со схемой:
| Когда | Из | В | Что нужно |
|---|---|---|---|
| Создана ветка с ключом задачи | К выполнению | В работе | вебхук |
| Подзадача взята в работу | К выполнению | В работе | — |
| Открыт merge request с ключом задачи | В работе | Code Review | вебхук |
| Merge request с ключом задачи слит | Code Review | Ready for testing | вебхук |
| Выкладка на staging несёт задачу | Ready for Staging | Deployed to Staging | запрос из пайплайна |
| Выкладка на прод несёт задачу | Ready for Prod | Deployed to Production | запрос из пайплайна |
| Выпущена версия, в которой задача | Deployed to Production | Закрыто | версия |
Включите те, для которых у проекта есть обвязка. Можно написать и свои: любое из этих событий, а также «все подзадачи завершены» и «задача вошла в статус»; правило о merge request можно сузить до ветки, в которую он слит, правило о выкладке — до одного стенда.
- Правило переводит задачу от имени того, кто его включил. В истории задачи написано «правило «…» (от имени Анны)». Если этот человек уходит из проекта, правило выключается само, а не работает с ничьим доступом.
- Это обычный переход. Условия схемы действуют. Если схема перехода не разрешает, с задачей ничего не происходит, а в журнале правила сказано почему.
- «Из» проверяется каждый раз. Задачу не в том статусе, который назвало правило, оно не трогает: merge request, открытый по задаче, которая уже в тестировании, не утащит её назад.
- Считается каждый круг. Задачу, которую вернули и провели заново, те же правила переведут и во второй раз.
- Переход, сделанный правилом, может запустить следующее правило — не глубже трёх переходов.
Три перехода между ними остаются за человеком, потому что каждый — это суждение: «я это тестирую», «проверку прошло», «на staging всё в порядке».
Вебхук репозитория
Сначала репозиторий нужно подключить: ⋯ → Репозитории… (GitLab или GitHub).
- В Репозитории… нажмите Настроить вебхук у репозитория.
- Нажмите Сгенерировать и скопируйте Адрес и Секрет — секрет хранится запечатанным и больше не показывается.
- В GitLab: Settings → Webhooks → Add new webhook. Вставьте адрес в URL, секрет — в Secret token; отметьте Push events и Merge request events.
- В GitHub: Settings → Webhooks → Add webhook. Вставьте адрес в Payload URL, выберите
application/json, вставьте секрет и выберите события Pushes и Pull requests. - Сохраните в обоих местах. После этого окно показывает, когда хост слышали в последний раз и что он сказал, — пробная доставка тоже считается.
Задача называется своим ключом — ABC-12 — в имени ветки, в заголовке merge request или в его описании. Переводятся только задачи того проекта, к которому подключён репозиторий.
| Событие | GitLab | GitHub |
|---|---|---|
| Создана ветка | первый push новой ветки | push, создающий ветку |
| Merge request открыт | открыт или открыт заново | pull request открыт или открыт заново |
| Merge request слит | слит | закрыт со слиянием |
| Merge request закрыт | закрыт без слияния | закрыт без слияния |
- Одна и та же доставка, пришедшая дважды — повтор, «Resend», — переводит задачу один раз.
- Всё остальное, что шлёт хост (обновление, одобрение, тег), принимается и пропускается.
- В журнале доставок хоста виден наш ответ: 200 с
outcome—taken,duplicate,ignored,wrongRepository,disabled— или 401, если секрет не от этого репозитория.
Без секрета репозиторий не принимает ничего. Тип содержимого form-encoded у GitHub отклоняется: выберите application/json.
Один запрос из пайплайна
⋯ → Стенды… хранит стенды проекта по порядку — последний тот, где оказывается готовая работа, — и показывает команду ниже уже с адресом вашего проекта. Шаг пайплайна выполняет её после успешной выкладки:
deploy_staging:
stage: deploy
script:
- ./deploy.sh staging
- |
curl -fsS -X POST "https://<workspace>.kaiku.tech/api/projects/ABC/deployments" \
-H "Authorization: Bearer $PM_TOKEN" -H "Content-Type: application/json" \
-d "{\"environment\":\"staging\",\"id\":\"$CI_PIPELINE_ID\",\"revision\":\"$CI_COMMIT_SHA\",\"url\":\"$CI_PIPELINE_URL\",\"fromLast\":true}"PM_TOKEN — маскированная переменная CI/CD с токеном того, кто вправе менять задачи в проекте, — см. Подключение инструмента. Пример — для GitLab CI; подойдёт любой пайплайн, умеющий отправить запрос.
| Поле | Что оно говорит |
|---|---|
environment | Обязательно. Один из стендов проекта, по имени. |
id | Как сам пайплайн называет эту выкладку. Если не указан, его заменяет revision. Одно из двух обязательно. |
revision | Что выложено: коммит, тег. |
url | Ссылка на пайплайн; её открывает строка «Где лежит» на задаче. |
fromLast | true: прочитать ключи задач из сообщений коммитов с прошлой выкладки, о которой сообщали на этот стенд. |
from, to | То же, но диапазон назван явно. to по умолчанию — revision. |
issues | Ключи задач, названные явно: ["ABC-12", "ABC-15"]. Можно вместе с диапазоном. |
repository | group/repo — если к проекту подключено несколько репозиториев, а диапазон в одном. |
version | Заодно кладёт эти задачи в эту версию проекта, по имени. |
- Сообщается один раз. Тот же
idдля того же стенда повторно отвечаетrepeated: trueи ничего не делает, так что повтор шага безопасен. - Ответ перечисляет задачи, которые несла выкладка (
issues), ключи, не являющиеся задачами проекта (unknown), сколько раз сработали правила (rulesRan), откуда читался диапазон (from) и — для последнего стенда —unfinished: задачи, которые уехали, но не в завершённом статусе. - Для диапазона репозиторий должен быть подключён; читаются сообщения коммитов: merge-коммит называет ветку, squash-коммит несёт заголовок запроса. Если репозиторий не ответил, запрос завершается с 502 и ничего не записывается — запустите шаг ещё раз.
- С
fromLastпервое сообщение о стенде диапазон не читает: до него ничего нет. Оно записывает, откуда начнётся следующий. - Стенд или версия, которых у проекта нет, — отказ с 400, а не тихий пропуск.
Используйте fromLast, а не переменную CI «предыдущий коммит». Она совпадает с последним выложенным коммитом, только если выкладывает каждый пайплайн; один отменённый или упавший пайплайн — и его задачи так и не узнают, что уехали.
Где лежит задача
- На задаче есть строка Где лежит со всеми стендами, до которых она дошла; каждый открывает пайплайн, который её туда выложил. Задача на
prodпо-прежнему говорит иstaging. - В её истории — одна строка на стенд, «выложено на staging», сколько бы раз её туда ни выкладывали.
- На доске есть фильтр Лежит на.
- Задача на последнем стенде, которая не завершена, говорит об этом в строке Где лежит, пока это так.
- В API это поле
deployedTo, рядом со стандартными; в поиске оно возвращается, когда запрошено по имени.
Версии
⋯ → Релизы… показывает версии проекта с датами и прогрессом. Задача может быть в нескольких — по версии на каждый срез на staging, например, — и задаются они строкой Релиз на задаче.
- Выпустить отмечает версию выпущенной. Если в ней осталась незавершённая работа, экран сначала спросит: оставить её или перенести в версию, которая ещё впереди.
- Выпуск запускает правило «версия выпущена» для каждой задачи, которая осталась в версии. Задача, снятая с релиза, в который не попала, не переводится.
- В поиске:
fixVersion = "2.4.0",fixVersion in releasedVersions(),fixVersion in unreleasedVersions(). - В API версия — стандартный ресурс
/rest/api/2/version, а версии задачи — еёfixVersions; задача берёт только версии своего проекта. - Пайплайн может класть задачи в версию прямо при выкладке: поле
versionвыше.
Через MCP
| Инструменты | Что делают |
|---|---|
list_versions, create_version, update_version, release_version | Версии проекта. create_issue и update_issue принимают fixVersions. |
list_environments, set_environments, report_deployment | Стенды и то же сообщение, которое шлёт пайплайн. |
list_project_rules, create_project_rule, update_project_rule, delete_project_rule, get_project_rule_runs | Правила и их журнал. |
get_started | Говорит, настроено ли это у проекта и с чего начать. |
Вебхук, который вы зарегистрировали, слышит и версии: jira:version_created, jira:version_updated, jira:version_released, jira:version_unreleased, jira:version_deleted.
Чего здесь нет
- Правило не может сменить исполнителя — только перевести задачу, добавить чек-лист или передать задачу агенту.
- Сообщённую выкладку нельзя отозвать. Ошибочное сообщение исправляется следующим на тот же стенд.
- Условия поиска «лежит на» нет; доска фильтрует свои карточки.
- Вебхуку, который вы зарегистрировали, о выкладках не сообщается.
- Готовая схема берётся на экране; MCP-инструмента для схемы статусов проекта нет.
- Проект, зеркалируемый из другого трекера, сообщений о выкладках не принимает: его задачи живут там.
Чего-то не хватает или всё не так, как здесь написано? Напишите на hello@kaiku.tech