Aby zmienić status zgłoszeń na poprzedni na podstawie zapytania JQL w Jira Script Runner, możesz użyć następującego kodu w języku Groovy:
importcom.atlassian.jira.component.ComponentAccessorimportcom.atlassian.jira.issue.MutableIssuedef jqlQuery ="your_jql_query_here"def searchResults =ComponentAccessor.getSearchService().search(ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser(),ComponentAccessor.getJqlQueryParser().parseQuery(jqlQuery),10000,0)searchResults.getResults().each { issue->def statusName = issue.getStatus().getName()def statusCategory = issue.getStatus().getStatusCategory().getKey()def previousStatusName =""if (statusCategory !="new"&& statusCategory !="indeterminate") {def statusManager =ComponentAccessor.getStatusManager()def statusCategoryManager =ComponentAccessor.getStatusCategoryManager()def status = statusManager.getStatusByName(issue.getProjectObject(), statusName)def previousStatus = statusCategoryManager.getPreviousStatus(status)if (previousStatus) { previousStatusName = previousStatus.getName() issue.setStatusObject(previousStatus)ComponentAccessor.getIssueManager().updateIssue(ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser(), issue,MutableIssue.NO_ISSUE_UPDATE) log.debug("Changed status of issue ${issue.getKey()} from ${statusName} to ${previousStatusName}") } else { log.debug("Issue ${issue.getKey()} does not have a previous status") } } else { log.debug("Issue ${issue.getKey()} is in a new or indeterminate status category") }}
Powyższy kod pobiera wyniki wyszukiwania dla podanego zapytania JQL, a następnie dla każdego znalezionego zgłoszenia pobiera nazwę bieżącego statusu oraz kategorię tego statusu. Jeśli status nie jest kategorią „nowy” lub „nieokreślony”, to pobiera poprzedni status dla bieżącego statusu, a następnie ustawia ten poprzedni status jako nowy status dla zgłoszenia. W przeciwnym razie, dla zgłoszenia w kategorii „nowy” lub „nieokreślony”, skrypt przeskakuje do następnego zgłoszenia.
Podczas wykonywania skryptu, w logach Jira wyświetlane będą informacje na temat zmienionych statusów dla każdego zgłoszenia.
Oto przykładowy skrypt walidatora w Jirze, który sprawdza, czy pole ma wartość:
importcom.opensymphony.workflow.InvalidInputExceptiondef fieldName ="Nazwa pola"// podaj nazwę poladef fieldValue = issue.getCustomFieldValue(issue.getCustomFieldByName(fieldName))if (fieldValue ==null|| fieldValue.toString().trim().isEmpty()) {thrownewInvalidInputException("Pole "+ fieldName +" jest wymagane.")}
W tym skrypcie należy zdefiniować nazwę pola, które chcesz sprawdzić (fieldName), a następnie pobrać jego wartość z bieżącej sprawy (issue) za pomocą metody getCustomFieldValue(). Następnie skrypt sprawdza, czy wartość pola jest pusta lub null za pomocą metody isEmpty() i trim(). Jeśli wartość jest pusta lub null, skrypt zwróci wyjątek InvalidInputException z odpowiednim komunikatem. Możesz zapisać ten skrypt jako walidator w Jirze i używać go do sprawdzania, czy pole jest wypełnione.
Oto przykładowy skrypt walidatora w Jirze, który sprawdza, czy pole ma wartość. W tym przypadku nazwę pola wybieramy z listy dostępnych pól w projekcie:
importcom.opensymphony.workflow.InvalidInputExceptionimportcom.atlassian.jira.component.ComponentAccessordef customFieldManager =ComponentAccessor.getCustomFieldManager()def field = customFieldManager.getCustomFieldObjectByName("Nazwa pola")// podaj nazwę poladef fieldValue = issue.getCustomFieldValue(field)if (fieldValue ==null|| fieldValue.toString().trim().isEmpty()) {thrownewInvalidInputException("Pole "+ field.name +" jest wymagane.")}
W tym skrypcie używamy menedżera pól niestandardowych (customFieldManager), aby pobrać obiekt pola o nazwie „Nazwa pola” (podaj właściwą nazwę pola). Następnie pobieramy wartość pola z bieżącej sprawy (issue) za pomocą metody getCustomFieldValue(). Skrypt sprawdza, czy wartość pola jest pusta lub null za pomocą metod isEmpty() i trim(). Jeśli wartość jest pusta lub null, skrypt zwróci wyjątek InvalidInputException z odpowiednim komunikatem, zawierającym nazwę pola. Możesz zapisać ten skrypt jako walidator w Jirze i używać go do sprawdzania, czy pole ma wartość.
Skrypt ten pobiera menedżera załączników (attachmentManager) i sprawdza, czy istnieją załączniki w bieżącej sprawie (issue) za pomocą metody getAttachments(). Jeśli lista załączników jest pusta, skrypt zwróci wyjątek InvalidInputException z odpowiednim komunikatem. Możesz zapisać ten skrypt jako walidator w Jirze i używać go do sprawdzania, czy w sprawie znajduje się załącznik.
Oto przykładowy skrypt walidatora w Jirze, który sprawdza, czy pole opisu (description) ma co najmniej 50 znaków:
importcom.opensymphony.workflow.InvalidInputExceptionimportcom.atlassian.jira.component.ComponentAccessordef descriptionField =ComponentAccessor.getCustomFieldManager().getCustomFieldObjectByName("Description")def description = issue.getCustomFieldValue(descriptionField)if(description?.length()<50){thrownewInvalidInputException("Description field must have at least 50 characters.")}
Skrypt ten pobiera pole opisu (description) dla bieżącej sprawy (issue) i sprawdza, czy długość tego pola jest większa niż 50. Jeśli długość jest mniejsza, skrypt zwróci wyjątek InvalidInputException z odpowiednim komunikatem. Możesz zapisać ten skrypt jako walidator w Jirze i używać go do sprawdzania, czy pole description ma wymaganą długość.
Aby pobrać wartości pól z danego zgłoszenia w Jira za pomocą Script Runner i wykonać sumę tych pól, można użyć metody getValue() z obiektu Issue w celu pobrania wartości pola, a następnie dodać te wartości do siebie.
Przykładowy kod w Groovy, który pobiera wartości pól „customfield_10000” i „customfield_10001” z zgłoszenia o kluczu „ABC-123” i wykonuje ich sumę:
importcom.atlassian.jira.component.ComponentAccessordef issueKey ="ABC-123"def issue =ComponentAccessor.getIssueManager().getIssueObject(issueKey)def customFieldManager =ComponentAccessor.getCustomFieldManager()def field1 = customFieldManager.getCustomFieldObjectByName("Field 1")def field2 = customFieldManager.getCustomFieldObjectByName("Field 2")def value1 = issue.getCustomFieldValue(field1)asDoubledef value2 = issue.getCustomFieldValue(field2)asDoubledef sum = value1 + value2log.info("Sum of Field 1 and Field 2 for issue ${issueKey} is ${sum}")
W powyższym kodzie, najpierw uzyskujemy dostęp do menedżera pól niestandardowych Jira za pomocą ComponentAccessor.getCustomFieldManager(). Następnie pobieramy obiekty pól niestandardowych, których wartości chcemy pobrać, używając getCustomFieldObjectByName() i przekazując nazwy pól jako argumenty.
Następnie pobieramy wartości pól niestandardowych dla danego zgłoszenia, używając getCustomFieldValue() na obiekcie Issue. Ponieważ wartości pól niestandardowych mogą mieć różne typy, w tym przykładzie zakładamy, że oba pola są typu Double.
Na końcu dodajemy wartości pól i zapisujemy wynik do zmiennej sum. W przykładzie wykorzystujemy metodę log.info() do wyświetlenia wyniku.
Aby wykonać sumowanie wartości pól z kilku zgłoszeń w Jira za pomocą Script Runner, można użyć metody getIssues() z klasy SearchService do znalezienia i pobrania listy obiektów zgłoszeń, które pasują do określonych kryteriów wyszukiwania. Następnie można iterować po liście zgłoszeń i sumować wartości pól.
Przykładowy kod w Groovy, który znajduje i sumuje wartości pól „customfield_10000” i „customfield_10001” dla wszystkich zgłoszeń w projekcie o kluczu „PROJ” i wyświetla wynik:
importcom.atlassian.jira.component.ComponentAccessorimportcom.atlassian.jira.issue.Issueimportcom.atlassian.jira.issue.search.SearchExceptionimportcom.atlassian.jira.jql.builder.JqlQueryBuilderimportcom.atlassian.jira.web.bean.PagerFilterdef jqlQuery =JqlQueryBuilder.newBuilder() .where() .project("PROJ") .buildQuery()def searchService =ComponentAccessor.getComponent(SearchService)def user =ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser()def issues = searchService.search(user, jqlQuery,PagerFilter.getUnlimitedFilter()).issuesdef customFieldManager =ComponentAccessor.getCustomFieldManager()def field1 = customFieldManager.getCustomFieldObjectByName("Field 1")def field2 = customFieldManager.getCustomFieldObjectByName("Field 2")def sum =0.0for (Issue issue in issues) {def value1 = issue.getCustomFieldValue(field1)asDoubledef value2 = issue.getCustomFieldValue(field2)asDouble sum += value1 + value2}log.info("Sum of Field 1 and Field 2 for all issues in project PROJ is ${sum}")
W powyższym kodzie najpierw tworzymy zapytanie JQL, które znajduje wszystkie zgłoszenia w projekcie o kluczu „PROJ”. Następnie używamy searchService.search() do wykonania wyszukiwania i pobrania listy obiektów zgłoszeń, które pasują do zapytania.
Następnie pobieramy obiekty pól niestandardowych, których wartości chcemy pobrać, i iterujemy po liście zgłoszeń, sumując wartości pól. Na końcu wynik zapisujemy do zmiennej sum. W przykładzie wykorzystujemy metodę log.info() do wyświetlenia wyniku.
Aby wpisać wynik sumowania pól do nowego pola niestandardowego w Jira za pomocą Script Runner, można użyć metody setCustomFieldValue() na obiekcie MutableIssue w celu ustawienia wartości pola.
Przykładowy kod w Groovy, który znajduje i sumuje wartości pól „customfield_10000” i „customfield_10001” dla wszystkich zgłoszeń w projekcie o kluczu „PROJ” i zapisuje wynik do pola „customfield_10002” w pierwszym znalezionym zgłoszeniu:
importcom.atlassian.jira.component.ComponentAccessorimportcom.atlassian.jira.issue.Issueimportcom.atlassian.jira.issue.MutableIssueimportcom.atlassian.jira.issue.search.SearchExceptionimportcom.atlassian.jira.jql.builder.JqlQueryBuilderimportcom.atlassian.jira.web.bean.PagerFilterdef jqlQuery =JqlQueryBuilder.newBuilder() .where() .project("PROJ") .buildQuery()def searchService =ComponentAccessor.getComponent(SearchService)def user =ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser()def issues = searchService.search(user, jqlQuery,PagerFilter.getUnlimitedFilter()).issuesdef customFieldManager =ComponentAccessor.getCustomFieldManager()def field1 = customFieldManager.getCustomFieldObjectByName("Field 1")def field2 = customFieldManager.getCustomFieldObjectByName("Field 2")def targetField = customFieldManager.getCustomFieldObjectByName("Field 3")def sum =0.0for (Issue issue in issues) {def value1 = issue.getCustomFieldValue(field1)asDoubledef value2 = issue.getCustomFieldValue(field2)asDouble sum += value1 + value2}def firstIssue = issues.first()def mutableIssue =ComponentAccessor.getIssueManager().getIssueObject(firstIssue.id)asMutableIssuemutableIssue.setCustomFieldValue(targetField, sum)ComponentAccessor.getIssueManager().updateIssue(user, mutableIssue,EventDispatchOption.ISSUE_UPDATED,false)log.info("Sum of Field 1 and Field 2 for all issues in project PROJ is ${sum}. Result saved in Field 3 for issue ${firstIssue.key}")
W powyższym kodzie po obliczeniu sumy, najpierw pobieramy obiekt pola niestandardowego, do którego chcemy zapisać wynik (w przykładzie używamy nazwy „Field 3”). Następnie pobieramy pierwsze znalezione zgłoszenie i tworzymy obiekt MutableIssue z tego zgłoszenia. Ustawiamy wartość pola niestandardowego na obliczoną sumę za pomocą setCustomFieldValue() i zapisujemy zmiany za pomocą ComponentAccessor.getIssueManager().updateIssue(). W przykładzie wykorzystujemy metodę log.info() do wyświetlenia wyniku.
Aby wpisać wynik sumowania pól do konkretnego zgłoszenia w Jira za pomocą Script:
importcom.atlassian.jira.component.ComponentAccessorimportcom.atlassian.jira.issue.MutableIssuedef issue =ComponentAccessor.getIssueManager().getIssueByCurrentKey("ISSUE-123")def customFieldManager =ComponentAccessor.getCustomFieldManager()def field1 = customFieldManager.getCustomFieldObjectByName("Field 1")def field2 = customFieldManager.getCustomFieldObjectByName("Field 2")def targetField = customFieldManager.getCustomFieldObjectByName("Field 3")def value1 = issue.getCustomFieldValue(field1)asDoubledef value2 = issue.getCustomFieldValue(field2)asDoubledef sum = value1 + value2issue.setCustomFieldValue(targetField, sum)issue.store()log.info("Sum of Field 1 and Field 2 for issue ISSUE-123 is ${sum}. Result saved in Field 3.")
W powyższym kodzie pobieramy zgłoszenie o kluczu „ISSUE-123” i obliczamy sumę pól „Field 1” i „Field 2”. Następnie ustawiamy wartość pola „Field 3” na obliczoną sumę i zapisujemy zmiany. W przykładzie wykorzystujemy metodę log.info() do wyświetlenia wyniku.
Aby utworzyć własne funkcje JQL w Jira, wykonaj poniższe kroki:
Otwórz Script Console w Jira.
Utwórz nowy plik groovy, w którym zdefiniujesz funkcję.
Wprowadź skrypt do uruchomienia.
W skrypcie wprowadź składnię JQL, aby zdefiniować funkcję.
Skonfiguruj funkcję, aby zwracała poprawne wyniki.
Zapisz plik i uruchom skrypt, aby przetestować funkcję.
Zainstaluj wtyczkę ScriptRunner, jeśli jeszcze nie jest zainstalowana.
Otwórz stronę zarządzania wtyczką ScriptRunner.
Wybierz sekcję „JQL Functions” i dodaj nową funkcję.
Wpisz nazwę funkcji, jej opis i kod groovy.
Przetestuj funkcję, wykonując zapytanie JQL, które wykorzystuje nową funkcję.
Przykładowa funkcja JQL w Jira, która zwraca wszystkie problemy, których ostatnia aktualizacja była wykonana przez podanego użytkownika, może wyglądać następująco:
W powyższym przykładzie funkcja JQL nazywa się „lastUpdatedByUser” i przyjmuje jeden argument „user”. Funkcja wyszukuje wszystkie problemy, które są filtrowane przez zapytanie „issueFunction lastUpdatedByUser($user)”, a następnie sprawdza, czy ostatnia aktualizacja została wykonana przez podanego użytkownika.