Dev Environment https://scriptrunner.adaptavist.com/latest/common/DevEnvironment.html
Questions:
https://answers.atlassian.com/questions/topics/753794/groovy-script-runner
rest post
http://mrhaki.blogspot.com/2009/03/use-restclient-to-post-and-read-xml.html
http://www.mkyong.com/webservices/jax-rs/restfull-java-client-with-java-net-url/
Transition variables: transientVars.comment as String for example
Condition: no outward links
Script workflow function : Simple scripted condition : Checks script:
issueLinkManager.getOutwardLinks(issue.getId()).size() < 1
Condition: no outward link with Link name "Release"
import com.atlassian.jira.issue.link.IssueLink
import com.atlassian.jira.ComponentManager
import org.apache.log4j.Category
issueLinkManager = ComponentManager.getInstance().getIssueLinkManager()
log = Category.getInstance("com.onresolve.jira.groovy.LinkedIssues")
int link_counter = 0
passesCondition = true
for (IssueLink link in issueLinkManager.getOutwardLinks(issue.getId())){
log.debug("Condition - check links by name debug : " + link.getIssueLinkType().getName())
if (link.getIssueLinkType().getName()=="Release"){
link_counter=link_counter+1
}
}
if (link_counter>0){
passesCondition = false
}
log.debug("Returning Condition: " + passesCondition)
Set component on issue creation:
import com.atlassian.jira.project.Project
import com.atlassian.jira.project.ProjectManager
import org.apache.log4j.Category
import com.atlassian.jira.ComponentManager
import com.atlassian.jira.bc.project.component.ProjectComponent
log = Category.getInstance("com.onresolve.jira.groovy.LinkedIssues")
log.error("Created issue key: " + issue.key)
ComponentManager componentManager = ComponentManager.getInstance()
Project project = issue.getProjectObject()
log.error("Created issue key: get project object ")
ProjectComponent component = componentManager.getProjectComponentManager().findByComponentName(project.getId(), "Releases")
log.error("Created issue key: get component object ")
issue.setComponents([component.getGenericValue()])
log.error("Created issue key: set component")
Grab value from the custom fields in the linked issues & set it to the custom field in the parent issue
import org.apache.log4j.Category
log = Category.getInstance("com.onresolve.jira.groovy.LinkedIssues")
log.debug("Grab configuration notes issue key : " + issue.key)
import com.atlassian.jira.ComponentManager
import com.atlassian.jira.issue.link.IssueLink
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.issue.fields.CustomField
linkMgr = ComponentManager.getInstance().getIssueLinkManager()
ComponentManager componentManager = ComponentManager.getInstance()
CustomFieldManager customFieldManager = componentManager.getCustomFieldManager()
CustomField cf= customFieldManager.getCustomFieldObject("customfield_10502")
CustomField confnt= customFieldManager.getCustomFieldObject("customfield_10903")
String confnotes = ""
for (IssueLink link in linkMgr.getOutwardLinks(issue.id)) {
def labEq = link.getDestinationObject().getCustomFieldValue(cf).toString()
if (labEq!="null") {
confnotes = confnotes + "\\[" + link.getDestinationObject().getKey().toString() + "\\] " + labEq + " \n\n"
}
}
issue.setCustomFieldValue(confnt, confnotes)
Postfunstion:
Take id from custom field (multiselect) - database custom field, contain id of bundle
Create JQL search like issue in fixedInBundle(2,4,6)
Link all issues from the results of jql search to the current issue
import com.atlassian.jira.ComponentManager
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.issue.fields.CustomField
import com.atlassian.jira.issue.link.IssueLink
import org.apache.log4j.Category
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.search.SearchProvider
import com.atlassian.jira.issue.search.SearchResults
import com.atlassian.jira.jql.parser.JqlQueryParser
import com.atlassian.jira.web.bean.PagerFilter
import com.atlassian.jira.issue.link.IssueLinkManager
import com.atlassian.crowd.embedded.api.User
String bundle_field_id = "customfield_10902"
Long link_id = 10003
log = Category.getInstance("com.onresolve.jira.groovy.LinkedIssues")
log.debug("Bundle link issue key: " + issue.key)
ComponentManager componentManager = ComponentManager.getInstance()
CustomFieldManager customFieldManager = componentManager.getCustomFieldManager()
CustomField cf= customFieldManager.getCustomFieldObject(bundle_field_id)
def value = issue.getCustomFieldValue(cf)
log.debug("Bundle link value of bundle: " + value)
String jql_query="issue in fixedInBundle("
for (String dd in value.tokenize("###")) {
log.debug("Bundle link value of budle id: " + dd.tokenize(". ")[0])
jql_query=jql_query+dd.tokenize(". ")[0]+","
}
jql_query=jql_query[0..-2]+")"
log.debug("Bundle link JQL query: " + jql_query)
def jqlQueryParser = ComponentAccessor.getComponent(JqlQueryParser)
SearchProvider searchProvider = ComponentAccessor.getComponentOfType(SearchProvider.class)
def issueManager = ComponentAccessor.getIssueManager()
def user = ComponentAccessor.getJiraAuthenticationContext().getUser()
def query = jqlQueryParser.parseQuery(jql_query)
SearchResults results = searchProvider.search(query, user, PagerFilter.getUnlimitedFilter())
IssueLinkManager issueLinkManager = ComponentAccessor.getIssueLinkManager()
authenticationContext = ComponentAccessor.getJiraAuthenticationContext()
currentUser = authenticationContext.getLoggedInUser()
results.getIssues().each {documentIssue ->
// if you need a mutable issue you can do:
def fissue = issueManager.getIssueObject(documentIssue.id)
// do something to the issue...
//log.error(fissue.summary)
// issueLinkManager.createIssueLink(issue.getId(), fissue.getId(), Long.parseLong("10003"), null, currentUser)
issueLinkManager.createIssueLink(issue.getId(), fissue.getId(), link_id, null, currentUser)
}
Post Function: Set custom field (select) from parent in sub-task
Put at Create Issue Transition, require follow order of Post-Functions:
Creates the issue originally.
Script workflow function : A custom script will be run:
from inline script.
Stores updates to an issue (no change history is created).
Re-index an issue to keep indexes in sync with the database.
import org.apache.log4j.Category
import com.atlassian.jira.ComponentManager
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.issue.fields.CustomField
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.ModifiedValue
import com.atlassian.jira.issue.customfields.option.Options
import com.atlassian.jira.issue.customfields.option.Option
import com.atlassian.jira.issue.util.DefaultIssueChangeHolder
import com.atlassian.jira.issue.util.IssueChangeHolder
IssueChangeHolder changeHolder = new DefaultIssueChangeHolder();
ComponentManager componentManager = ComponentManager.getInstance()
CustomFieldManager customFieldManager = componentManager.getCustomFieldManager()
CustomField cf= customFieldManager.getCustomFieldObject("customfield_10306")
log = Category.getInstance("com.onresolve.jira.groovy.LinkedIssues")
log.debug("Update sub-tasks field")
log.debug("Update sub-tasks field - created issue key: " + issue.key)
if (issue.isSubTask()) {
def parentIssue = issue.getParentObject();
log.debug("Update sub-tasks field - Parent issue key: " + parentIssue.getKey())
def sq = parentIssue.getCustomFieldValue(cf).toString()
log.debug("Update sub-tasks field - Parent field value " + sq.toString())
if (sq.toString()!="null") {
Options options = cf.getOptions(null, cf.getRelevantConfig(issue), null)
log.debug("Update sub-tasks field - options " + options)
Option newOption = options.getOptionForValue(sq, null)
log.debug("Update sub-tasks field - need option " + newOption)
ModifiedValue mVal = new ModifiedValue(issue.getCustomFieldValue(cf), newOption )
log.debug("Update sub-tasks field - Modified value " + mVal)
cf.updateValue(null, issue, mVal, changeHolder)
} else {
log.debug("Update sub-tasks field - empty parent field")
}
}
else {
log.debug("Update sub-tasks field - issue is not sub-task")
}
Update multi-user user picker field
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.issue.fields.CustomField
import com.atlassian.jira.user.ApplicationUser
CustomField multiUser = ComponentAccessor.getCustomFieldManager().getCustomFieldObjectByName("fieldName")
List<ApplicationUser> users = issue.getCustomFieldValue(multiUser)
users.add(ComponentAccessor.getUserManager().getUserByName("username"))
issue.setCustomFieldValue(multiUser, users);