Для того чтобы задать запуск Jelly script периодически: 
1. Создайте фильтр с запросами по которым не было активностей более 10 дней.
2. Создайте файл closurescript.xml с текстом:

<JiraJelly xmlns:jira="jelly:com.atlassian.jira.jelly.enterprise.JiraTagLib" xmlns:core="jelly:core" xmlns:log="jelly:log" >
<jira:Login username="ИМЯ ПОЛЬЗОВАТЕЛЯ" password="ПАРОЛЬ">
    <log:info>ЗАПУСК СЛУЖБЫ ЗАКРЫТИЯ ЗАПРОСОВ</log:info>
    <!-- Properties for the script -->
    <core:set var="comment">ПО ДАННОМУ ЗАПРОСУ НЕ БЫЛО АКТИВНОСТИ В ТЕЧЕНИИ 10 РАБОЧИХ ДНЕЙ. ЗАПРОС ЗАКРЫВАЕТСЯ.</core:set>
    <core:set var="workflowStep" value="НОМЕР ИЛИ НАЗВАНИЕ ПЕРЕХОДА" />
    <core:set var="workflowUser" value="ИМЯ ПОЛЬЗОВАТЕЛЯ" />
    <core:set var="НАЗВАНИЕ ФИЛЬТРА" value="ID ФИЛЬТРА" />

    <!-- Run the SearchRequestFilter -->
    <jira:RunSearchRequest filterid="${НАЗВАНИЕ ФИЛЬТРА}" var="issues" />

    <!-- Iterate over the issues -->
    <core:forEach var="issue" items="${issues}">
        <log:warn>Закрытие неактивного запроса ${issue.key}</log:warn>
        <jira:TransitionWorkflow key="${issue.key}" user="${workflowUser}" workflowAction="${workflowStep}" comment="${comment}" resolution="РЕЗОЛЮЦИЯ"/>
    </core:forEach>
</jira:Login>
</JiraJelly>

Первый пользователь (Login username) - от кого будет осуществлен вход в систему и собран фильтр.
Второй пользователь (workflowUser) - от кого будет осуществлен переход бизнес-процесса и оставлен комментарий.
Фильтр - набор запросов, которые вы хотите изменить, то есть закрыть. Выбираете, например, все запросы, которые не обновлялись последние 7 дней.

3. Настройте службу со следующими параметрами:

- Класс: com.atlassian.jira.jelly.service.JellyService.

- Входной Файл: C:\jirascripts\closurescript.xml

- Выходной Файл: C:\jirascripts\closureoutput.xml

- Настройте интервал выполнения: Задержка (в минутах).

Для справки

  • Внимательно создавайте фильтр, иначе скрипт не сработает, если хотя бы один запрос не будет иметь заданного перехода.
  • ID фильтра будет отображен в адресной строке, когда вы находитесь в навигаторе запросов. В примере id равен 10001: http://localhost:8095/secure/IssueNavigator.jspa?mode=hide&requestId=10001
  • Скрипт можно протестировать в окне запуска скриптов.
  • Для добавления значения в пользовательское поле используйте это решение.

11 Comments

  1. <jira:RunSearchRequest filterid="${НАЗВАНИЕ ФИЛЬТРА}" var="issues" /> Название фильтра надо вписать? Или это часть кода?

     

    <log:warn>Закрытие неактивного запроса ${issue.key}</log:warnissue.key надо вписать? Откуда его взять тогда?

     

    1. НАЗВАНИЕ ФИЛЬТРА - это его ID. Найти сможете в адресной строке, когда перейдете на фильтр. Например: http://jira.teamlead.ru/issues/?filter=10570. Здесь ID=10570.

  2. Скрипт запускается вручную? Нельзя настроить что бы он сам запускался каждый день?

    1. В пункте 3 сказано, что вам необходимо настроить службу. Службу вы сможете запускать с определенным интервалом.

  3. Как в 

     <jira:TransitionWorkflow key="${issue.key}" user="${workflowUser}" workflowAction="${workflowStep}" comment="${comment}" resolution="РЕЗОЛЮЦИЯ"/>

    добавить пользовательское поле с определенным значением?

    Например, у меня есть пользовательское поле "customfield_10504" (оценка за выполненный запрос) и я хочу, чтобы задача автоматически закрывалась с оценкой "5".

    1. Пока с помощью jelly нельзя это делать. Может быть просто повесть такую пост-функцию на переход, а сам переход совершать jelly?

      1. Антон,

        А как будет себя вести переход при условии, что это поле является обязательным (идет проверка валидатором) и должна при ручном переходе изменяться пользователем (например, пользователь хочет поставить оценку "3")? 

        Пока нашел по этой проблеме только этот плагин расширения - http://www.minyaa.com/documentation/latest/Features/ModuleTools/JellyTags.html#TransitionWorkflowExtended%20Tag

        И еще меня мучает вот какой вопрос:

        При запуске следующего скрипта:

         

        <JiraJelly xmlns:jira="jelly:com.atlassian.jira.jelly.enterprise.JiraTagLib" xmlns:core="jelly:core" xmlns:log="jelly:log" >
        <jira:Login username="admin" password="MyPasword">
        <log:info>ЗАПУСК СЛУЖБЫ АВТОМАТИЧЕСКОГО ЗАКРЫТИЯ ЗАПРОСОВ</log:info>
        <!-- Properties for the script -->
        
        <core:set var="comment">Добрый день!</core:set>
        <core:set var="workflowStep" value="2" />
        <core:set var="workflowUser" value="admin" />
        <core:set var="FILTER_IST_SUPPORT_AUTOCLOSE_3_DAYS" value="10101" />
        <!-- Run the SearchRequestFilter -->
        
        <jira:RunSearchRequest filterid="${FILTER_IST_SUPPORT_AUTOCLOSE_3_DAYS}" var="issues" />
        <!-- Iterate over the issues -->
        
        <core:forEach var="issue" items="${issues}">
        <log:warn>Автоматическое закрытие неактивного запроса ${issue.key}</log:warn>
        <jira:AddCustomFieldValue id="customfield_10504" value="10305" />
        <jira:TransitionWorkflow key="${issue.key}" user="${workflowUser}" workflowAction="${workflowStep}" comment="${comment}" />
        </core:forEach>
        </jira:Login>
        </JiraJelly>
        

        Система возвращает:

         

        <JiraJelly xmlns:jira="jelly:com.atlassian.jira.jelly.enterprise.JiraTagLib" xmlns:core="jelly:core" xmlns:log="jelly:log">
        file:/var/lib/atlassian/jirascripts/ist-support-autoclose.xml:17:70: <jira:AddCustomFieldValue> AddCustomFieldValue must be inside a CreateIssue or a TransitionWorkflow tag

         

         Т.е. теоретически блок <jira:AddCustomFieldValue id="customfield_10504" value="10305" /> возможно поместить внутрь блока <jira:TransitionWorkflow>, но как это сделать?

        Перепробовал уже кучу вариантов.

         

        1. Разобрался, Антон.

          Тег <jira:TransitionWorkflow> (без закрывающего слеша в конце!) можно разрывать и в разрыв добавить тег <jira:AddCustomFieldValue>, потом все закрывать тегом </jira:TransitionWorkflow>. У меня основная проблема была в том, что наименования тегов регистрозависимые. Т.е. <jira:TransitionWorkflow> ≠ <jira:TransitionWorkFlow>

          Правильный код ниже.

  4. Вот правильный Jelly-скрипт, который закрывает задачу с добавлением значения в пользовательское поле:

     

    <JiraJelly xmlns:jira="jelly:com.atlassian.jira.jelly.enterprise.JiraTagLib" xmlns:core="jelly:core" xmlns:log="jelly:log" >
    <jira:Login username="admin" password="MyPassword" >
    <log:info>ЗАПУСК СЛУЖБЫ АВТОМАТИЧЕСКОГО ЗАКРЫТИЯ ЗАПРОСОВ</log:info>
    <!-- Properties for the script -->
    <core:set var="comment">Добрый день!\\ Данный запрос закрывается автоматически с максимальной оценкой 5 (пять), так как в течении 3-х дней мы не дождались от Вас ответа.</core:set>
    <core:set var="workflowStep" value="2" />
    <core:set var="workflowUser" value="admin" />
    <core:set var="FILTER_IST_SUPPORT_AUTOCLOSE_3_DAYS" value="10101" />
    <!-- Run the SearchRequestFilter -->
    <jira:RunSearchRequest filterid="${FILTER_IST_SUPPORT_AUTOCLOSE_3_DAYS}" var="issues" />
    <!-- Iterate over the issues -->
    <core:forEach var="issue" items="${issues}" >
    <log:warn>Автоматическое закрытие неактивного запроса ${issue.key}</log:warn>
    <jira:TransitionWorkflow key="${issue.key}" user="${workflowUser}" workflowAction="${workflowStep}" comment="${comment}" >
    <jira:AddCustomFieldValue id="customfield_10504" value="10305" /> <!-- id - идентификатор пользовательского поля value - идентификатор значения пользовательского поля (в случае с типом поля переключатель или само значение значение->
    <!-- Сюда могут ставиться другие совместимые команды (теги), которые должны быть  выполнены в переходе -->
    </jira:TransitionWorkflow>
    </core:forEach>
    </jira:Login>
    </JiraJelly>

     

     

    1. Константин, спасибо за ваш отзыв! Пополнил статью вашей ссылкой.

  5. Хотелось бы знать, возможно ли создать "робота" на оповещение членов Visible о просроченной заявке?