I have the following custom job script that works great. It grabs saved filters, parse the query, and save as a txt file to an issue as an attachment. However, I am parsing at least 3-4 filters, and I have some JQLs that run issueFunction addedAfterSprintStart.
//Job: Auto export saved filter
//Mapping: Sandbox issue
//Interval/Cron expression: 0 0 8 */14 * ? (for now, i Run Now to test)
import java.io.FileWriter
import java.io.BufferedWriter
import com.atlassian.jira.bc.issue.search.SearchService
import com.atlassian.jira.web.bean.PagerFilter
import com.atlassian.jira.jql.parser.JqlQueryParser
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.AttachmentManager
import com.atlassian.jira.issue.attachment.Attachment
def issueManager = ComponentAccessor.getIssueManager()
def currentUserObj = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser()
def searchService = ComponentAccessor.getComponent(SearchService)
def aM = ComponentAccessor.getAttachmentManager()
def pM = ComponentAccessor.getAttachmentPathManager()
def issue = issueManager.getIssueByCurrentKey("TEST-49") // where the export will attach too
def attachments = aM.getAttachments(issue)
def jqlQueryParser = ComponentAccessor.getComponent(JqlQueryParser)
def customFieldManager = ComponentAccessor.getCustomFieldManager()
//start with query
def queries = [
"Filter for TEST board",
"Filter for CAKE board",
"Issues Added to Sprint"] // jql: issueFunction in addedAfterSprintStart("TEST Board","Sprint 1")
queries.each { filterName ->
//set up stringbuilder for later, define headers
StringBuilder builder = new StringBuilder()
builder.append("Summary|Key|Issue Type|Status|Fix Version|Priority|Radio Button Field|Epic Link|Last Sprint|Story Points|Checkbox Field|Team|Description|Resolved Date\n")
def issueCounter = 0
def query = jqlQueryParser.parseQuery("filter = '${filterName}'")
def results = searchService.search(currentUserObj, query, PagerFilter.getUnlimitedFilter())
def resultCount = results.getTotal()
//ensure query returns issues
if(resultCount == 0){
log.warn("No issues found in query.")
} else {
for (def result : results.getResults()){
//get field values
def summary = result.summary
def key = result.key
def issueType = result.issueType.name
def status = result.status.getName()
def fixversionField = result.fixVersions.size()>0 ? result.fixVersions.toString() : ""
def fixversion = fixversionField.toString().replace("[","").replace("]","")
def priority = result.priority?.name
def radioField = customFieldManager.getCustomFieldObjectsByName("Radio Button Custom Field").getAt(0)
def radio = result.getCustomFieldValue(radioField) != null ? result.getCustomFieldValue(radioField).toString() : ""
def epic = result.getEpicName() != null ? result.getEpicName() : ""
def sprint = result.sprints != null ? result.sprints.collect { it.name }.toString().replace("[","").replace("]","") : "Backlog"
def spField = customFieldManager.getCustomFieldObjectsByName("Story Points").getAt(0)
def sp = result.getCustomFieldValue(spField) != null ? result.getCustomFieldValue(spField).toString() : ""
def checkboxField = customFieldManager.getCustomFieldObjectsByName("Checkbox Custom Field").getAt(0)
def checkbox = result.getCustomFieldValue(checkboxField) != null ? result.getCustomFieldValue(checkboxField).toString().replace("[", "").replace("]", " ") : ""
def teamField = customFieldManager.getCustomFieldObjectsByName("Custom Team").getAt(0)
def team = result.getCustomFieldValue(teamField) != null ? result.getCustomFieldValue(teamField).toString().replace("[","").replace("]","") : ""
def description = result.getDescription().toString().replace("\n",". ").replace("\r",". ").replace("|",";")
def resolved = result.getResolutionDate().toString()
//append the rows with jira info
builder.append(summary + "|")
builder.append(key + "|")
builder.append(issueType + "|")
builder.append(status +"|")
builder.append(fixversion + "|")
builder.append(priority + "|")
builder.append(radio + "|")
builder.append(epic + "|")
builder.append(sprint + "|")
builder.append(sp + "|")
builder.append(checkbox + "|")
builder.append(team + "|")
builder.append(description + "|")
builder.append(resolved + "\n")
issueCounter++
}
//create new blank file with current date
def date = new Date().toLocalDate()
def newFileName = ("sprint-export-" + date.toString() + "-" + filterName + ".txt")
File outFile = new File("/tmp/" + newFileName)
outFile.createNewFile()
outFile.setWritable(true,false)
outFile.setReadable(true,false)
outFile.setExecutable(true,false)
//write builder content into file
BufferedWriter fileWriter = new BufferedWriter(new FileWriter(outFile))
try {
fileWriter.write(builder.toString())
} catch(Exception e){
log.error("I/O Exception")
} finally {
fileWriter.close()
}
//attach file to issue
issue.addAttachment(outFile)
log.warn("Total issues: " + issueCounter)
log.warn("File attached to " + issue + ": " + newFileName)
}
}
The job doesn't parse each issue in filter "Issues Added to Sprint". So the export that is saved doesn't show the real total results (the search results will return 70+ but the export only got 62). How do I get Jobs to make sure it parses each issue?
In my logs, they successfully ran within 4 seconds.