В досках Kanban и Scrum есть удобный инструмент горизонтальной группировки задач swimlanes (дорожки). С помощью дорожек задачи можно группировать по разным категориям: типам задач, проектам, пользовательским полям и прочему. Многие из вас наверняка уже знакомы с этим инструментом и активно пользуются им.

А что, если работу с дорожками можно сделать еще удобней и интересней? На примере реального кейса я попробую рассказать про способ автоматического добавления и удаления дорожек в досках Jira.

С чего всё началось

Команда разработчиков разрабатывает и поддерживает сразу несколько продуктов. У каждого продукта есть несколько версий, в рамках которых ведутся работы. Один из способов отслеживания задач и их управления — Kanban-доска, на которой помимо фильтров также используются еще и swimlanes для группировки задач по версиям.

Тимлид каждый раз, когда в проекте Jira появляется новая версия по тому или иному продукту, добавляет на доску дорожку, где название дорожки = имя версии, а фильтр дорожки всегда такой: fixVersion = "version_name".

Когда все задачи в рамках конкретной версии решены и закрыты, версию выпускают (в настройках проекта жмут на кнопку «выпустить»), после чего лид снова идет в настройки доски и удаляет уже неактуальную дорожку с одноименным названием.

В один прекрасный момент тимлиду всё это наскучило, и он обратился к тем, кто может помочь. Вот и всё. Спасибо, что дочитали.

Ладно, ладно, если серьёзно — мы решили помочь.

Что мы сделали

Никто не хотел изобретать велосипед, поэтому мы пошли сразу в гугл и начали искать там всеми любимые гайды. Искали на русском, на английском, а заветных гайдов все равно нет. Тогда мы пошли в официальную доку Atlassian, нас интересовали классы RapidViewService, SwimlaneService, SwimlaneBuilder.

Вооружившись ScriptRunner'ом, мы написали слушатель событий VersionCreateEvent и VersionReleaseEvent.

Когда создана новая версия:

newSwimBuilder.name(version_name) // Задаем имя дорожки

newSwimBuilder.query("'fixVersion' = $version_name") // Фильтр дорожки

newSwimBuilder.position(2 as Integer) // Задаем позицию дорожки

SwimlaneService sls

def view = rapidViewService.getRapidView(user, 1).get() // ID доски

sls.add(user, view, newSwimBuilder.build()) // Собираем и добавляем новую дорожку

Когда версия выпущена:

Пробегаемся по всем дорожкам и если название дорожки совпадает с именем версии, то удаляем дорожку:

sls.delete(user, view, swim.getId(), null)

Что в итоге?

Тимлид стал немного счастливее, а админ Jira немного опытнее. И жили они долго и счастливо! :)

Комментарии (0)