Custom Jobs
Examples
Create an issue once a month
Configure a job to create an issue once every month. For example, as a project manager, I want to create an issue every month, reminding me to groom the backlog.
Marking an issue as inactive
You can configure a job to mark issues as inactive when they've been awaiting customer response for a specified duration. For example:
import com.atlassian.jira.bc.JiraServiceContextImpl
import com.atlassian.jira.bc.filter.SearchRequestService
import com.atlassian.jira.bc.issue.search.SearchService
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.user.ApplicationUsers
import com.atlassian.jira.web.bean.PagerFilter
import com.atlassian.jira.workflow.JiraWorkflow
import com.opensymphony.workflow.loader.ActionDescriptor
import com.opensymphony.workflow.loader.StepDescriptor
def searchService = ComponentAccessor.getComponent(SearchService)
def searchRequestService = ComponentAccessor.getComponent(SearchRequestService)
def userManager = ComponentAccessor.getUserManager()
def issueService = ComponentAccessor.getIssueService()
//////////////////////////// CONFIGURATION ////////////////////////////
def workflowUser = "admin" // user to run the query and do the transition as
def filterId = 10300 // filter ID
def actionName = "Mark Inactive" // name of workflow action to execute
def comment = """
This issue has not been updated for 5 business days.
If you have an update, please use "Add Comments For Atlassian" action to let us know. If you need more time to gather information please let us know and we will 'freeze' this issue. If you have no other questions, please Close this issue.
If no update is received in the next 5 business days, this issue will be automatically closed.
Thank you,
The Atlassian Support Team
"""
/////////////////////////////////////////////////////////////////////////
def user = userManager.getUserByName(workflowUser)
assert user: "can't find the user specified"
def serviceContext = new JiraServiceContextImpl(user)
def directoryUser = ApplicationUsers.toDirectoryUser(user)
def searchRequest = searchRequestService.getFilter(serviceContext, filterId)
assert searchRequest: "No search for ID: ${filterId} - check it exists and permissions for ${user.name}"
def query = searchRequest.query
def search = searchService.search(user, query, PagerFilter.getUnlimitedFilter())
def getActionIdFromName = { Issue issue, String name ->
JiraWorkflow workflow = ComponentAccessor.getWorkflowManager().getWorkflow(issue)
StepDescriptor step = workflow.getLinkedStep(issue.statusObject)
def actions = step.getActions()
actions.addAll(workflow.getDescriptor().getGlobalActions() ?: [])
def action = actions.find { ActionDescriptor ad -> ad.name == name }
action?.id
}
search.results.each { issue ->
log.warn("Inactivating issue ${issue.key}")
def issueInputParameters = issueService.newIssueInputParameters().setComment(comment)
Integer actionId = getActionIdFromName(issue, actionName)
if (actionId) {
def validationResult = issueService.validateTransition(directoryUser, issue.id, actionId, issueInputParameters)
if (validationResult.isValid()) {
def issueResult = issueService.transition(directoryUser, validationResult)
if (!issueResult.isValid()) {
log.warn("Failed to transition subtask ${issue.key}, errors: ${issueResult.errorCollection}")
}
} else {
log.warn("Could not transition subtask ${issue.key}, errors: ${validationResult.errorCollection}")
}
} else {
log.info("No action: $actionName found for issue: ${issue.key}")
}
}