It's not the same without you

Join the community to find out what other Atlassian users are discussing, debating and creating.

Atlassian Community Hero Image Collage

How to auto-close Epics if all the stories are closed, with ScriptRunner?

Hello Community,


I am new at ScriptRunner and I need to close epics when all stories/tasks are closed automatically because we have a lot of epics that are open (despite inside every issue is done) and then, when everything is closed, we still see the Epics in Backlog...


So, how to I update the epic status, close it and remove it from the backlogs list without click in every epic "Mark as Done" manually? 


Thank you so much in advance!

2 answers

Yes, this can be done with Automation for Jira and I am sure it can be done with scriptrunner as well. I have solved the same problem using Automation for Jira. 

0 votes
Leo Community Leader Dec 11, 2019

Hi @Alexandra Sousa DECSKILL ,

below code may give you some idea, this is working in server platform

import com.atlassian.jira.ComponentManager;
import com.atlassian.jira.component.ComponentAccessor;
import com.atlassian.jira.issue.CustomFieldManager;
import com.atlassian.jira.issue.fields.CustomField;
import com.atlassian.jira.issue.IssueManager;
import com.atlassian.jira.issue.MutableIssue;
import com.atlassian.jira.issue.Issue;
import com.atlassian.jira.user.ApplicationUser;
import com.atlassian.jira.bc.issue.IssueService
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.IssueInputParametersImpl
import com.atlassian.jira.web.bean.PagerFilter

def currentUser = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser()
def issueManager = ComponentAccessor.issueManager
IssueService issueService = ComponentAccessor.getIssueService()
def linkManager = ComponentAccessor.getIssueLinkManager()
def searchService = ComponentAccessor.getComponent(SearchService.class)
def actionId = 41 // change this to the step that you want the issues to be transitioned to

def transitionValidationResult
def transitionResult

def epicLink = ComponentAccessor.customFieldManager.getCustomFieldObjectByName("Epic Link")
def epic = issue.getCustomFieldValue(epicLink) as String
def issueE = issueManager.getIssueObject(epic);
def jqlSearch = "\"Epic Link\" = ${issueE.key}"
def allDone = true

SearchService.ParseResult parseResult = searchService.parseQuery(currentUser, jqlSearch)
if (parseResult.isValid()) {
def searchResult =, parseResult.getQuery(), PagerFilter.getUnlimitedFilter())
def issues = searchResult.issues.collect {issueManager.getIssueObject(}
issues.each { i ->
if (i.getResolution().name == 'Unresolved'){
allDone = false

if(issueE.getStatus().name != "Done" && allDone)
transitionValidationResult = issueService.validateTransition(currentUser,, actionId,new IssueInputParametersImpl())
if (transitionValidationResult.isValid()) {
transitionResult = issueService.transition(currentUser, transitionValidationResult)
if (transitionResult.isValid())
{ log.warn("Transitioned issue $issue through action $actionId") }
{ log.warn("Transition result is not valid") }
log.warn("The transitionValidation is not valid")





Thank you so much for your help! :) 

Suggest an answer

Log in or Sign up to answer

Community Events

Connect with like-minded Atlassian users at free events near you!

Find an event

Connect with like-minded Atlassian users at free events near you!

Unfortunately there are no Community Events near you at the moment.

Host an event

You're one step closer to meeting fellow Atlassian users at your local event. Learn more about Community Events

Events near you