How many of you knows, when an issue grows and become a big issue ( for diverse reasons, more comments, more worklogged hous in Tempo, …), then the access to this ticket cost a lot of CPU. In this post I try to make a little example of a Custom Groovy Scriptrunner Service to archive all the big tasks ( closing the task and creating a new version).
import com.atlassian.crowd.embedded.api.User
import com.atlassian.jira.bc.JiraServiceContextImpl
import com.atlassian.jira.bc.issue.search.SearchService
import com.atlassian.jira.issue.search.*
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.IssueManager
import com.atlassian.jira.issue.comments.CommentManager
import com.atlassian.jira.user.util.UserUtil
import com.atlassian.jira.web.bean.PagerFilter
import com.atlassian.jira.ComponentManager
import com.atlassian.jira.project.ProjectManager
import com.atlassian.jira.issue.IssueManager
import com.atlassian.jira.issue.index.IndexException
import com.atlassian.jira.ManagerFactory
import com.atlassian.jira.user.ApplicationUser
import org.apache.log4j.Category
import com.atlassian.jira.user.util.UserUtil
import com.atlassian.jira.ComponentManager
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.link.IssueLink
import com.atlassian.jira.util.ImportUtils
import com.opensymphony.workflow.WorkflowContext
import com.atlassian.jira.user.ApplicationUsers
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.user.util.UserManager
import com.atlassian.jira.user.ApplicationUser
import com.atlassian.jira.ManagerFactory
import com.atlassian.jira.jql.parser.JqlQueryParser
import com.atlassian.jira.web.bean.PagerFilter
import com.atlassian.jira.ComponentManager
import com.opensymphony.workflow.WorkflowContext
import com.atlassian.jira.workflow.WorkflowTransitionUtil;
import com.atlassian.jira.workflow.WorkflowTransitionUtilImpl;
import com.atlassian.jira.util.JiraUtils;
WorkflowTransitionUtil workflowTransitionUtil = ( WorkflowTransitionUtil ) JiraUtils.loadComponent( WorkflowTransitionUtilImpl.class );
String jqlSearch = " project in (..) and status != xxx and timespent >= xxxx and ...";
SearchService searchService = ComponentAccessor.getComponent(SearchService.class)
def jqlQueryParser = ComponentAccessor.getComponent(JqlQueryParser.class)
ComponentManager componentManager = ComponentManager.getInstance()
CommentManager commentManager = ComponentAccessor.getCommentManager()
IssueManager issueManager = ComponentAccessor.getIssueManager();
ApplicationUser user = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser();
UserUtil userUtil = ComponentAccessor.getUserUtil()
def searchProvider = ComponentAccessor.getComponent(SearchProvider.class)
def user2 = userUtil.getUserByKey("admin_user")
Category log = Category.getInstance("com.onresolve.jira.groovy")
log.setLevel(org.apache.log4j.Level.DEBUG)
log.debug "START: SERVICE CLONE AND ARCHIVE BIG ISSUES"
def String adminUserName = "admin_user"
def String nagComment = ""
SearchService.ParseResult parseResult = searchService.parseQuery(user2.getDirectoryUser(), jqlSearch)
if (parseResult.isValid()) {
def searchResult = searchService.search(user2.getDirectoryUser(), parseResult.getQuery(), PagerFilter.getUnlimitedFilter())
issues = searchResult.issues.collect {issueManager.getIssueObject(it.id)}
log.debug "Size:" + issues.size();
//------ Another way to do the same --------
//def ctx = new JiraServiceContextImpl(user2);
//def query = jqlQueryParser.parseQuery(jqlSearch);
//def results = searchProvider.search(query, user2, PagerFilter.getUnlimitedFilter());
//def sr = searchRequestService.getFilter(ctx, results);
//def issues = results.getIssues();
//log.debug "Size:" + issues.size();
for ( issue in issues ){
log.debug "Issue: " +issue.getKey();
nagComment = "Hello [~"+issue.reporter.name+"],\nThis ticket is very big. Archiving ticket."
log.debug "issue: ${issue.getId()}, ${issue.getKey()} commented to ARCHIVE."
commentManager.create(issueManager.getIssueObject(issue.getKey()), adminUserName, nagComment, true)
issueFactory = ComponentManager.getInstance().getIssueFactory()
newissue = issueFactory.getIssue()
newissue.setSummary (issue.summary)
newissue.setProject (issue.project)
newissue.setIssueTypeId(issue.issueTypeObject.id)
newissue.description = issue.description
newissue.reporter = issue.getReporter()
newissue.assignee = issue.getAssignee()
params = ["issue":newissue]
subTask = issueManager.createIssue(adminUserName, params)
nagComment = "The new ticket is " + newissue.getKey();
log.debug "issue: ${issue.getId()}, ${issue.getKey()} commented to ARCHIVE."
commentManager.create(issueManager.getIssueObject(issue.getKey()), adminUserName, nagComment, true)
//Clone link
linkMgr = ComponentManager.getInstance().getIssueLinkManager()
linkMgr.createIssueLink (newissue.id, issue.id, Long.parseLong("XXXXX"),Long.valueOf(1), user2.getDirectoryUser())
//SET STATUS CLOSED
MutableIssue myIssue = issue
myIssue.setStatusId("X") //CLOSED
myIssue.setResolutionId("X") //DONE
myIssue.setSummary ("Archived:" + issue.summary)
myIssue.store()
issueobtained = issueManager.getIssueObject(issue.getKey());
ManagerFactory.getIndexManager().reIndex(issueobtained.getGenericValue());
workflowTransitionUtil.setIssue(issue);
workflowTransitionUtil.setUsername(adminUserName);
workflowTransitionUtil.setAction (X); //Transition to Close
workflowTransitionUtil.validate();
workflowTransitionUtil.progress();
}
log.debug "FINISH: SERVICE "
} else {
log.debug("Invalid JQL: " + jqlSearch);
}





