Hello,
I have a very interesting issue I'm running into, and for the life of me, can't figure out why it's happening.
I have an any to all transition in a workflow that runs a scriptrunner script, the script looks at two fields, depending on the values of those fields, it will do the following:
Afterwards it'll update the summary on the work item that invoked the transition in the first place as well as update one of the custom fields.
This works great if I have linked work items with the inward link of "parent of", but if I have another linked work item with the outward link of "child of" (same link type), the script will go through the linked items step, update those, then just not do anything further.
I've tried it with different link types with some hit & miss results, but mostly it's when it's the same link type that the issue happens.
My script is below, any and all help is greatly appreciated!
def eventIssue = Issues.getByKey(issue.key as String)
def newDeploymentPackageVersionNumber = eventIssue.getCustomFieldValue("New Deployment Package Version Number")
def deploymentPackageVersionNumber = eventIssue.getCustomFieldValue("Deployment Package Version Number")
def eventIssueOriginalSummary = eventIssue.summary
def eventIssueUpdatedSummary = eventIssueOriginalSummary.replaceAll(deploymentPackageVersionNumber, newDeploymentPackageVersionNumber)
def errors = []
logger.info("My deployment package version number is: ${deploymentPackageVersionNumber.toString()}")
logger.info("My NEW deployment package version number is: ${newDeploymentPackageVersionNumber.toString()}")
logger.info("My current summary is: ${eventIssueOriginalSummary.toString()}")
logger.info("My updated summary is: ${eventIssueUpdatedSummary.toString()}")
try {
def successStatusByIssueKey = eventIssue.getLinks().each { linkedIssue ->
if (linkedIssue.inwardIssue.fields.issuetype.name == 'Audit' && linkedIssue.type.inward == 'parent of'){
try{
def linked_issue = Issues.getByKey(linkedIssue.inwardIssue.key as String)
def originalSummary = linked_issue.summary
def updatedSummary = originalSummary.replaceAll(deploymentPackageVersionNumber, newDeploymentPackageVersionNumber)
linked_issue.update {
setSkipScreenCheck(true)
setCustomFieldValue("New Deployment Package Version Number", newDeploymentPackageVersionNumber)
setCustomFieldValue("Deployment Package Version Number", deploymentPackageVersionNumber)
setLabels("release-standard-testing-${newDeploymentPackageVersionNumber}")
setSummary(updatedSummary)
}
}
catch (Exception e) {
errors.add("The ${linkedIssue.inwardIssue.key} ${originalSummary} failed to update, the error is: ${e.message}")
return
}
}
}
}
catch (Exception e) {
errors.add("The linked ticket failed to parse, the error is: ${e.message}")
return
}
try {
eventIssue.update {
setCustomFieldValue("Deployment Package Version Number", newDeploymentPackageVersionNumber)
setSummary(eventIssueUpdatedSummary)
}
}
catch (Exception e) {
errors.add("The ICM ticket failed to update, the error is: ${e.message}")
return
}
if (!errors.isEmpty()){
eventIssue.addComment(errors.join("\n\n"))
}
Found the issue!
I needed to do an "exists" check on the inwardIssue before line 15's IF. The corrected code is below:
def eventIssue = Issues.getByKey(issue.key as String)
def newDeploymentPackageVersionNumber = eventIssue.getCustomFieldValue("New Deployment Package Version Number")
def deploymentPackageVersionNumber = eventIssue.getCustomFieldValue("Deployment Package Version Number")
def eventIssueOriginalSummary = eventIssue.summary
def eventIssueUpdatedSummary = eventIssueOriginalSummary.replace(deploymentPackageVersionNumber, newDeploymentPackageVersionNumber)
def errors = []
logger.info("My deployment package version number is: ${deploymentPackageVersionNumber.toString()}")
logger.info("My NEW deployment package version number is: ${newDeploymentPackageVersionNumber.toString()}")
logger.info("My current summary is: ${eventIssueOriginalSummary.toString()}")
logger.info("My updated summary is: ${eventIssueUpdatedSummary.toString()}")
try {
def successStatusByIssueKey = eventIssue.getLinks().each { linkedIssue ->
if (linkedIssue.inwardIssue){ // this is what was missing
if (linkedIssue.inwardIssue.fields.issuetype.name == 'Audit' && linkedIssue.type.inward == 'parent of'){
try{
def linked_issue = Issues.getByKey(linkedIssue.inwardIssue.key as String)
def originalSummary = linked_issue.summary
def updatedSummary = originalSummary.replace(deploymentPackageVersionNumber, newDeploymentPackageVersionNumber)
linked_issue.update {
setSkipScreenCheck(true)
setCustomFieldValue("New Deployment Package Version Number", newDeploymentPackageVersionNumber)
setCustomFieldValue("Deployment Package Version Number", deploymentPackageVersionNumber)
setLabels("release-standard-testing-${newDeploymentPackageVersionNumber}")
setSummary(updatedSummary)
}
}
catch (Exception e) {
logger.info("The ${linkedIssue.inwardIssue.key} ${originalSummary} failed to update, the error is: ${e.message}")
errors.add("The ${linkedIssue.inwardIssue.key} ${originalSummary} failed to update, the error is: ${e.message}")
return
}
}
}
}
}
catch (Exception e) {
logger.info("The linked ticket failed to parse, the error is: ${e.message}")
errors.add("The linked ticket failed to parse, the error is: ${e.message}")
return
}
try {
eventIssue.update {
setCustomFieldValue("Deployment Package Version Number", newDeploymentPackageVersionNumber)
setSummary(eventIssueUpdatedSummary)
}
}
catch (Exception e) {
logger.info("The ICM ticket failed to update, the error is: ${e.message}")
errors.add("The ICM ticket failed to update, the error is: ${e.message}")
return
}
if (!errors.isEmpty()){
eventIssue.addComment(errors.join("\n\n"))
}
Hi Pierre,
Can you please raise this as a request with the ScriptRunner support team here.
The ScriptRunner support team will be able to look at examples of when this behaviour occurred and help you with this issue.
Regards,
Kristian
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.