Skip to main content
Book your demo
Example scripts
To homepage
Jira
Data centre icon
Data Center

Send Release Notes to Issue Stakeholders

Features
Listeners
Created 2 year(s) ago, Updated 2 month(s) ago
App in script
ScriptRunner For Jira
ScriptRunner For Jira
by Adaptavist
Compatibility
compatibility bullet
Jira (8.0 - 8.6)
compatibility bullet
ScriptRunner For Jira (5.6.14)
Language |
groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.event.project.VersionReleaseEvent
import com.atlassian.jira.bc.issue.search.SearchService
import com.atlassian.jira.web.bean.PagerFilter
import com.onresolve.scriptrunner.runner.customisers.WithPlugin
import com.onresolve.scriptrunner.runner.customisers.PluginModule
import com.metainf.jira.plugin.emailissue.api.EmailService
import com.metainf.jira.plugin.emailissue.api.EmailDefinitionApi
import com.metainf.jira.plugin.emailissue.action.EmailOptions
import org.apache.log4j.Level

log.setLevel(Level.INFO)

@WithPlugin("com.metainf.jira.plugin.emailissue")

@PluginModule EmailService emailService

// Get the released version from the associated event
final version = (event as VersionReleaseEvent).version
// Name of the template to use
final templateName = 'Release Notes - per reporter'

//Get reference to Jira API
def issueManager = ComponentAccessor.issueManager
def user = ComponentAccessor.jiraAuthenticationContext.loggedInUser
def searchService = ComponentAccessor.getComponent(SearchService)

// Find issues for the version being released
def jqlString = "fixVersion = ${version.id} ORDER BY issuetype, priority DESC, key ASC"
def parseResult = searchService.parseQuery(user, jqlString)
if (!parseResult.valid) {
    log.error("Invalid JQL: ${jqlString}")
    return
}

def searchResult = searchService.search(user, parseResult.query, PagerFilter.unlimitedFilter)
def issuesInVersion = searchResult.results.collect { issueManager.getIssueObject(it.id) }
log.info("Issues in version " + issuesInVersion)

// Group the issues by reporter
def issuesByReporter = issuesInVersion.groupBy { issue ->
    issue.reporter
}
log.info("Issues by reporter: ${issuesByReporter}")

// Loop through the reporters and send the list of their issues to them
issuesByReporter.each { reporter, reporterIssues ->
    if (!reporterIssues) {
        return
    }

    // Recipient is the reporter only, but other stakeholders could also receive the emails
    def recipientsTo = [reporter.emailAddress]
    // Compose parameters for Email This Issue
    def email = new EmailDefinitionApi()
    email.to = recipientsTo
    email.emailOptions = new EmailOptions()
    email.emailOptions.emailFormat = 'html'
    email.emailTemplate = templateName

    // Payload is a key-value pair to populate email templates
    def payload = [issues: reporterIssues, version: version, reporter: reporter]
    email.payload = payload

    // Send the email
    try {
        emailService.sendEmail(email)
    } catch (Exception e) {
        log.error("An exception was thrown: ${e.message}")
    }
}
Having an issue with this script?
Report it here