Автоматическое связывание задач в JIRA с помощью Script Runner

Работая в JIRA, вы наверняка часто прибегаете к использованию функции линкования задач. Это удобный инструмент для быстрого перехода между задачами. Иногда связи играют вспомогательную роль, а иногда они просто необходимы, особенно в ситуациях, когда на них опираются бизнес-процессы, отчеты, статистика, формирование планов и т.п.
Например, согласно workflow есть два типа подзадач: Sub-Task Development и Sub-Task QA. Первые назначаются на разработчиков, вторые — на тестировщиков. Как правило, работы по тестированию стартуют после выполнения работ по разработке. Такую зависимость нам необходимо зафиксировать в виде связи Gantt End to Start. В данном кейсе преследуется цель правильного формирования плана проекта или версии в виде диаграммы Гантта с помощью плагина Structure.Gantt. Плагин учитывает определенные типы связей, чтобы отобразить порядок выполнения работ. Теперь представим, что есть родительская задача, в которой предполагается создание двух подзадач на разработку и одной задачи на тестирование. После создания всех подзадач, согласно процессу, необходимо создать связь Gantt End to Start между подзадачей на QA и двумя подзадачами Dev. Наличие такой связи является критически важным с точки зрения формирования плана. Полагаться на создание линка вручную не надежно. Возникает вопрос «Можно ли автоматически создавать связи между задачами?». С помощью плагина Script Runner данная задача решается.
На создание подзадача нужно «повесить» следующую постфункцию в виде groovy-скрипта

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.link.IssueLinkTypeManager;
import com.atlassian.jira.issue.link.IssueLinkManager;

def issueLinkManager = ComponentAccessor.getIssueLinkManager();
def issueLinkTypeManager = ComponentAccessor.getComponent(IssueLinkTypeManager);
def user = ComponentAccessor.getJiraAuthenticationContext().getUser()

//Получаем родителя
def parent = issue.getParentObject()

if (parent == null)
return

//Проверям тип родительской задачи, если нужно применять логику только для задач определенного типа
if (!parent.getIssueType().name in [«Story», «Task»])
return

//Получаем полный список подзадач у родителя
def subTasks = parent.getSubTaskObjects()

//СОЗДАНИЕ ЗАВИСИМОСТЕЙ МЕЖДУ ПОДЗАДАЧАМИ QA и DEV
//Получаем список всех подзадач тестирования
def subTasksQAList = subTasks.findAll {it.getIssueType().name == «Sub-task QA» }

//Движемся дальше если список подзадач тестирования не пустой
if (subTasksQAList == null)
return

// Получаем список типов линков
def issueLinkTypes = issueLinkTypeManager.getIssueLinkTypes()

def subTaskQA = null
subTasksQAList.each {

subTaskQA = it

def issueLink = issueLinkTypes.find {it.name == «Gantt End to Start» }
if(issueLink != null)
{
issueLinkManager.createIssueLink(issue.id,subTaskQA.id,issueLink.id,Long.valueOf(0),user)
}

}

Порядок создания подзадач для данного скрипта не имеет значения. Появление дублей связей также исключено, поскольку это контролирует сама JIRA, запрещая повторное создание линка того же типа между двумя задачами.
Используя подобный подход, вы можете формировать произвольные сценарии, при которых автоматическое создание связей просто необходимо.
Поделитесь в комментариях своими кейсами.