Пример использования JQL Search в постфункции

Ilya Stekolnikov
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
May 28, 2021

В компании используем Jira Software 8.5 + Scriptrunner.

Jira используется не только для организации работы разработчиков но и для всех бизнес процессов.

Так к примеру реализована логика утверждения и оплаты счетов, отпуски сотрудников, прием на работу, увольнение и так далее.

В статье расскажу о одной задаче и ее реализации. 

Чтоб внести немного ясности опишу более детально задачу. Речь пойдет о взаимодействии двух проектов. Один из проектов в нашей жире - CIW - используется для заведения таких тикетов как - смена команды разработки, изменение грейда сотрудника, повышения зарплаты. 

Каждый из issuetype в этом проекте имеет свой собственный workflow который подразумевает кучу информирования, а также подразумевает механизм аппрува (утверждения).

Второй большой проект который мы сделали - INFO. В этом проекте мы ведем личное дело сотрудника. Так к примеру при принятии на работу сотрудника - автоматом заводится тикет в проекте INFO. Тикет содержит в себе кучу кастомфилдов различного назначения, - например: телефон сотрудника, телеграм сотрудника, почта, логин LDAP, дата рождения, дата выхода в штат, грейд сотрудника и так далее. 

Задача звучала изначально следующим образом:

Нужно при заведении тикета на изменение грейда сотрудника в проекте CIW, изменять специфический кастомфилд (Grade) на новое значение в проекте INFO в тикете сотрудника которому меняют грейд.

Что для этого сделали:

1 - создали постфункцию в форкфлоу проекта CIW 

2 - постфункция с логикой поиска тикета в проекте INFO и заменой значения кастомфилда Grade  (Single Select) на новое значение из тикета CIW

Код пост функции:

import org.apache.log4j.Level
import org.apache.log4j.Logger

import com.atlassian.jira.user.ApplicationUser
import com.atlassian.jira.bc.issue.search.SearchService
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.IssueManager
import com.atlassian.jira.issue.search.SearchResults
import com.atlassian.jira.web.bean.PagerFilter
import com.atlassian.jira.event.type.EventDispatchOption
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.issue.ModifiedValue
import com.atlassian.jira.issue.util.DefaultIssueChangeHolder


def log = Logger.getLogger("com.example.jira.script.ProcessJQL");

def customFieldManager = ComponentAccessor.getCustomFieldManager()
def Grade = customFieldManager.getCustomFieldObject(14209) //Находим кастомфилд Grade
def GradeValue = issue.getCustomFieldValue(Grade) //Вытаскиваем текущее значение

log.setLevel(Level.INFO);

// определяем запрос JQL
String jqlSearch = "project = INFO AND issueType = Task AND Employee = akim"; //для упрощения использую поле Employee конкретного сотрудника

// определяем поиск
SearchService searchService = ComponentAccessor.getComponent(SearchService.class);
ApplicationUser user = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser();
IssueManager issueManager = ComponentAccessor.getIssueManager();

// Валидируем рещзультат
SearchService.ParseResult parseResult = searchService.parseQuery(user, jqlSearch);
if (parseResult.isValid()) {
// выполняем поиск
SearchResults searchResult = searchService.search(user, parseResult.getQuery(), PagerFilter.getUnlimitedFilter());

for (Issue issue : searchResult.getResults()) {
log.info("Found issue: " + issue.getKey());

// to update issue convert it to MutableIssue
MutableIssue mutableIssue = issueManager.getIssueObject(issue.getId());
mutableIssue.setSummary(issue.getSummary() + " UPDATED");
mutableIssue.setCustomFieldValue(Grade, GradeValue) //выставляем значение Grade на новое значение из тикета в проекте CIW

 

issueManager.updateIssue(user, mutableIssue, EventDispatchOption.ISSUE_UPDATED, false); // обновляем историю изменения, false - не отправляем уведомление
}
} else
log.error("Invalid JQL: " + jqlSearch);

 

Таким образом можно менять значения в тикете который мы нашли по запросу. У этого снипета может быть масса применений. Если есть вопросы - постараюсь ответить. 

0 answers

Suggest an answer

Log in or Sign up to answer