Комментарий к проблеме Jira для связанных страниц Confluence - malikovalibek/groovyForJira GitHub Wiki
Обзор Автоматически комментировать проблему Jira при каждом обновлении связанной страницы Confluence.
пример Я менеджер проекта и связал свои экземпляры Confluence и Jira. Я также связал некоторые проблемы Jira с некоторыми страницами Confluence.
Когда страница Confluence обновляется дополнительной информацией, я хочу, чтобы разработчик, назначенный для связанных проблем, был уведомлен. Я могу использовать этот скрипт в качестве прослушивателя событий в ScriptRunner для Confluence, чтобы автоматически публиковать комментарий по проблеме Jira при обновлении связанной страницы Confluence, тем самым уведомляя назначенного разработчика о любых изменениях.
Хорошо знать Этот скрипт требует, чтобы на вашем экземпляре Jira был установлен ScriptRunner for Jira, а на вашем экземпляре Confluence был установлен ScriptRunner for Confluence. Используются функции обоих плагинов. Этот сценарий должен быть настроен как прослушиватель событий в Confluence. Этот скрипт предполагает, что ваши экземпляры Jira и Confluence имеют совпадающие пользовательские каталоги. Вам также понадобится сервисная учетная запись на вашем экземпляре Jira с правами администратора, как указано в комментарии к коду в строке 30. PageUpdatedEvent можно было бы использовать , чтобы получить более подробную информацию об обновлении , которые могут быть записаны в комментарий тела. Этот сценарий использует функцию удаленного управления ScriptRunner для запуска кода в удаленном экземпляре Confluence. Код, выполняемый в Jira, использует ScriptRunner for Jira JQL-функцию connectedIssuesOfRemote для поиска проблем Jira, связанных с обновленной страницей Confluence. Альтернативной конфигурацией для удовлетворения той же потребности было бы создание конечной точки REST в Jira и вызов ее из прослушивателя событий в Confluence. Это потребует поддержки двух скриптов в двух системах, но по отдельности их может быть проще рассуждать, и это устранит необходимость в аннотациях @Grape. Какой подход вы предпочтете - решать вам! @Grapes([ @Grab("com.atlassian.jira:jira-api:8.0.0"), /* Many transitive dependencies of the Jira API will either be provided by the host Confluence application or simply aren't needed for this script. Since several of them won't be resolvable with the default configuration, we exclude them with the below annotations.
*/ @GrabExclude("com.atlassian.annotations:atlassian-annotations"), @GrabExclude("jta:jta"), @GrabExclude("log4j:log4j"), @GrabExclude("webwork:pell-multipart-request"), @GrabExclude("org.codehaus.jackson:jackson-core-asl"), @GrabExclude("org.codehaus.jackson:jackson-mapper-asl"), @GrabExclude("com.atlassian.sal:sal-api"), @GrabExclude("com.atlassian.gadgets#atlassian-gadgets-api"), ]) import com.atlassian.confluence.user.AuthenticatedUserImpersonator import com.atlassian.confluence.user.AuthenticatedUserThreadLocal import com.atlassian.jira.bc.issue.comment.CommentService import com.atlassian.jira.bc.issue.comment.CommentService.CommentParameters.CommentParametersBuilder import com.atlassian.jira.bc.issue.search.SearchService import com.atlassian.jira.component.ComponentAccessor import com.atlassian.jira.jql.parser.JqlQueryParser import com.atlassian.jira.web.bean.PagerFilter import com.atlassian.sal.api.component.ComponentLocator import com.atlassian.user.UserManager import com.onresolve.scriptrunner.remote.RemoteControl import com.atlassian.jira.user.util.UserManager as JiraUserManager
def page = event.page def (title, pageId, spaceKey) = [page.title, page.id, page.space.key] def currentUserKey = AuthenticatedUserThreadLocal.get().name log.debug "Current user is ${currentUserKey}" def serviceAccountUser = ComponentLocator.getComponent(UserManager).getUser('serviceaccount') //change this to a user with admin permissions on your remote Jira instance
def messages = AuthenticatedUserImpersonator.REQUEST_AGNOSTIC.asUser({ RemoteControl.forPrimaryJiraAppLink().exec { log.debug "Beginning attempt to create comment in Jira" def commentService = ComponentAccessor.getComponent(CommentService) def jqlQueryParser = ComponentAccessor.getComponent(JqlQueryParser) def searchService = ComponentAccessor.getComponent(SearchService) def user = ComponentAccessor.getComponent(JiraUserManager).getUserByName(currentUserKey) log.debug "Will seearch & create comments as ${user.name}" def jql = "issueFunction in linkedIssuesOfRemote('query', 'pageId=${pageId}')" log.debug "Searching with JQL query ${jql}" def query = jqlQueryParser.parseQuery(jql) def results = searchService.search(user, query, PagerFilter.unlimitedFilter) def issues = results.results issues.collect { issue -> log.debug "Found issue ${issue.key}; attempting to create comment as ${user.name}" def commentParameters = new CommentParametersBuilder() .author(user) .body("Page ${title} has been updated") // Customize this comment to contain the information you need .issue(issue) .build() def commentCreateValidationResult = commentService.validateCommentCreate(user, commentParameters) if (commentCreateValidationResult.isValid()) { def comment = commentService.create(user, commentCreateValidationResult, true) def message = "Created comment ${comment.id} on issue ${issue.key} in repsonse to update of page '${title}' in the ${spaceKey} space" log.debug message return message } log.error "Could not create comment as ${user.name}" commentCreateValidationResult.errorCollection.errorMessages.each { log.error it } commentCreateValidationResult.warningCollection.warnings.each { log.warn it } } } }, serviceAccountUser)
messages.each { log.debug messages }