Jira Script Runner Groovy Examples
Jira Script Runner Groovy Examples
through custom scripts written in Groovy. Here are some common examples of how you
can use ScriptRunner in Jira:
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.Issue
def workflowTransitionUtil =
ComponentAccessor.getComponent(com.atlassian.jira.workflow.WorkflowTransitionUtil
)
workflowTransitionUtil.setIssue(issue)
workflowTransitionUtil.setUserkey(user.key)
workflowTransitionUtil.validate()
workflowTransitionUtil.progress()
}
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.MutableIssue
if (issue.getPriority().getName() == "High") {
issue.setAssignee(user)
issue.store()
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.issue.IssueFactory
if (parentIssue.getIssueType().getName() == "Task") {
subTask.setParentObject(parentIssue)
subTask.setAssignee(parentIssue.getAssignee())
subTaskManager.createIssue(user, subTask)
```
```groovy
import com.atlassian.mail.server.SMTPMailServer
import com.atlassian.mail.Email
import com.atlassian.jira.component.ComponentAccessor
def mailServer =
ComponentAccessor.getMailServerManager().getDefaultSMTPMailServer()
if (mailServer) {
mailServer.send(email)
} else {
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.comments.CommentManager
def issueManager = ComponentAccessor.getIssueManager()
if (issue.getPriority().getName() == "Critical") {
```
These examples showcase various ways you can utilize Jira ScriptRunner to enhance
your Jira workflows. Always ensure you test scripts in a staging environment before
applying them to production to prevent any disruptions.
Sure, here are some more advanced examples of how you can use Jira ScriptRunner to
automate and extend Jira functionalities.
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.issue.search.SearchProvider
import com.atlassian.jira.web.bean.PagerFilter
def customField =
customFieldManager.getCustomFieldObjectByName("CustomFieldName")
issueManager.updateIssue(user, mutableIssue,
EventDispatchOption.DO_NOT_DISPATCH, false)
```
Clone an issue and create a link between the original and the clone.
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.IssueFactory
import com.atlassian.jira.issue.link.IssueLinkManager
def issueManager = ComponentAccessor.getIssueManager()
issueManager.createIssue(user, clone)
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.issue.search.SearchProvider
import com.atlassian.jira.web.bean.PagerFilter
import com.atlassian.jira.bc.issue.search.SearchService
def query = "project = TEST AND \"Time to resolution\" <= remaining(\"1d\") AND
status != Resolved"
mutableIssue.setPriority(highPriority)
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.search.SearchProvider
import com.atlassian.jira.web.bean.PagerFilter
import com.atlassian.jira.workflow.TransitionOptions
if (transitionResult.isValid()) {
issueService.transition(user, transitionResult)
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.issue.security.IssueSecurityLevelManager
if (issue.getPriority().getName() == "High") {
mutableIssue.setSecurityLevelId(securityLevel.id)
```
Certainly! Here are more advanced ScriptRunner examples to help you further automate
and extend your Jira workflows:
import com.atlassian.jira.component.ComponentAccessor
import com.opensymphony.workflow.InvalidInputException
def customField =
customFieldManager.getCustomFieldObjectByName("CustomFieldName")
if (!fieldValue) {
```
Automatically close issues that have been in a specific status for more than a certain
number of days.
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.search.SearchProvider
import com.atlassian.jira.web.bean.PagerFilter
import com.atlassian.jira.bc.issue.IssueService
import com.atlassian.jira.bc.issue.search.SearchService
import com.atlassian.jira.datetime.JiraDateUtils
def query = "project = TEST AND status = 'Resolved' AND resolved <= -7d" // JQL for
issues resolved more than 7 days ago
if (transitionResult.isValid()) {
issueService.transition(user, transitionResult)
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.link.IssueLinkManager
import com.atlassian.jira.issue.CustomFieldManager
def issueManager = ComponentAccessor.getIssueManager()
def customField =
customFieldManager.getCustomFieldObjectByName("RelatedIssueKey")
if (relatedIssueKey) {
if (relatedIssue) {
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.MutableIssue
import java.time.LocalDate
def issueManager = ComponentAccessor.getIssueManager()
switch (issue.getPriority().getName()) {
case "Highest":
mutableIssue.setDueDate(Date.from(today.plusDays(1).atStartOfDay(ZoneId.systemDef
ault()).toInstant()))
break
case "High":
mutableIssue.setDueDate(Date.from(today.plusDays(3).atStartOfDay(ZoneId.systemDef
ault()).toInstant()))
break
case "Medium":
mutableIssue.setDueDate(Date.from(today.plusDays(7).atStartOfDay(ZoneId.systemDef
ault()).toInstant()))
break
case "Low":
mutableIssue.setDueDate(Date.from(today.plusDays(14).atStartOfDay(ZoneId.systemDe
fault()).toInstant()))
break
case "Lowest":
mutableIssue.setDueDate(Date.from(today.plusDays(30).atStartOfDay(ZoneId.systemDe
fault()).toInstant()))
break
issueManager.updateIssue(ComponentAccessor.getJiraAuthenticationContext().getLogg
edInUser(), mutableIssue, EventDispatchOption.ISSUE_UPDATED, false)
```
Automatically clone and escalate issues to another project if they meet certain criteria.
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.IssueFactory
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.issue.link.IssueLinkManager
if (issue.getPriority().getName() == "Critical") {
clone.setReporter(user)
clone.store()
issueManager.createIssue(user, clone)
```
```groovy
import com.opensymphony.workflow.InvalidInputException
import com.atlassian.jira.component.ComponentAccessor
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.AttachmentManager
import com.atlassian.jira.issue.MutableIssue
import org.apache.pdfbox.pdmodel.PDDocument
import org.apache.pdfbox.pdmodel.PDPage
import org.apache.pdfbox.pdmodel.PDPageContentStream
import org.apache.pdfbox.pdmodel.font.PDType1Font
document.addPage(page)
contentStream.setFont(PDType1Font.HELVETICA, 12)
contentStream.beginText()
contentStream.newLineAtOffset(100, 700)
contentStream.newLineAtOffset(0, -20)
contentStream.endText()
contentStream.close()
document.save(tempFile)
document.close()
tempFile.delete()
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.MutableIssue
def urgency =
issue.getCustomFieldValue(ComponentAccessor.getCustomFieldManager().getCustomFi
eldObjectByName("Urgency"))
def impact =
issue.getCustomFieldValue(ComponentAccessor.getCustomFieldManager().getCustomFi
eldObjectByName("Impact"))
} else {
mutableIssue.setPriority(priority)
issueManager.updateIssue(ComponentAccessor.getJiraAuthenticationContext().getLogg
edInUser(), mutableIssue, EventDispatchOption.ISSUE_UPDATED, false)
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.watchers.WatcherManager
def issue
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.watchers.WatcherManager
if (user) {
watcherManager.startWatching(user, issue)
}
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
if (groupManager.isUserInGroup(user, group)) {
return true
} else {
return false
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import groovy.json.JsonBuilder
import groovyx.net.http.RESTClient
def payload = [
username: "JiraBot",
icon_emoji: ":jira:"
restClient.post(
requestContentType: 'application/json'
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.event.issue.IssueEvent
def issueManager = ComponentAccessor.getIssueManager()
if (transitionValidationResult.isValid()) {
issueService.transition(user, transitionValidationResult)
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.MutableIssue
issue.setAssignee(user)
issue.store()
project.setCustomFieldValue(customField, nextAssignee)
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import groovy.json.JsonBuilder
import groovyx.net.http.RESTClient
def issueManager = ComponentAccessor.getIssueManager()
def payload = [
issueKey: issue.key,
summary: issue.summary,
description: issue.description,
status: issue.getStatus().getName()
restClient.post(
requestContentType: 'application/json'
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.opensymphony.workflow.InvalidInputException
def customField =
customFieldManager.getCustomFieldObjectByName("CustomFieldName")
```
```groovy
import com.atlassian.mail.server.SMTPMailServer
import com.atlassian.mail.Email
import com.atlassian.jira.component.ComponentAccessor
def mailServer =
ComponentAccessor.getMailServerManager().getDefaultSMTPMailServer()
if (mailServer) {
Absolutely, here are additional ScriptRunner examples for further automation and
customization in Jira:
### 26. Custom Email Notifications (Continued)
```groovy
import com.atlassian.mail.Email
import com.atlassian.mail.server.SMTPMailServer
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.Issue
def mailServer =
ComponentAccessor.getMailServerManager().getDefaultSMTPMailServer()
if (mailServer) {
mailServer.send(email)
} else {
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.IssueInputParametersImpl
import com.atlassian.jira.issue.link.IssueLinkManager
issueInputParameters.setProjectKey(projectKey)
issueInputParameters.setIssueTypeId(issueTypeId)
issueInputParameters.setReporterId(user.key)
if (validationResult.isValid()) {
if (createResult.isValid()) {
issueLinkManager.createIssueLink(issue.id, createResult.issue.id, 10000, 1, user) //
10000 is the link type ID for "Relates"
```
Ensure all sub-tasks are closed before allowing the parent issue to be closed.
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.Issue
import com.opensymphony.workflow.InvalidInputException
if (issue.isSubTask()) {
return
if (openSubTasks) {
throw new InvalidInputException("All sub-tasks must be closed before closing the
parent issue.")
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.link.IssueLinkManager
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.issue.MutableIssue
def customField =
customFieldManager.getCustomFieldObjectByName("LinkedIssuesStatus")
mutableIssue.setCustomFieldValue(customField, linkedIssuesStatusStr)
issueManager.updateIssue(ComponentAccessor.getJiraAuthenticationContext().getLogg
edInUser(), mutableIssue, EventDispatchOption.DO_NOT_DISPATCH, false)
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.project.ProjectComponent
def userToAssign
if (component.getName() == "Database") {
userToAssign = userManager.getUserByKey("database_user")
userToAssign = userManager.getUserByKey("ui_user")
}
if (userToAssign) {
mutableIssue.setAssignee(userToAssign)
issueManager.updateIssue(ComponentAccessor.getJiraAuthenticationContext().getLogg
edInUser(), mutableIssue, EventDispatchOption.DO_NOT_DISPATCH, false)
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.link.IssueLinkManager
import com.atlassian.jira.issue.MutableIssue
if (highestSeverity == "Blocker") {
if (priority) {
mutableIssue.setPriority(priority)
issueManager.updateIssue(ComponentAccessor.getJiraAuthenticationContext().getLogg
edInUser(), mutableIssue, EventDispatchOption.DO_NOT_DISPATCH, false)
```
```groovy
import com.atlassian.mail.Email
import com.atlassian.mail.server.SMTPMailServer
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.Issue
def mailServer =
ComponentAccessor.getMailServerManager().getDefaultSMTPMailServer()
mailServer.send(email)
```
```groovy
import groovyx.net.http.RESTClient
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.Issue
def issueManager = ComponentAccessor.getIssueManager()
requestContentType: 'application/json'
if (response.status != 200) {
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.AttachmentManager
import com.atlassian.jira.issue.MutableIssue
Certainly! Here are even more advanced ScriptRunner examples for Jira:
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.AttachmentManager
import com.atlassian.jira.issue.IssueManager
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.user.ApplicationUser
def csvContent =
"Key,Summary,Status\n${issue.key},${issue.summary},${issue.status.name}\n"
tempFile.write(csvContent)
attachmentManager.createAttachment(tempFile, "issue-report.csv", "text/csv", user,
issue, null, new Date())
tempFile.delete()
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.search.SearchProvider
import com.atlassian.jira.bc.issue.search.SearchService
import com.atlassian.jira.web.bean.PagerFilter
import com.atlassian.jira.issue.IssueManager
import com.atlassian.jira.issue.MutableIssue
issue.setDescription("Updated description")
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.event.issue.IssueEvent
import com.atlassian.jira.bc.issue.IssueService
if (issueEvent.eventTypeId == EventType.ISSUE_COMMENTED_ID) {
if (transitionValidationResult.isValid()) {
issueService.transition(user, transitionValidationResult)
}
```
### 37. Calculate and Set Due Date Based on Custom Field
Calculate and set the due date based on a custom field value.
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.MutableIssue
if (daysToComplete != null) {
issue.setDueDate(dueDate)
}
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.MutableIssue
if (summary.contains("urgent")) {
labels.add("urgent")
if (summary.contains("bug")) {
labels.add("bug")
issue.setLabels(labels)
```
### 39. Sync Custom Field Value with External System
Sync a custom field value with an external system via REST API.
```groovy
import com.atlassian.jira.component.ComponentAccessor
import groovy.json.JsonBuilder
import groovyx.net.http.RESTClient
def payload = [
issueKey: issue.key,
externalId: externalId
requestContentType: 'application/json'
)
if (response.status != 200) {
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.link.IssueLinkManager
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.bc.issue.IssueService
if (allResolved) {
issueService.transition(user, transitionValidationResult)
```
Bulk clone issues in a project and link them to the original issues.
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.IssueFactory
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.issue.link.IssueLinkManager
import com.atlassian.jira.bc.issue.IssueService
import com.atlassian.jira.issue.IssueInputParametersImpl
clonedIssue.setProjectId(issue.getProjectObject().getId())
clonedIssue.setIssueTypeId(issue.getIssueTypeObject().getId())
clonedIssue.setReporter(user)
if (createResult.isValid()) {
```
These examples should give you a broader range of automation and customization
options for your Jira environment using ScriptRunner. Feel free to adapt and combine
these scripts according to your specific requirements.
Certainly! Here are even more advanced ScriptRunner examples for Jira:
### 42. Update Issue Custom Field Based on Linked Issue Field
Update a custom field in an issue based on a field value from linked issues.
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.link.IssueLinkManager
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.issue.MutableIssue
mutableIssue.setCustomFieldValue(customField, highestPriority)
issueManager.updateIssue(ComponentAccessor.getJiraAuthenticationContext().getLogg
edInUser(), mutableIssue, EventDispatchOption.DO_NOT_DISPATCH, false)
```
import com.atlassian.jira.component.ComponentAccessor
import com.opensymphony.workflow.InvalidInputException
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.comments.CommentManager
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.link.IssueLinkManager
import com.atlassian.jira.issue.MutableIssue
if (reporter) {
mutableIssue.setAssignee(reporter)
issueManager.updateIssue(ComponentAccessor.getJiraAuthenticationContext().getLogg
edInUser(), mutableIssue, EventDispatchOption.DO_NOT_DISPATCH, false)
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.mail.Email
import com.atlassian.mail.server.SMTPMailServer
def mailServer =
ComponentAccessor.getMailServerManager().getDefaultSMTPMailServer()
if (labels.contains("important")) {
email.setBody("The important label has been added to the issue ${issue.key}. Please
review it immediately.")
mailServer.send(email)
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.issue.CustomFieldManager
import java.time.Duration
def slaEnd = new Date() // Assuming this is the end of the SLA period
mutableIssue.setCustomFieldValue(customField, slaDuration.toString())
issueManager.updateIssue(ComponentAccessor.getJiraAuthenticationContext().getLogg
edInUser(), mutableIssue, EventDispatchOption.DO_NOT_DISPATCH, false)
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.IssueInputParametersImpl
import com.atlassian.jira.bc.issue.IssueService
import com.atlassian.jira.issue.MutableIssue
if (issue.issueType.name == "Story") {
issueInputParameters.setProjectId(issue.getProjectObject().getId())
issueInputParameters.setParentIssueId(issue.getId())
issueInputParameters.setSummary(subTaskSummary)
issueInput
Certainly! Here are even more advanced ScriptRunner examples for Jira:
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.IssueInputParametersImpl
import com.atlassian.jira.bc.issue.IssueService
import com.atlassian.jira.issue.MutableIssue
if (issue.issueType.name == "Story") {
issueInputParameters.setProjectId(issue.getProjectObject().getId())
issueInputParameters.setParentIssueId(issue.getId())
issueInputParameters.setSummary(subTaskSummary)
issueInputParameters.setReporterId(issue.reporterId)
def validationResult = issueService.validateSubTaskCreate(user,
issueInputParameters)
if (validationResult.isValid()) {
issueService.create(user, validationResult)
} else {
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.link.IssueLinkManager
import com.atlassian.jira.bc.issue.IssueService
if (transitionValidationResult.isValid()) {
issueService.transition(user, transitionValidationResult)
} else {
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.project.ProjectComponent
if (selectedComponentName) {
def projectComponents =
componentManager.getComponents(issue.getProjectObject().id)
if (selectedComponent) {
issue.setComponent([selectedComponent] as Collection<ProjectComponent>)
```
Automatically sync the status between a parent issue and its sub-tasks.
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.bc.issue.IssueService
import com.atlassian.jira.issue.link.IssueLinkManager
if (issue.isSubTask()) {
if (transitionValidationResult.isValid()) {
issueService.transition(user, transitionValidationResult)
} else {
if (issue.status.name == "Done") {
if (subTask.status.name != "Done") {
if (transitionValidationResult.isValid()) {
issueService.transition(user, transitionValidationResult)
}
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
if (userName) {
if (userToWatch) {
watcherManager.startWatching(userToWatch, issue)
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.IssueInputParameters
import com.opensymphony.workflow.InvalidInputException
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.comments.CommentManager
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.IssueInputParametersImpl
import com.atlassian.jira.bc.issue.IssueService
import com.atlassian.jira.issue.link.IssueLinkManager
issueInputParameters.setProjectKey(projectKey)
issueInputParameters.setIssueTypeId(issueTypeId)
issueInputParameters.setReporterId(user.key)
if (validationResult.isValid()) {
if (createResult.isValid()) {
```
import com.atlassian.jira.component
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.bc.issue.IssueService
import com.atlassian.jira.issue.IssueInputParametersImpl
if (triggerValue == "Close") {
if (transitionValidationResult.isValid()) {
issueService.transition(user, transitionValidationResult)
}
```
Calculate and update the remaining estimate based on work log entries.
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.worklog.WorklogManager
issue.setEstimate(remainingEstimate)
issueManager.updateIssue(ComponentAccessor.getJiraAuthenticationContext().getLogg
edInUser(), issue, EventDispatchOption.DO_NOT_DISPATCH, false)
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.link.IssueLinkManager
import com.atlassian.jira.bc.issue.IssueService
if (linkedIssues.every { it.resolution }) {
if (transitionValidationResult.isValid()) {
issueService.transition(user, transitionValidationResult)
```
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.mail.Email
import com.atlassian.mail.server.SMTPMailServer
import com.atlassian.jira.issue.search.SearchProvider
import com.atlassian.jira.bc.issue.search.SearchService
import com.atlassian.jira.web.bean.PagerFilter
def mailServer =
ComponentAccessor.getMailServerManager().getDefaultSMTPMailServer()
email.setBody(emailBody)
mailServer.send(email)
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.MutableIssue
if (components) {
if (componentLead) {
issue.setAssignee(componentLead)
```
### 61. Auto-Close Resolved Issues After 7 Days
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.bc.issue.IssueService
import java.time.Instant
import java.time.temporal.ChronoUnit
if (transitionValidationResult.isValid()) {
issueService.transition(user, transitionValidationResult)
}
```
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.MutableIssue
def dueDateOffset = [
"Highest": 1,
"High": 3,
"Medium": 5,
"Low": 7,
"Lowest": 10
issue.setDueDate(dueDate)
```
### 63. Prevent Issue Deletion Based on Conditions
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.opensymphony.workflow.InvalidInputException
if (preventDeletion) {
```
Automatically set the issue security level based on the issue type.
```groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.security.JiraAuthenticationContext
def securityLevel =
securityLevelManager.getSecurityLevelByName(issue.getProjectObject().id,
securityLevelName)
issue.setSecurityLevelId(securityLevel.id)
```
Sync certain issue fields with an external system using REST API.
```groovy
import com.atlassian.jira.component.ComponentAccessor
import groovy.json.JsonBuilder
import groovyx.net.http.RESTClient
def issueManager = ComponentAccessor.getIssueManager()
def payload = [
issueKey: issue.key,
externalSystemId: externalSystemId,
summary: issue.summary,
status: issue.status.name