В досках 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 немного опытнее. И жили они долго и счастливо! :)